首页 文章

Spring Integration:从Message或MessageChannel获取基础Queue的名称

提问于
浏览
0

给定 MessageChannelMessage 对象,如何从其中一个中获取收到消息的基础JMS队列的名称?

下面是场景:在xml中定义了几个 jms:message-driven-channel-adapter 实例 . 每个适配器的 destination-name 使用SEL从不同的队列接收 . 此SEL是动态的,不可能提前知道这些队列名称 . 所有通道适配器输出到相同的内部Spring Integration通道 .

我想将收到消息的实际底层队列名称添加到消息的 Headers 中 .

我们的想法是为通道适配器或内部通道设置 ChannelInterceptor . postReceive() 方法将Message和MessageChannel都作为参数 . 使用其中任何一个,是否可以获取消息所在的基础队列名称?谢谢

2 回答

  • 1

    看起来你需要扩展一点 DefaultJmsHeaderMapper

    class DestinationJmsHeaderMapper extends DefaultJmsHeaderMapper {
        public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) {
            Map<String, Object> headers = super.toHeaders(jmsMessage);
            headers.put("JMS_DESTINATION", ((Queue) jmsMessage.getJMSDestination()).getQueueName());
        }
    }
    

    并将它注入你的 <jms:message-driven-channel-adapter>

  • 0

    这就是我们这样做的方式:

    <int:header-enricher>
         <int:header name="JMS_DESTINATION" expression="payload.JMSDestination.queueName"/>
      </int:header-enricher>
    

    它在 <jms:message-driven-channel-adapter> 中需要 extract-payload="false" .

    附: Artem的答案缺少 return 陈述(我没有足够的声誉来评论) .

相关问题