2016-11-21 12 views
2

最近、同僚をサポートして、システムテストがワイルドフライで渡されない理由と、weblogicとglass fishで一貫して通過するシステムテストを確認しました。Wildfly 10 jmsは、XAトランザクションの一部としてメッセージをキューに送ります。

ログを分析した後、バックアップされたスレッドによって送信されたJMSメッセージが、あまりにもすぐにキューにコミットされることに関連していることが明らかになりました。 MDBがコミットします。したがって、メッセージを送信するMDBが実行される前にメッセージが出ています。

のWebLogicでは、期待される動作を達成するために、あなたはXAが設定されているコンテナによって与えられた接続ファクトリを取るとき、あなたは=真と 承認取引 とconnection.createseesionを設定することを確認する必要があります=セッションが処理されました。自動上記のスニペットを除き、このURL http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-asに示したものと同様の処理で

が設定され、最初のパラメータが偽に設定されている確認します。

weblogicとglassfishのコンフィグレーションを使用すると、何もコミットされず、送信されたJMSメッセージがロールバックされるようにシステムが動作します。

上記の例のような構成を使用する場合、代わりに、JMSメッセージがただちに発生し、プロデューサトランザクションが実際に終了する前にコンシューマMDBが即座にトリガリングされ、システムテストが失敗します。

公式のJMS構成によれば、トランザクション= XA属性で接続プールされたファクトリを使用すると、コンテナはトランザクションのコミットをすぐに親トランザクションのライフサイクルにバインドする必要があります。

特に、Java:/ JmsXa接続ファクトリに関する公式のドキュメントを参照してください。

https://docs.jboss.org/author/display/WFLY10/Messaging+configuration

私の同僚は、最初は非プールされた接続ファクトリを使用していたが、注入情報の参照はそれ以来修正されました。私は流しのメッセージで可能なすべてのパラメータの組み合わせを試しましたが、私の結果はシットルです: どちらか早すぎるか送信されません。

他のすべてのリソースはXAであると判断します。すなわち、oracle dbはXAドライバを使用しています。

親トランザクションコミットが機能している場合にのみ、JMSメッセージを送信することができますか?そうであれば、セッションの設定方法は誰でも確認できますか?

私の同僚が、キューからメッセージを消費するためにメンズ自身が使用する接続ファクトリの設定に関して間違いを犯していないかどうかを確認します。大きな問題です。

答えて

1

したがって、問題は修正されています。

トランザクション終了時のキューへのJMSメッセージのコミットは完全に機能します。

問題は2倍でした: (a)コードの最初のスポット私は問題を見ていた問題は正しくありませんでした。誰かが独自のsend telegramをAPIのキューに書き込むことにしましたが、尖った電信のために中央APIを使用していなかったので、注入接続ファクトリへの変更は実際には効力を生じませんでした。古い接続工場はまだ使用されていました。

(b)正しいAPIが見つかったら、上記のポストで述べたwidlfy XAプール接続ファクトリを使用して、メカニズムを簡単に動作させることができました。 調整されたことの1つは接続でした。作成セッションapi。

JEE 7のAPIが拡大されてきた、今より良い1が何をすべきXAトランザクションの一部としてコンテナにJMSメッセージを送信するにはJEE 6 よりも文書化されている:どのなし connection.createSession()パラメーター。

これは簡単接続のJavadocに見ることができる。

https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html

QUOTE 1:

このメソッドは、メソッドのCreateSession取って代わられている( sessionModeをINT)同じを指定します1つの 引数を使用して情報を取得し、Javaの EE JTAトランザクションで使用するcreateSession()メソッドを使用します。アプリケーションでは、これらのメソッドの代わりに を使用することを検討する必要があります。

QUOTE 2:進行中のアクティブなJTA トランザクションがあるのJava EE WebまたはEJBコンテナでは、

Both arguments transacted and acknowledgeMode are ignored. The session will participate in the JTA transaction and will be committed 

またはロールバックは、そのトランザクションがコミットされたときセッションのコミットまたはロールバックメソッドを呼び出すことによって ではなく、ロールバックすることができます。 引数は両方とも無視されるため、このメソッドの代わりに引数を持たない createSession()を使用することをお勧めします。意味

、内のコードスニペット: http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as

は適切ではありません。何がすべきかは、パラメータなしでセッションを作成し、残りの部分をコンテナで処理することです。 それはまあまあです。

関連する問題