リスナ・メソッドからMessageSenderを利用する
Queue1のメッセージを編集してQueue2に書き込むアプリケーションがあったとします。
名前 | 設定 | 処理 |
---|---|---|
sender1 | jms-outbound-1.dicon | メッセージをQueue1に送信する |
sender2 | jms-outbound-2.dicon | メッセージをQueue2に送信する |
listener | jms-inbound.dicon | Queue1のメッセージを受取り、編集してsender2に渡す |
これを1つのリソースアダプターでやろうとしたら最後のsender2がコネクションを取得するところでエラーとなりました(XAException)。エラーは「XA 操作が失敗しました。errorCode を参照してください」とのことなのでerrorCodeを調べたらXAER_RMERR(-3)で「トランザクションブランチでリソースマネージャエラーが発生しました。」ということらしいですがよく分かりません。。。
sender2だけ別のリソースアダプタにしてみたら上手くいったのですが、ログでいうと
DEBUG 2007-08-30 19:52:08,318 [pool-1-thread-1] 物理コネクションをオープンしました.物理コネクション=[Physical Session -> nullPhysical Connection com.ibm.mq.jms.MQXAConnection@1836aeaSuper -> com.sun.genericra.outbound.ManagedConnection@e0420b]
DEBUG 2007-08-30 19:52:08,365 [pool-1-thread-1] コネクションがトランザクションに関連づけられました.物理コネクション=[Physical Session -> com.ibm.mq.jms.MQSession@1549cebPhysical Connection com.ibm.mq.jms.MQXAConnection@1836aeaSuper -> com.sun.genericra.outbound.ManagedConnection@e0420b] トランザクション=FormatId=4360, GlobalId=1188471081592/1, BranchId=
の1行目までは同じなので、2行目のコネクションとトランザクションの関連づけで失敗しているっぽいです。
インバウンド通信とアウトバウンド通信では別のリソースアダプタを用意した方が無難なのでしょうかね。
追記:と思ったらそうでもなくて、Queue2だけでなくてQueue3にもsender3使って何かを送信するとするならsender2とsender3も別のリソースアダプタでないとダメみたいです。