非法尝试使用现有的两阶段资源提交单阶段资源

Posted

技术标签:

【中文标题】非法尝试使用现有的两阶段资源提交单阶段资源【英文标题】:An illegal attempt to commit a one phase capable resource with existing two phase capable resources 【发布时间】:2011-10-13 23:37:00 【问题描述】:

我在 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

【问题讨论】:

【参考方案1】:

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

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

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

`

【讨论】:

【参考方案2】:

查看错误,您有一个 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)。

【讨论】:

MQ 已启用 XA。似乎EMS驱动程序不是。 Enabling LPS 工作。谢谢。 此处可找到启用 LPS 的链接。 www-01.ibm.com/support/docview.wss?uid=swg21244805

以上是关于非法尝试使用现有的两阶段资源提交单阶段资源的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务2种协议 及 4种模式

两阶段提交协议的 ACID 是怎样的?

分布式事物之 xa协议两阶段提交

关于分布式事务两阶段提交一阶段提交Best Efforts 1PC模式和事务补偿机制的研究[转]

关于分布式事务两阶段提交一阶段提交Best Efforts 1PC模式和事务补偿机制的研究[转]

敲黑板画重点:七种常见“分布式事务”详解!