我有一个JMS出站网关,用于将消息发送到队列管理器中的多个队列。目的地是使用destinationExpression
方法即时确定的:
@Bean
public IntegrationFlow sendTo101() {
return flow -> flow
.handle(Jms
.outboundAdapter(context.getBean("connection101", ConnectionFactory.class))
.destinationExpression("headers.destinationName")
.configureJmsTemplate(spec -> spec
.explicitQosEnabled(true)
.get().setDeliveryDelay(180000)
)
.get(),
endpointSpec -> endpointSpec.advice(context.getBean(RequestHandlerRetryAdvice.class))
);
}
现在需要为进入的某个消息子集设置传递延迟。有没有办法使用消息内容来确定是否应该添加延迟?
我可以进一步检查此属性,并将流重定向到另一个出站网关,但这将是相当多的冗余代码,所以我想确保没有更好的方法。< / p>
此外,不同的消息需要不同的延迟。是否可以为每条消息设置不同的延迟?我确实知道延迟属性是在Message Producer上,而不是你根据JMS规范在消息上设置的东西,但是我很好地为每个消息创建一个新的JMS生成器,即使它阻碍了性能。
感谢您的帮助!
答案 0 :(得分:0)
嗯,我在这种情况下建议的是拥有顶级JmsTemplate
bean,并在deliveryDelay
之前设置Jms.outboundAdapter()
。但在这种情况下,必须在同一Thread
的此流中处理所有消息,以避免并发修改。
我们DynamicJmsTemplate
基于DynamicJmsTemplateProperties
。最后一个使用ThreadLocal
为每个请求更改priority
和receiveTimeout
。
我非常确定您对deliveryDelay
的请求可以被视为该功能的一部分。
此处只有目标JmsTemplate
的问题不使用getter,而是直接访问该属性。所以,首先我们要求Spring Framework团队(https://jira.spring.io/browse/SPR)重构JmsTemplate
内部以获得更好的继承。