如何动态地向出站邮件添加传递延迟?

时间:2017-04-12 10:34:12

标签: java spring spring-integration

我有一个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生成器,即使它阻碍了性能。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

嗯,我在这种情况下建议的是拥有顶级JmsTemplate bean,并在deliveryDelay之前设置Jms.outboundAdapter()。但在这种情况下,必须在同一Thread的此流中处理所有消息,以避免并发修改。

我们DynamicJmsTemplate基于DynamicJmsTemplateProperties。最后一个使用ThreadLocal为每个请求更改priorityreceiveTimeout

我非常确定您对deliveryDelay的请求可以被视为该功能的一部分。

此处只有目标JmsTemplate的问题不使用getter,而是直接访问该属性。所以,首先我们要求Spring Framework团队(https://jira.spring.io/browse/SPR)重构JmsTemplate内部以获得更好的继承。