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

时间:2015-10-19 10:00:40

标签: jms spring-integration ibm-mq

嘿所以我正在使用spring integration 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作为我的消息代理。我不知道这是否与消息代理有任何关系。

1 个答案:

答案 0 :(得分:4)

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

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

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

或者,使用表达式......

<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>