JMS 会话创建失败

问题描述

在 JBOSS EAP 7.3 高度事务性应用程序中,当数据负载越来越大时,我们会遇到以下异常。

Caused by: javax.ejb.EJBException: javax.jms.JMSException: Could not create a session: IJ000457: Unchecked throwable in managedConnectionReconnected()
Caused by: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@3915e409[state=norMAL managed connection=org.hornetq.ra.hornetqRAManagedConnection@7d6bcd06 connection handles=0 lastUse=1494579251303 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.PoolByCri@691085ec mcp=SemaphoreArrayListManagedConnectionPool@66a127f5[pool=hornetqConnectionDeFinition] xaResource=XAResourceWrapperImpl@56a9bb4[xaResource=org.hornetq.ra.hornetqRAXAResource@4ca920eb pad=false overrideRmValue=null productName=hornetq productVersion=2.0 jndiName=java:/JmsXA] txSync=null]
  at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:780)
  at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:518)
  at org.hornetq.ra.hornetqRASessionFactoryImpl.allocateConnection(hornetqRASessionFactoryImpl.java:948)
   ... 261 more
Caused by: javax.resource.ResourceException: IJ000461: Could not enlist in transaction on entering Meta-aware object
  at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:551)
  at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:775)
   ... 263 more
Caused by: javax.transaction.SystemException: IJ000356: Failed to enlist: java.lang.Throwable: Unabled to enlist resource,see the prevIoUs warnings. tx=TransactionImple < ac,BasicAction: 0:ffff0a0001c3:682851c6:5900737b:dd09939 status: ActionStatus.ABORT_ONLY >
  at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener$TransactionSynchronization.checkEnlisted(TxConnectionListener.java:848)
  at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.enlist(TxConnectionListener.java:383)
  at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:544)
   ... 264 more 

所有消息都由 EJB 使用池化连接工厂和事务模式 XA 发送,并且事务中还涉及 Oracle XA 数据库连接。我们正在注意关闭所有资源,如连接、会话和生产者在 finally 块中,包括空检查,看起来我们没有资源泄漏。

什么可能导致此异常,是否是写入消息日志的磁盘性能低?

解决方法

这很可能是由 EJB 甚至尝试获取 JMS 连接之前的事务超时引起的。超时将事务标记为“仅中止”,这意味着对事务完成的任何工作基本上都会失败。

当您的 EJB 尝试从 JCA 管理的连接池获取 JMS 连接时,容器将自动尝试在正在进行(但已中止)的事务中登记该连接。由于事务被标记为“仅中止”,因此此操作失败。

回顾您的日志,您应该会看到导致事务中止的证据。如果确实是超时,您会看到如下内容:

ARJUNA012095: Abort of action id 0:ffffac10040a:2eba2cc3:53ee68d4:5b013c invoked while multiple threads active within it.

请记住,虽然可以增加事务超时,但默认超时已经是 300 秒(即 5 分钟),并且长时间运行的事务是一种反模式,因此不鼓励使用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...