如何解决未在 ActiveMQ Artemis 代理上发布“正在交付”状态的消息
我已经在主从配置上设置了两个 ActiveMQ Artemis 代理(版本 2.17),并具有用于 HA 的共享文件系统。在测试过程中 繁忙的流量我会停止主代理并看到从服务器接管并开始将消息转发给消费者。过了一会儿 我可以看到许多消息似乎已卡在队列中。我可以将“卡住”的消息视为“正在交付” 查询时从 Artemis UI 中查看。
我的问题是,即使我重新启动主代理,这些消息也不会传递给消费者,并且即使更多 消息仍在填充同一个队列,并且该队列有消费者。我的假设是它与以前的联系有关 消费者的设置仍然保持活跃,因为没有得到确认。
所以我确实尝试在代理或客户端连接字符串上设置 <connection-ttl-override>
(tcp://host1:61616,tcp://host2:61616)?ha=true&connectionTtl=60000&reconnectAttempts=-1)
但这似乎没有任何效果
因为连接不会被关闭并且消息不会被释放。
为了使用消息,我使用带有 CachingConnectionFactory
的 Artemis JMS Spring 客户端,但也尝试了 JmsPoolConnectionFactory
无济于事。
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory">
<bean class="org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory">
<property name="user" value="${spring.artemis.user}" />
<property name="password" value="${spring.artemis.password}" />
<property name="brokerURL" value="${spring.artemis.brokerUrl}" />
</bean>
</property>
<property name="cacheConsumers" value="false"/>
</bean>
<int-jms:message-driven-channel-adapter
connection-factory="connectionFactory"
destination="myQueue"
message-converter="messageConverter"
channel="inputChannel"
concurrent-consumers="${processing.poolsize}"
max-concurrent-consumers="${max.processing.poolsize}"
error-channel="errorChannel"
acknowledge="transacted"
/>
这个问题的唯一补救办法似乎是重新启动消费者应用程序,它可以解除消息的阻止,但这不是理想的选择。
我该如何解决这个问题?有没有办法在无需人工干预或重启消费者应用的情况下发布消息?
解决方法
将变量并发与 CachingConnectionFactory
一起使用可能是问题所在。
当一个“空闲”的消费者返回到缓存时,代理不知道消费者不活跃,仍然向它发送消息。
实际上只在生产者端 (JmsTemplate
) 需要缓存工厂,以避免为每次发送创建连接和会话。
如果使用变量并发,最好不要使用CCF;或者将其配置为不缓存消费者,或者不使用变量并发。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。