我可以配置单个JmsMessageDrivenChannelAdapter
,以便它能够通过DestinationResolvers
等方式处理不同的目的地吗?我想通过IntegrationFlows
生成器提供目标逻辑,以便我可以重用该组件(我不需要为每个主题创建一个适配器(,或者将所有目标源/决策规则集中在一个类中
你可以这样做:
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 无论如何,我不确定它是否会正常工作。
容器会根据目标启动 JMSConsumer
(即使您通过自定义DestinationResolver
提供它(,并且在容器停止之前无法更改它。
您可以考虑使用Jms.inboundAdapter()
,这是可轮询的,但基于JmsTemplate.receiveSelected()
。这样,您就可以在轮询器每次receive()
调用时更改目标。
无论如何,您都需要dummy
目的地名称配置。否则它不会进入getDestinationResolver()
.