如何在 spring 集成中为每个出站 jms 消息设置优先级?

How to set a priority per outbound jms message in spring integration?

嘿,所以我正在使用 spring 集成 jms:outbound-channel-adapter 并且需要在将消息推送到消息传递系统之前设置消息的优先级。

现在在普通的 JMS 中我有两种方法。

或者在 MessageProducer:

上设置优先级
this.producer.setPriority(i);

或者发送方法本身:

channel.send(message, DeliveryMode.PERSISTENT, 5, 1000);

我不再可以使用这些选项,因为通道适配器使我远离了这些细节。

设置消息本身的优先级仅在 spring 集成的内存 channel 中有效,并且在我将其放入实际队列后立即失效。事实证明,设置消息的优先级根本不是一个选项:JMS message priority not working on Message

通道适配器上有一个属性,我可以在其中设置优先级,但这是静态的。

    <jms:outbound-channel-adapter id="101Out" 
                              channel="101MessageChannel"
                              connection-factory="101Factory"
                              destination="QUEUE_NAME"
                              priority="1" />

我最多只能从 属性 文件中读取它。 (或者我认为。我不确定)。我可以使用 destination-expression 属性来检查传入消息并将其动态路由到不同的目的地,但是没有 priority-expression 对应部分让我对优先级做同样的事情。

我有一些解决方法,但不是很好:

    <jms:outbound-channel-adapter id="101HighPriorityOut" 
                              channel="101HighPriorityChannel"
                              connection-factory="101Factory"
                              destination-expression="headers.QUEUE_NAME"
                              priority="1"
                              explicit-qos-enabled="true" />

    <jms:outbound-channel-adapter id="101LowPriorityOut" 
                              channel="101LowPriorityChannel"
                              connection-factory="101Factory"
                              destination-expression="headers.QUEUE_NAME"
                              priority="0"
                              explicit-qos-enabled="true" />

一旦我确定了需要的优先级,我就将消息路由到适当的出站适配器。但是,如果优先级的数量增加,我就会遇到麻烦。即使没有,我认为拥有两个出站适配器而不是一个只是因为我无法动态分配优先级有点笨拙。

感谢帮助:-)

哦,我正在使用 Websphere MQ 作为我的消息代理。不过,我不知道这是否与消息代理有关。

只需在消息中设置优先级header...

<int:header-enricher ...>
    <int:priority value="2" />
</int:heaer-enricher>

适配器配置中的优先级是在没有优先级时使用的默认值 header(您可以使用 属性 占位符从属性文件中设置它)。

或者,使用表达式...

<int:header-enricher ...>
    <int:priority expression="payload.foo == 'bar' ? 1 : 2" />
</int:heaer-enricher>

<int:header-enricher ...>
    <int:priority expression="payload.priority" />
</int:heaer-enricher>

<int:header-enricher ...>
    <int:priority expression="@someBean.calculatePriority(payload)" />
</int:heaer-enricher>