我们正在使用具有以下配置的ActiveMQ 5.10代理
我们使用Apache camel 2.10.2路由来消耗队列中的消息。
收到消息后,我们使用spring的jmstemplate创建了大约4万条较小的消息/已接收消息并使用asyncSend
将它们发布到另一个队列。
我们为使用pooledconnection的消费者和生产者配置了不同的connectionFactory
当我们在队列中生成数百万条消息时,我们在producerConnectionFactory上配置了producerWindowSize
问题: 运行几个小时后,我们会在代理上生成大约1000万条消息,队列中的消费者开始消失。最终没有消费者,我们的系统就停止了。 我们目前唯一的工作就是重新启动应用程序
问题:
如果代理重新启动,asyncSend
生成器与producerWindoeSize
的行为是什么?
更新 当camel消费者在队列中发送数百万条消息时,我可以通过重新启动代理来重现此问题。
我打算在骆驼recoveryInterval
上设置JmsConfiguration
,请发表您对此的看法。
更新
我能够在消费者消失的jvm上捕获一个线程转储。 线程在生产者窗口上被阻塞,waitForSpace()。
Camel (CamelContext) thread #573 - JmsConsumer[RequestQueue]" daemon prio=6 tid=0x0000000011ded000 nid=0x156c in Object.wait() [0x000000005b69d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.activemq.usage.MemoryUsage.waitForSpace(MemoryUsage.java:67)
- locked <0x00000006a0bfc058> (a java.lang.Object)
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:271)
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:212)
at org.apache.activemq.pool.PooledProducer.send(PooledProducer.java:79)
- locked <0x00000006a0bfbec8> (a org.apache.activemq.ActiveMQMessageProducer)
at org.apache.activemq.pool.PooledProducer.send(PooledProducer.java:67)
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:589)
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:569)
at org.springframework.jms.core.JmsTemplate$4.doInJms(JmsTemplate.java:546)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:466)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:543)
at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:620)
即使内存使用率恢复正常,此等待也永远不会完成。 我正在使用activeMQ 5.7客户端库
https://issues.apache.org/jira/browse/AMQ-4512
但是想知道,有没有有效的工作?即使我将消费者减少到1,我也会发现这个问题。