我有一个 JMS 侦听器池:
<jms:listener-container connection-factory="jmsConnectionFactory"
acknowledge="client" concurrency="10">
<jms:listener destination="foo1" ref="ref1"/>
<jms:listener destination="foo2" ref="ref2"/>
<jms:listener destination="foo3" ref="ref3"/>
<jms:listener destination="foo4" ref="ref4"/> // etc...
</jms:listener-container>
我正在寻找一种方法来确保我的某些消息类型不会饿死或阻止所有其他消息类型。示例:我希望我的池中至少有 M% 但不超过 N% 专用于处理 foo1 消息,即使这样的处理可能会不规律地停止。
目前,如果我让这种情况发生,那么我池中的所有 10 个线程最终都将专用于 foo1 消息。foo{2-4} 消息将不得不等待。我可以通过在我的 foo1 监听器上强制超时来防止这种饥饿,但是我没有达到我的吞吐量目标。
有没有一些简单的基于配置的方法来实现这一点?我可以同时运行两个 JMS 侦听器池吗?
或者我最安全的选择是设置两个完全不同的服务器队列,一个专用于 foo1 消息,另一个专用于 foo2-4?
理想情况下,我想做类似以下的事情。但是“并发”不是 jms:listener 的属性,只是 jms:listener-container:
<jms:listener-container connection-factory="jmsConnectionFactory"
acknowledge="client" concurrency="25">
<jms:listener destination="foo1" ref="ref1" concurrency="10" /> // ensure higher throughput
<jms:listener destination="foo2" ref="ref2" concurrency="5" /> // don't let foo1 starve me...
<jms:listener destination="foo3" ref="ref3" concurrency="5" /> // don't let foo1 starve me...
<jms:listener destination="foo4" ref="ref4" concurrency="5" /> // etc...
</jms:listener-container>
谢谢。