6

WebSphere6にMDBがあります。MessageListenerはTibcoEMSキューにリンクされています。MDBで、WebSphereMQキューに書き込もうとしています。次のエラーが発生します。

WMSG0042I: MDB Listener LoanIQ Payments Inbound started successfully for JMSDestination jms/eid/payments
WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.
WTRN0086I: XAException encountered during prepare phase for transaction 00000131...0001. Local resources follow.
WTRN0089I: XATransactionWrapper@ 3fbe3fbe  XAResource: com.ibm.ejs.jms.JMSManagedSession$JMSXAResource@3fb83fb8  enlisted: true  mcWrapper.hashCode()1038237154: Vote: commit.
WTRN0089I: LocalTransactionWrapper@:4e2e4e2e  LocalTransaction:com.ibm.ejs.jms.JMSManagedSession$JMS LocalTransaction@4e5a4e5a  enlisted:true  registeredForSynctruemcWrapper.hashcode()1032076676: Vote: none.

QueueConnectionFactoryインスタンスはcom.ibm.ejs.jms.JMSQueueConnectionFactoryHandleです。これからXAConnectionを取得できますか?する必要がありますか?可能であれば、バニラJMSを使用したいと思います。

MDBの実装は次のようなものです。

public void onMessage(Message message) {
    // ^^ incoming message delivered from EMS queue via WAS MessageListener
    TextMessage textMessage = (TextMessage) message;
    QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup(factoryName);
    Queue queue = (Queue) context.lookup(queueName);
    QueueConnection connection = factory.createQueueConnection();
    connection.start();
    QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    QueueSender sender = session.createSender(queue);
    TextMessage message = session.createTextMessage("some new payload");
    sender.send(message);
    // ^^ outgoing message sent to WebSphere MQ queue
}
4

2 に答える 2

7

エラーを見ると、1つのXAリソースと1つのJCALocalTransactionがあります

WTRN0089I:XATransactionWrapper @ 3fbe3fbe XAResource:com.ibm.ejs.jms.JMSManagedSession $ JMSXAResource @ 3fb83fb8入隊:true mcWrapper.hashCode()1038237154:投票:コミット。

WTRN0089I:LocalTransactionWrapper @:4e2e4e2e LocalTransaction:com.ibm.ejs.jms.JMSManagedSession $ JMS LocalTransaction@4e5a4e5a enlisted:true registeredForSynctruemcWrapper.hashcode()1032076676:投票:なし。

ConnectionFactoryをXA対応に設定していないようです。以下を参照してください。

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/umj_pjcfm.html

(「XA有効」までスクロールダウン)またはTibcoEMS接続がXA対応ではありません。後者で、適切なXAドライバーがない場合は、WASインフォセンターの最終参加者サポートを確認できます。これにより、必要な処理が実行される可能性があります。つまり、WASはWMQ XAトランザクションを準備し、ローカルでTibcoをコミットしてから、コミットします。 Tibcoコミットが機能した場合はWMQ(またはそれ以外の場合はロールバック)。Tibco接続がXA対応の場合、WASにはWMQの完全なXAサポートが組み込まれているため、操作全体で2フェーズトランザクションを使用しない理由はありません。

それにかんする

QueueConnectionFactoryインスタンスは、com.ibm.ejs.jms.JMSQueueConnectionFactoryHandleです。これからXAConnectionを取得できますか?する必要がありますか?可能であれば、バニラJMSを使用したいと思います。

これを行うべきではなく、単純なJMSを維持するだけです。スタイルの一般的なポイントとして、ConnectionFactory(QueueConnectionFactoryではなく)にもキャストしてから、クロスドメインオブジェクト(Connection、Session、MessageProducer)をそのまま使用することをお勧めします。

于 2011-07-27T07:14:31.707 に答える
1

私も同じ問題を抱えていました。キュー、QCF、およびACを構成しましたが、メッセージを受信した後、トランザクションがロールバックされ、DB更新も失敗していました。@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)onMessageメソッドを追加しました。

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void onMessage(Message message) {//Logic }

それが誰かを助けることを願っています。私のは、メッセージを聞くためのMDBを備えたWAS7です。

`

于 2017-01-20T09:41:32.773 に答える