6

我在 WebSphere 6 中有一个 MDB。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
}
4

2 回答 2

7

查看错误,您有一个 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 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”)或 Tibco EMS 连接不支持 XA。如果是后者,并且没有合适的 XA 驱动程序,那么您可以查看 WAS 信息中心中的 Last-Participant 支持,这可能会满足您的需求 - 即 WAS 将准备 WMQ XA 事务,本地提交 Tibco,然后提交如果 Tibco 提交有效(否则回滚),则为 WMQ。如果 Tibco 连接支持 XA,那么 WAS 对内置的 WMQ 具有完整的 XA 支持,因此没有理由不对整个操作使用两阶段事务。

关于

QueueConnectionFactory 实例是 com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle。我可以从中获得 XAConnection 吗?我需要吗?如果可能的话,我更愿意使用香草 JMS。

您不应该这样做,只需保持简单的 JMS 即可。作为一般风格点,最好也转换为 ConnectionFactory(而不是 QueueConnectionFactory),然后保留跨域对象(Connection、Session、MessageProducer)。

于 2011-07-27T07:14:31.707 回答
1

我遇到过同样的问题。我已经配置了队列、QCF 和 AC,但是在收到消息后,事务正在回滚并且数据库更新也失败了。我添加@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)了 onMessage 方法。

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

希望它可以帮助某人。我的是带有 MDB 的 WAS 7 来收听消息。

`

于 2017-01-20T09:41:32.773 回答