我们正在使用ActiveMQ 5.10代理进行以下配置
-
JVM堆48G,其中70%分配给memoryUsage
-
70G存储和1G温度
我们使用Apache camel 2.10.2路由来消耗队列中的消息 . 收到消息后,我们使用spring的jmstemplate使用 asyncSend
创建~4k个较小的消息/接收消息并将它们发布到另一个队列 .
我们为使用pooledconnection的消费者和 生产环境 者配置了不同的 connectionFactory
当我们在队列中生成数百万条消息时,我们在producerConnectionFactory上配置了 producerWindowSize
问题:运行几个小时后,我们会在代理上生成大约1000万条消息,队列中的消费者开始消失 . 最终没有消费者,我们的系统就停止了 . 到目前为止,我们唯一的工作就是重新启动应用程序
问题:如果代理重启, asyncSend
生产环境 者与 producerWindoeSize
的行为是什么?
Update : 当camel消费者在队列中发送数百万条消息时,我可以通过重新启动代理来重现此问题 .
我打算在骆驼 JmsConfiguration
上设置 recoveryInterval
,请发表您对此的看法 .
Update:
我能够在消费者消失的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,我也会观察到这个问题 .