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