JMS 会话创建失败

JMS Session Creation Failure

在 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 分钟),并且长运行 事务是一种反模式,因此不鼓励。