【问题标题】:Apache Camel JMS with ActiveMQ: Sending Messages with Dynamic Priority带有 ActiveMQ 的 Apache Camel JMS:以动态优先级发送消息
【发布时间】:2021-05-18 13:17:59
【问题描述】:

我目前正在使用 Apache Camel 和 ActiveMQ 实现 Java 消息传递系统。我的目标是根据消息的一些属性动态设置消息的优先级。

我已经按照here 的说明配置了我的 ActiveMQ。然后我创建了以下发送TextMessage的方法:

public void send(BaseMessage baseMessage, int jmsPriority) throws JsonProcessingException {
    Map<String, Object> messageHeaders = new HashMap<>();
    messageHeaders.put(MESSAGING_HEADER_JMS_PRIORITY, jmsPriority);
    messageHeaders.put(MESSAGING_HEADER_TYPE, baseMessage.getClass().getSimpleName());
    String payload = objectMapper.writeValueAsString(baseMessage);
    producerTemplate.sendBodyAndHeaders(payload, messageHeaders);
}

发送消息完美工作,BaseMessage 的动态类型被正确设置为每条消息的标题。优先级也被设置,但被忽略。与队列通常一样,输出消息的顺序仍然是 FIFO。

到目前为止,我还没有实现动态设置消息的优先级。我不想使用 Apache Camel 的 Resequencer,因为我必须为“排序”创建几个新队列。在我看来,ActiveMQ 必须能够对消息本身进行优先级排序和重新排序。

感谢任何提示。如果需要,请向我询问更多详细信息。

【问题讨论】:

  • 您是否启用了端点上的“preserveMessageQos”选项以考虑提供的优先级? Camel 文档说“设置为 true,如果您想使用消息上指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置”
  • Camel 的 ProducerTemplate 只是设置或覆盖了默认的 JMS 优先级 4。正如您所提到的,我想以某种方式设置优先级,您可以在接口 javax.jms.Message 接口上执行此操作。我停止了所有消费者并发送了优先级从 1 到 9 的消息,然后再次启动消费者。从 1 到 9 (FIFO) 而不是 9 到 1 消耗的消息(优先级队列的预期行为)。
  • @TacheDeChoco 是的,我这样做了。我还尝试将explicitQosEnabled 设置为true。不幸的是,同样的行为。

标签: java apache-camel activemq priority-queue


【解决方案1】:

默认情况下,ActiveMQ 禁用消息优先级。这个是正常的。在进行分布式消息传递(跨服务器发送消息)时,优先级实际上并不能解决问题,因为代理只能在队列中扫描这么多消息以查找具有更高优先级的消息,然后才能统计减慢该队列的所有流量。

在嵌入代理并将其用于任务分派时,优先消息可以很好地工作 - 其中队列深度通常不超过低千。

更新:

提醒--JMS 中的 QOS 设置必须在 MessageProducer 对象上设置,不是每个 JMS 规范的消息。

Enable Prioritized Messages

【讨论】:

  • 我知道默认情况下它是禁用的,但我故意激活了它,但仍然没有对代理服务器上的消息进行重新排序。
  • 请分享您的代码——查看我的更新。对于 JMS,优先级必须设置在 MessageProducer 对象上,而不是 Message 类上。每个 JMS 规范
  • 请朋友..如果您对答案投-1,获得解释-1背后原因的评论会很有帮助。
猜你喜欢
  • 2013-12-23
  • 2014-12-30
  • 2013-12-25
  • 2014-05-23
  • 1970-01-01
  • 2012-07-11
  • 2015-02-11
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多