【问题标题】:How to suppress ordering in ActiveMQ?如何抑制 ActiveMQ 中的排序?
【发布时间】:2016-07-12 11:17:45
【问题描述】:

我有一个生产者和一个消费者的消息队列,用于异步请求,并应用一些超时策略来保证交付。这些消息的排序没有意义。每条消息都是相互隔离的,都有自己的业务场景。所以我不需要在消息队列中进行任何排序。但问题是队列被无法传递的第一条消息阻塞。其他消息是正确的并准备好以正确的方式处理,但它们必须等待“坏”消息才能被传递。

Java 和 JMS 在队列客户端使用 Spring。

是否有可能使 ActiveMQ 队列没有任何排序但每条消息都有单独的重新传递超时?

【问题讨论】:

    标签: java asynchronous activemq message-queue


    【解决方案1】:

    您是否处于“先进先出”场景?即必须保留处理顺序?如果没有,请在队列上启动多个消费者(例如,多个 MDB 实例,在 WebSphere 中,您在激活规范中设置每个服务器的“从属”数量)和/或为您的消息分配不同的 JMSpriority 以首先处理“更紧急”的消息

    【讨论】:

    • 不,正如我所说的,我根本不需要订购,所以没有 FIFO。而且我只有生产者和消费者——这是我自己的迷你集成总线。我尝试使用优先级,但有两个问题: 1. 我所有的消息的优先级都相同。并且使用优先级的唯一方法 - 每次未传递消息时降低它。 2. 它不起作用。如果某些消息被带入传递过程,则在第一个消息出队列之前,将不会处理优先级的新消息。
    【解决方案2】:

    解决这个问题的最佳方法是对每个消息类型使用一个队列,或者在一组队列中对消息进行一些类似的逻辑分区。

    JMS 队列的功能正如其名称所暗示的那样,先进先出。有一种使用消息优先级来允许消息跳线的选项,但根据队列深度等有很多限制。

    你最好将你的域分解成一些逻辑的队列集并为每个队列消费。

    【讨论】:

    • 是的,我想过逻辑一条消息 - 一个队列,但它看起来很“hacky”(抱歉,无法用英语发明更合适的词)。当队列数量为数千时,ActiveMQ 的行为如何?看来我需要删除旧队列或管理数千个队列池以及将消息分派到该池中的逻辑。换句话说,这是可能的解决方法,但它应该更复杂。
    • 我试图玩弄优先级 - 如果旧消息尚未交付,ActiveMQ 不会对具有更高优先级的新消息执行任何操作。
    • 阅读文档,这两个问题都有答案
    猜你喜欢
    • 2012-11-15
    • 2016-10-17
    • 2010-11-05
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多