【发布时间】:2016-10-25 14:46:13
【问题描述】:
我的应用程序包含许多运行在 JBoss Fuse 6.2.1 中的 OSGi 包。每个包都有一个从 ActiveMQ 端点消耗的 Camel 路由。使用VirtualTopics交换数据。
ProducerBundle 发布到主题VirtualTopic.MyTopic
ConsumerBundle A 从队列 @987654323@ 消费
ConsumerBundle B 从队列 @987654324@ 消费
ConsumerBundle C 从队列消费排队Consumer.C.VirtualTopic.MyTopic
在某个时间消费者 C 关闭,它的捆绑包被卸载并且永远不会回来。但是,消息仍然排入Consumer.C.VirtualTopic.MyTopic 队列。
如何销毁这样的队列?
当队列填满时,ActiveMQ 会暂停生产者,我无法设置一小段时间来处理消息,因为其他消费者可能需要一段时间来处理每条消息。我无法修改 VirtualTopic 结构。我可以完全访问
ActiveMQ 配置和 Camel 路由。
是否有其他选项来处理这种情况?
<!-- producer route -->
<route id="ProducerRoute"/>
<from uri="direct:trigger"/>
<to uri="activemq:topic:VirtualTopic.MyTopic"/>
</route>
<!-- each consumer route -->
<route id="ConsumerARoute">
<from uri="activemq:Consumer.A.VirtualTopic.MyTopic"/>
<to uri="bean:myProcessor"/>
</route>
【问题讨论】:
-
您可以为消息设置生存时间。
-
如果 Consumer C 包是手动卸载的,也许你也可以手动删除队列(通过 web 控制台或通过 jmx)。
-
@AlexandreCartapanis 如果我设置的 TTL 太小,其他消费者可能会丢失消息;如果它足够大,生产者就会减慢速度,从而减慢整个过程。我希望 ActiveMQ 或 Camel 提供一些事件/触发器/拦截器,而不是自己编写。
标签: apache-camel activemq jbossfuse