一种使用DestinationResolvers在Spring Integration(/ Dsl)中工作的方法

时间:2017-07-18 15:14:10

标签: spring spring-integration spring-integration-dsl

我可以配置一个JmsMessageDrivenChannelAdapter,以便能够通过DestinationResolvers或其他方式使用不同的目的地吗?我想通过IntegrationFlows构建器提供目标逻辑,因此我可以重用该组件(我不需要为每个主题创建一个适配器),或者将所有目标源/决策规则集中在一个类中

1 个答案:

答案 0 :(得分:1)

你可以这样做:

IntegrationFlows
                .from(Jms.messageDrivenChannelAdapter(jmsConnectionFactory())
                        .destination("DUMMY")
                        .configureListenerContainer(c ->
                                c.destinationResolver((session, s, b) ->
                                    YOUR LOGIC FOR DYNAMIC DESTINATION RESOLUTION)))

您需要"DUMMY"目标配置来模拟容器状态:

protected void validateConfiguration() {
    if (this.destination == null) {
        throw new IllegalArgumentException("Property 'destination' or 'destinationName' is required");
    }
}

OTOH我不确定它是否会正常工作。

容器根据目标启动JMS Consumer(即使您通过自定义DestinationResolver提供),在容器停止之前无法更改。

您可以考虑使用Jms.inboundAdapter(),它是可轮询的,但基于JmsTemplate.receiveSelected()。这样,您可以从轮询器更改每个receive()调用的目标。

无论如何,您还需要dummy destinationName配置。否则它不会转到getDestinationResolver()