【发布时间】: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