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



MDBClient类中获取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消息等(事务性工作是以原子方式执行的。如果工作的任何部分失败,那么每个部分都会回滚,并且根据配置,消息要么被放回队列(以便MDB尝试再次使用它(,要么被发送到死信队列,甚至可能被丢弃。

当您从基于JCA的连接工厂获得连接时,JCA子系统会尝试将该资源自动登记到任何正在进行的事务中。在这种情况下,事务不是活动的,可能是由于超时或以前的某种故障。您应该查看日志,看看在此之前是否有任何故障,从而了解事务中止的原因。

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

最新更新