无法创建连接:javax.resource.ResourceException:IJ000460:检查事务时出错

Connection could not be created: javax.resource.ResourceException: IJ000460: Error checking for a transaction

我们在 MDBClient class 中获取 ActiveMQConnection 时出现以下异常:

[org.apache.activemq.ra.ActiveMQConnectionFactory:100] (default-threads - 8) Connection could not be created:: javax.resource.ResourceException: IJ000460: Error checking for a transaction
    at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:435)
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789)
    at org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:94)
    at org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:67)
  Caused by: javax.resource.ResourceException: IJ000459: Transaction is not active: tx=Local transaction (delegate=TransactionImple < ac, BasicAction: 0:ffff0a91021d:6d03d951:608a090d:2d5 status: ActionStatus.ABORTED >, owner=Local transaction context for provider JBoss JTA transaction provider)
    at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:419)

获取连接的代码如下。错误发生在 connectionFactory.createConnection(); 一个事务成功但所有后续事务都失败并出现此错误。

我们的应用程序在 WildFly 21 和 ActiveMQ 5.12.1 上 运行。 ActiveMQ 通过 ActiveMQ JCA 资源适配器连接到 WildFly

ConnectionFactory connectionFactory = serviceLocator.getConnectionFactory("java:/ActiveMQ/QueueConnectionFactory");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = serviceLocator.getDestination(conf.getProperty(SystemConfig.OUTPUT_QUEUE_JNDI_NAME));
MessageProducer messageProducer = session.createProducer(destination);

非常感谢任何帮助。

默认情况下,当 MDB 收到一条消息时,Java EE 容器会自动启动一个事务,其中包括消息的使用和 MDB 执行的任何其他事务性工作(例如,数据库更新、发送其他 JMS 消息) , ETC。)。通过这种方式,JMS 消息就像一个工作单元,并且消息的使用以及任何其他事务性工作都是以原子方式执行的。如果工作的任何部分失败,那么每个部分都将回滚,并且根据配置,消息被放回队列(以便 MDB 尝试再次使用它)或发送到死信队列或甚至可能被丢弃。

当您从基于 JCA 的连接工厂获得连接时,JCA 子系统会尝试自动将该资源征用到任何正在进行的事务中。在这种情况下,事务可能由于超时或某种其他类型的先前故障而未处于活动状态。您应该查看您的日志,看看在此之前是否有任何故障可以阐明事务被中止的原因。

默认交易超时为 300 秒(即 5 分钟),因此如果您的交易持续时间超过此时间,您将看到此类错误。 Long-运行 事务是一种反模式,因此您应该尽可能采取措施避免它们。如果您绝对 必须 增加事务超时,那么 this article 对如何做到这一点有很好的解释。