使用 DestinationResolvers 在 Spring 集成 (/Dsl) 中工作的方法

A way to work in Spring Integration (/Dsl) with DestinationResolvers

我可以配置一个 JmsMessageDrivenChannelAdapter 以便它能够通过 DestinationResolvers 等方式处理不同的目的地吗?我想通过 IntegrationFlows 构建器提供目标逻辑,这样我就可以重用该组件(我不需要为每个主题创建一个适配器),或者将所有目标 sources/decision 规则集中在一个单身class

你可以这样做:

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().