2008-12-22 63 views
6

在Java Web应用程序中,我有类型A的循环消息加载(例如,每小时20,000个)。然后我有第二种类型的消息(类型B)偶尔出现,但比A类(比如3,000)具有更高的优先级。我希望能够使用开源软件在一台或多台机器上处理这些消息。带优先级的消息处理

在我看来,如果我有一个JMS服务器可以根据优先级从其队列发送消息(例如,发送B类型的三条消息,然后发送A类型的消息,即使所有消息类型A位于消息队列的顶部)。

你知道一个可以做到这一点的JMS服务器 - 或者你知道另一种实现方法吗?

回答

2

当您在MessageProducer(QueueSender等)上调用“send(..)”时,设置消息优先级。或者,您可以在MessageProducer上设置0-9的默认优先级(9最高)。在消息本身上设置优先级将不起作用。它被生产者覆盖。

Uri是正确的 - 优先级是否被尊重是特定于实现的。我相信OpenJMS通常尊重开箱即用的优先权,但不保证它。

JMS规范指出:"JMS does not require that a provider strictly implement priority ordering of messages; however, it should do its best to deliver expedited messages ahead of normal messages."

6

JMS标准支持的消息优先级默认为4,您可以指定其他)。我认为你需要在消息生产者和消息本身中设置它(两者都有方法)。

我认为ActiveMQ支持它。

但是,许多JMS代理默认情况下已禁用优先级处理。 有一个标志,您可能需要更改,比如“supportJMSPriority”,在代理配置中的某处。

此外,Apache Camel允许您编写自己的消息重排器,以便您可以实现任何形式的优先级。

0

为什么不考虑使用其他MDB明确过程中的其他消息类型。上面的优先级细节仍然适用,对于每种消息类型,您还可以更多地控制并发处理。

对于大多数情况下,我更喜欢每个消息类型1 mdb或消息接收器。如果这样一个事务回滚,你马上就知道这消息的类型引起的问题

卡尔

0

你可以使用多个主题。即使有优先级,如果你的处理器捆绑处理较低优先级的消息,它也不会停止它的工作。

如果您有独立的处理器,高优先级消息可以在交付后立即开始处理,而不是等待任何其他消息处理。