1

私は、このユースケースを得た:java MDBで例外を処理する最善の方法はどれですか?

この図は、エンタープライズモデルを表しています。 Weblogic 10.3のJava EEテクノロジは、IoCとAOPのためのSpringフレームワークの活用、Springのjpatemplateによる永続性のためのJPA、対話フレームのバネ統合を備えています。 春の統合により、必要なすべての魔法の砂糖が追加されるため、サービスとゲートウェイの間にカップリングはありません。

私は例外処理に取り組まなければなりません。すべてのチェーンにはチェック例外はありません。jpatemplateは実行時例外ですべてのSQL例外をラップするため、データアクセスにはチェック例外はありません。

だから私だけは私がチェーンの一部のコンポーネントに例えばNPEを取得する場合、メッセージがJMSキューとにロールバックされていることに気づいたMDB

@Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void onMessage(Message message) { 
     try { 
      TextMessage textMessage = (TextMessage) message; 
      String stringMessage = textMessage.getText(); 

      OnlineEventMessage<? extends Serializable> event = eventMessageParser.parse(stringMessage); 

      legacyEventMessageService.handle(event); 
     } catch (JMSException e) { 
      logger.error("si e' verificato un errore JMS nel processamento dell'evento {}", message, e); 
     } 
    } 

上にあるハンドルの例外をチェックしますプロセスはループバックされます。

このシナリオで例外を処理する最善の方法はどれですか? すべてのruntimeExceptionsをMDBでキャッチしますか?

種類は、このシナリオで例外を処理するための最良の方法です マッシモ

答えて

1

に関しては?すべてのruntimeExceptionsをMDBでキャッチしますか?

これは達成したいことによって異なります。あなたの説明から、メッセージがロールバックされないようにしたいと感じる場合。そうですか?

この場合、すべての実行時例外をキャッチすると、これまでのところしか得られません。システムはまた、あなたがそれをキャッチしないエラーをスローする可能性があります。だからあなたはThrowableを捕まえる必要があります。しかし、トランザクションがタイムアウトしてロールバックが発生する可能性があります。

要するに、MDBをトランザクションにしたいのですか?

また、送信者からのトランザクションコンテキストがMDBに伝播しないことにも注意してください。

トピックが少し離れていますが、本当にjpatemplateが必要ですか? SpringSource自身も含めて、JPA APIはそれ自体で問題なく、Springからの「拡張」を必要としないということは誰もが同意しているようです。

+0

私はトピックからあなたのコメントを気付き、jpatemplateの代わりにjpaを使用することのトレードオフは何か疑問に思っていました。 –

+1

JPA APIは、Springのテンプレートから多少の利益を得る他のAPIとは異なり、すでによく設計された最新のAPIです。 jpatemplateを使用することによるトレードオフは、APIを必要としない別のAPIを使用していることです。私は利益を考えることができないし、そのためにトレードオフのようには思えません。 –

関連する問題