具有优先级的消息处理[关闭]
Posted
技术标签:
【中文标题】具有优先级的消息处理[关闭]【英文标题】:Message processing with priorities [closed] 【发布时间】:2010-09-28 02:21:50 【问题描述】:在 Java Web 应用程序中,我有一个 A 类型的重复消息负载(例如,每小时 20,000 条)。然后我有第二种类型的消息(B 型)偶尔出现,但优先级高于 A 型(比如 3,000)。我希望能够使用开源软件在一台或多台机器上处理这些消息。
在我看来,如果我有一个 JMS 服务器可以根据优先级从其队列中发送消息(例如,发送三个 B 类型的消息,然后发送一个 A 类型的消息,即使所有消息都是类型 A 位于消息队列的顶部)。
您知道可以执行此操作的 JMS 服务器吗?或者您知道实现此功能的另一种方法吗?
【问题讨论】:
【参考方案1】:JMS 标准支持的消息优先级默认为 4,您可以指定其他)。我认为您需要在消息生产者和消息本身中设置它(两者都有方法)。
我认为 ActiveMQ 确实支持它。
但是,许多 JMS 代理默认禁用优先级处理。 在代理配置的某处,您可能需要更改一个标志,例如“supportJMSPriority”。
此外,Apache Camel 允许您编写自己的消息重排序器,以便您可以实现任何形式的优先级。
【讨论】:
【参考方案2】:在 MessageProducer(QueueSender 等)上调用“send(..)”时设置消息优先级。或者,您可以将 MessageProducer 的默认优先级设置为 0-9(9 为最高)。设置消息本身的优先级是行不通的。它被 Producer 覆盖。
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."
【讨论】:
【参考方案3】:为什么不考虑使用另一个 MDB 来显式处理其他消息类型。上面的优先级细节仍然适用,此外,您可以更好地控制每种消息类型的并发处理。
对于大多数情况,我更喜欢每个消息类型有 1 个 mdb 或消息接收器。这样,如果事务回滚,您会立即知道是哪种类型的消息导致了问题
卡尔
【讨论】:
【参考方案4】:您可以使用多个主题。即使有优先级,如果您的处理器忙于处理较低优先级的消息,它也不会停止它的工作。
如果您有单独的处理器,则高优先级消息可以在交付后立即开始处理,而不是等待任何其他消息被处理。
【讨论】:
以上是关于具有优先级的消息处理[关闭]的主要内容,如果未能解决你的问题,请参考以下文章