消息处理优先级

时间:2008-12-22 21:50:30

标签: java message-queue

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

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

您是否知道可以执行此操作的JMS服务器 - 或者您是否知道另一种实现此方法的方法?

4 个答案:

答案 0 :(得分:6)

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

我认为ActiveMQ确实支持它。

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

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

答案 1 :(得分:2)

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

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

JMS Spec声明:"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."

答案 2 :(得分:0)

为什么不考虑使用另一个MDB显式处理其他消息类型。上面的优先级细节仍然适用,您可以更多地控制每种消息类型的并发处理。

对于大多数情况,我更喜欢每个消息类型1 mdb或消息接收器。这样,如果事务回滚,您会立即知道哪种类型的消息导致了问题

卡尔

答案 3 :(得分:0)

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

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