首页 > 解决方案 > WildFly 10.1.0:服务器运行时出现 ActiveMQConnectionTimedOutException

问题描述

我们有一个配置了 ActiveMQ Artemis 的 WildFly 10 实例。

服务器运行数周后,我们在将消息放入队列时发现此错误:

WARN  [com.arjuna.ats.jta] (default task-39) ARJUNA016061: TransactionImple.enlistResource - XAResource.start returned: XAException.XAER_RMFAIL for < formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a4809a7:12ad14f2:613b6c2b:8c8976c, node_name=1, branch_uid=0:ffff0a4809a7:12ad14f2:613b6c2b:8c89779, subordinatenodename=null, eis_name=java:/JmsXA NodeId:560e8de4-ccea-11eb-a9ec-014175cacf74 >: javax.transaction.xa.XAException
    at org.apache.activemq.artemis.ra.ActiveMQRAXAResource.start(ActiveMQRAXAResource.java:85)
    at org.apache.activemq.artemis.service.extensions.xa.ActiveMQXAResourceWrapperImpl.start(ActiveMQXAResourceWrapperImpl.java:121)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.enlistResource(TransactionImple.java:662)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.enlistResource(TransactionImple.java:423)
...
Caused by: ActiveMQConnectionTimedOutException[errorType=CONNECTION_TIMEDOUT message=AMQ119014: Timed out after waiting 30,000 ms for response when sending packet 44]
    at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:398)
    at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:304)
    at org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQSessionContext.simpleRollback(ActiveMQSessionContext.java:299)
    at org.apache.activemq.artemis.core.client.impl.ClientSessionImpl.rollback(ClientSessionImpl.java:542)
    at org.apache.activemq.artemis.core.client.impl.ClientSessionImpl.rollback(ClientSessionImpl.java:513)
    at org.apache.activemq.artemis.core.client.impl.ClientSessionImpl.resetIfNeeded(ClientSessionImpl.java:594)
    at org.apache.activemq.artemis.ra.ActiveMQRAXAResource.start(ActiveMQRAXAResource.java:80)
    ... 131 more

在重新启动服务器之前,队列上的每个操作都会出现此错误。

异常由本地客户端记录(部署在应用程序服务器本身的战争)。本地客户端发送消息,有远程消费者使用它们。当错误发生时,因为负载不高于平时。我没有收集线程转储,如果再次发生错误,我可以尝试收集它们。

子系统配置为:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
    <server name="default">
        <management jmx-enabled="true" />

        <security enabled="false" />

        <bindings-directory
            path="/data/activemq/bindings" />
        <journal-directory path="/data/activemq/journal" />
        <large-messages-directory
            path="/data/activemq/largemessages" />
        <paging-directory path="/data/activemq/pages" />

        <security-setting name="#">
            <role name="guest" delete-non-durable-queue="true"
                create-non-durable-queue="true" consume="true" send="true" />
        </security-setting>
        <address-setting name="#"
            message-counter-history-day-limit="10" page-size-bytes="2097152"
            max-size-bytes="104857600" max-delivery-attempts="-1"
            redelivery-delay="300000" expiry-address="jms.queue.ExpiryQueue"
            dead-letter-address="jms.queue.DLQ" />
            
        <address-setting
            name="jms.queue.queue1" max-delivery-attempts="-1"
            expiry-address="jms.queue.ExpiryQueue"
            dead-letter-address="jms.queue.DLQ" redelivery-delay="120000" />
            
            
        <http-connector name="http-connector"
            endpoint="http-acceptor" socket-binding="messaging" />
        <http-connector name="http-connector-throughput"
            endpoint="http-acceptor-throughput" socket-binding="messaging">
            <param name="batch-delay" value="50" />
        </http-connector>
        <in-vm-connector name="in-vm" server-id="0" />
        <http-acceptor name="http-acceptor"
            http-listener="default" />
        <http-acceptor name="http-acceptor-throughput"
            http-listener="default">
            <param name="batch-delay" value="50" />
            <param name="direct-deliver" value="false" />
        </http-acceptor>
        <in-vm-acceptor name="in-vm" server-id="0" />
        <jms-queue name="ExpiryQueue"
            entries="java:/jms/queue/ExpiryQueue" />
        <jms-queue name="DLQ" entries="java:/jms/queue/DLQ" />
        
        <jms-queue name="queue1"
            entries="queue1 queue/queue1 jms/queue/queue1 java:jboss/exported/queue1" />
    
        <!-- 
        ... 
        --->
        
        <jms-queue name="queueN"
            entries="queueN queue/queueN jms/queue/queueN java:jboss/exported/queueN" />

        <connection-factory name="InVmConnectionFactory"
            entries="java:/ConnectionFactory" connectors="in-vm" />
        <connection-factory
            name="RemoteConnectionFactory"
            failover-on-initial-connection="true" reconnect-attempts="-1"
            block-on-acknowledge="true" consumer-window-size="0"
            client-failure-check-period="10000" ha="true"
            entries="java:jboss/exported/jms/RemoteConnectionFactory"
            connectors="http-connector" />
        <pooled-connection-factory
            name="activemq-ra" transaction="xa"
            entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"
            connectors="in-vm" />
    </server>
</subsystem>

有没有配置错误?任何人都可以为这个错误提出解决方案吗?

标签: wildflyactivemq-artemis

解决方案


WildFly 10.1.0 于 2016 年 8 月发布,它使用了 2015 年 10 月发布的 ActiveMQ Artemis 1.1.0,距今已近 6 年。WildFly 现在是 25 版,而 ActiveMQ Artemis 现在是 2.18.0。我强烈建议您升级到 WildFly 的更高版本,甚至使用最新版本的 ActiveMQ Artemis独立版(即未嵌入 WildFly)。

即使1.1.0 中发现了一个错误,这个版本也不会发布错误修复版本。为了获得任何类型的修复,您将被迫升级到最新版本,除非您向后移植修复并自己构建它。值得注意的是,自 1.1.0 发布以来,ActiveMQ Artemis 中已修复了数百个错误。您的问题很可能就在其中。


推荐阅读