Spring 引导 JMS 在 wildfly 中无限重新连接

Spring boot JMS reconnects infinitely in wildfly

我有一个 Spring 启动应用程序,其不同部分通过 JMS 连接。我使用外部 ActiveMQ Artemis(在不同的 docker 容器中)。

当我 运行 Spring 通过 gradle bootRun 启动应用程序时一切正常 - 消息无丢失地传递。

但是当我在 Wildfly 中 运行 应用程序时,并非所有消息都已发送。一些消息丢失(大约一半)。我使用 pooled connection factory 配置在 Wildfly 中使用的外部消息代理,并执行创建 outbound-socket-bindingremote-connector、& pooled-connection-factory.

的命令

在 Wildfly 的日志中,我得到了很多:

2020-05-24 20:52:28,508 DEBUG [org.apache.activemq.artemis.service.extensions.xa.recovery] (Periodic Recovery) looking for recover at ClientSessionImpl [name=44c73a79-9dff-11ea-8d1c-0242ac110004, username=null, closed=false, factory = org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl@2af3f7bd, metaData=()]@410fad2f configuration [XARecoveryConfig [transportConfiguration=[TransportConfiguration(name=, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=61616&localAddress=0-0-0-0&host=my-host], discoveryConfiguration=null, username=null, password=****, JNDI_NAME=java:/jms/remoteArtemisJms]]

并且在 ActiveMQ 日志中永久出现:

2020-05-24 21:16:18,063 DEBUG [org.apache.activemq.artemis.core.server.impl.QueueImpl] QueueImpl[name=30b977b0-ac39-431e-9957-2a9ac1f8b64f, postOffice=PostOfficeImpl [server=ActiveMQServerImpl::serverUUID=0b678ade-9de8-11ea-9475-0242ac110002], temp=true]@3a205718 adding consumer ServerConsumerImpl [id=1860, filter=null, binding=LocalQueueBinding [address=jms.topic.tasks, queue=QueueImpl[name=30b977b0-ac39-431e-9957-2a9ac1f8b64f, postOffice=PostOfficeImpl [server=ActiveMQServerImpl::serverUUID=0b678ade-9de8-11ea-9475-0242ac110002], temp=true]@3a205718, filter=null, name=30b977b0-ac39-431e-9957-2a9ac1f8b64f, clusterName=30b977b0-ac39-431e-9957-2a9ac1f8b64f0b678ade-9de8-11ea-9475-0242ac110002]]

对于每个队列或主题。看起来像永久重新连接。

当我启动 Wildfly 应用程序时,ActiveMQ 管理控制台闪烁(左侧菜单中的图标变为灰色)。当我停止应用程序时,管理控制台中的闪烁停止,菜单项为绿色。

所以,问题:

  1. 如何解决和修复 Wildfly 中的消息传递问题(永久重新连接)?
  2. 什么是定期恢复?为什么会发生?
  3. ActiveMQ 管理控制台中的绿色和灰色图标是什么意思?为什么它闪烁以及如何修复它?

看来是配置问题。我做什么:

  1. 将 spring activemq starter 更改为 artemis
  2. 为队列和主题创建不同的连接工厂
  3. 使用 p.2 中的连接工厂为不同的主题和队列创建不同的 DefaultMessageListenerContainer

现在一切正常。