能否通过DSL为Jms OutboundGateway配置动态回复队列?
能否通过DSL为Jms Inbound Gateway配置动态回复队列?
可以通过自定义DestinationResolver结合ThreadLocal实现动态回复队列的配置,以下是具体实现方案:
需求示例
希望根据业务逻辑动态指定回复队列,期望的DSL配置形式如下:
Jms.inboundGateway(jmsListenerContainer) .defaultReplyQueueName("queue1 or queue2")
可行解决方案
通过ThreadLocal存储动态队列名称,自定义DestinationResolver来解析实际使用的回复队列,代码实现如下:
private static final ThreadLocal<String> REPLY_QUEUE = new ThreadLocal<>(); IntegrationFlows.from(Jms.inboundGateway(listenerContainer) .defaultReplyQueueName("defaultQueue1") .destinationResolver(destinationResolver()) .transform(p -> { // 根据业务条件设置动态队列名,无特殊条件时使用默认队列defaultQueue1 REPLY_QUEUE.set("changedToQueue2"); return p; }) @Bean public DestinationResolver destinationResolver() { return (session, destinationName, pubSubDomain) -> session.createQueue(REPLY_QUEUE.get()); }
核心逻辑说明
ThreadLocal<String> REPLY_QUEUE:在当前线程上下文中存储动态切换的队列名称,避免多线程环境下的队列名混淆。- 自定义
DestinationResolver:不使用传入的默认队列名,直接从ThreadLocal中获取实际要使用的队列名称并创建对应队列。 - 业务节点设置队列名:在
transform等业务处理环节中,根据业务逻辑动态设置REPLY_QUEUE的值,实现回复队列的动态切换。
内容的提问来源于stack exchange,提问作者Rayyan
相关产品推荐
相关产品推荐

