java - 由于使用两个消息驱动器Bean更新同一表而导致的超时导致事务结束

标签 java ejb

我正在使用两个消息驱动器Bean(MDB)更新同一张表。我正在使用EJB 3.0并将事务类型用作

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

有时,其中一种方法会出现错误,例如“事务因超时而终止”,并且MDB被停用。因此,我必须重新启动服务器。

我可以使用任何其他类型的事务属性@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)来避免超时错误吗?

这是我的堆栈跟踪。

[:] CWWMQ0007W: The message endpoint Rsme#RsmeEJB.jar#GemsInqMDB has been paused by the system. Message delivery failed to the endpoint more than 0 times. The last attempted delivery failed with the following error: javax.ejb.EJBTransactionRolledbackException: Transaction rolled back; nested exception is: javax.transaction.TransactionRolledbackException: Transaction is ended due to timeout javax.transaction.TransactionRolledbackException: Transaction is ended due to timeout at com.ibm.tx.jta.impl.EmbeddableTranManagerImpl.completeTxTimeout(EmbeddableTranManagerImpl.java:62) at com.ibm.tx.jta.impl.EmbeddableTranManagerSet.completeTxTimeout(EmbeddableTranManagerSet.java:85) at com.ibm.ejs.csi.TransactionControlImpl.completeTxTimeout(TransactionControlImpl.java:1347) at com.ibm.ejs.csi.TranStrategy.postInvoke(TranStrategy.java:242) at com.ibm.ejs.csi.TransactionControlImpl.postInvoke(TransactionControlImpl.java:579) at com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4843) at com.maybank.meaa.local.EJSLocal0SLMeaaEntityBean_877f3cd5.insertPD003Result(EJSLocal0SLMeaaEntityBean_877f3cd5.java) at com.maybank.meaa.mdbs.GemsInqMDB.onMessage(GemsInqMDB.java:75) at com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1163) at com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:842) at $Proxy27.onMessage(Unknown Source) at com.ibm.mq.connector.inbound.MessageEndpointWrapper.onMessage(MessageEndpointWrapper.java:131) at com.ibm.mq.jms.MQSession$FacadeMessageListener.onMessage(MQSession.java:147) at com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2665) at com.ibm.mq.jms.MQSession.run(MQSession.java:862) at com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:279) at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:608) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650) javax.ejb.EJBTransactionRolledbackException: Transaction rolled back; nested exception is: javax.transaction.TransactionRolledbackException: Transaction is ended due to timeout Caused by: javax.transaction.TransactionRolledbackException: Transaction is ended due to timeout at com.ibm.tx.jta.impl.EmbeddableTranManagerImpl.completeTxTimeout(EmbeddableTranManagerImpl.java:62) at com.ibm.tx.jta.impl.EmbeddableTranManagerSet.completeTxTimeout(EmbeddableTranManagerSet.java:85) at com.ibm.ejs.csi.TransactionControlImpl.completeTxTimeout(TransactionControlImpl.java:1347) at com.ibm.ejs.csi.TranStrategy.postInvoke(TranStrategy.java:242) at com.ibm.ejs.csi.TransactionControlImpl.postInvoke(TransactionControlImpl.java:579) at com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4843) at com.maybank.meaa.local.EJSLocal0SLMeaaEntityBean_877f3cd5.insertPD003Result(EJSLocal0SLMeaaEntityBean_877f3cd5.java) at com.maybank.meaa.mdbs.GemsInqMDB.onMessage(GemsInqMDB.java:75) at com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1163) at com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:842) at $Proxy27.onMessage(Unknown Source) at com.ibm.mq.connector.inbound.MessageEndpointWrapper.onMessage(MessageEndpointWrapper.java:131) at com.ibm.mq.jms.MQSession$FacadeMessageListener.onMessage(MQSession.java:147) at com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2665) at com.ibm.mq.jms.MQSession.run(MQSession.java:862) at com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:279) at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:608) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650) .

最佳答案

创建具有相同结构的两个不同表以避免死锁,而不是对两个MDB使用相同表

关于java - 由于使用两个消息驱动器Bean更新同一表而导致的超时导致事务结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502939/

相关文章:

java - 如果我从另一个类获得 AsyncTask 类的结果,则不会显示 ProgressDialog

java - 在 Java 中创建复制现有的 Excel 文件

java - 我如何在Android中停止线程

java - 由于字节表示不同,来自 NumberFormat 的字符串文字和字符串的等于失败

java - EJB QL 中不区分大小写的搜索

java - InitialContext.doLookup 两次调用 Bean 的构造函数

java - 抽象类上的 EJB 注入(inject)

java - Java数学函数的精度

java - 无法使用线程对 EJB 主题实现负载测试

java - EJB 属性文件