Недопустимая попытка передать однофазный ресурс с существующими двухфазными ресурсами - PullRequest
6 голосов
/ 27 июля 2011

У меня есть MDB в WebSphere 6. MessageListener связан с очередью Tibco EMS. В MDB я пытаюсь записать в очередь WebSphere MQ. Я получаю следующую ошибку:

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
}

Ответы [ 2 ]

7 голосов
/ 27 июля 2011

Глядя на ошибку, у вас есть один ресурс XA и одна JCA LocalTransaction

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 зачислено: true зарегистрированныйForSynctruemcWrapper.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 Enabled») или соединение Tibco EMS не поддерживает XA. Если это последний вариант, и нет подходящего драйвера XA, то вы можете посмотреть поддержку последнего участника в инфоцентре WAS, которая может сделать то, что вам нужно - то есть WAS подготовит транзакцию WMQ XA, локально зафиксирует Tibco, а затем зафиксирует WMQ, если фиксация Tibco сработала (или произойдет откат в противном случае). Если соединение Tibco поддерживает XA, то в WAS встроена полная поддержка XA для WMQ, поэтому нет причин не использовать двухфазную транзакцию для всей операции.

Относительно

Экземпляр QueueConnectionFactory является com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle. Могу ли я получить XAConnection от этого? Нужно ли мне? Я бы предпочел остаться с ванильным JMS, если это возможно.

Вы не должны этого делать, просто придерживайтесь простого JMS. В качестве общей точки стиля лучше также приводить к ConnectionFactory (не QueueConnectionFactory), а затем использовать междоменные объекты (Connection, Session, MessageProducer).

1 голос
/ 20 января 2017

У меня была такая же проблема.Я настроил свою очередь, QCF и AC, но после того, как я получил сообщение, транзакция откатывалась и обновление БД также не удавалось.Я добавил @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) в методе onMessage.

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

Надеюсь, это кому-нибудь поможет.Мой WAS 7 с MDB для прослушивания сообщения.

`

...