微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JMS 会话创建失败

如何解决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 分钟),并且长时间运行的事务是一种反模式,因此不鼓励使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。