0

我有一个 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>

谢谢。

4

1 回答 1

2

理解命名空间配置只是为了简化配置。每个<listener/>元素都有自己的侦听器容器并从元素“继承”属性<listener-container/>

因此,在您的第一个示例中, concurrency="10"并未在所有侦听器之间共享;每个都<listener/>获得 10 的并发性。

您可以通过声明两个元素来实现第二个示例<listener-container/>,一个具有并发 10,另一个具有 5。然后在适当的容器元素中声明每个侦听器。

希望有帮助。

于 2012-12-14T02:16:10.490 回答