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

时间:2013-12-06 11:57:26

标签: spring-integration

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

以下是该方案: xml中定义了几个 jms:消息驱动通道适配器实例。每个适配器的目标名称使用SEL从不同的队列接收。此SEL是动态的,不可能提前知道这些队列名称。所有通道适配器都输出到相同的内部Spring Integration通道。

我想将收到邮件的实际基础队列名称添加到邮件的标题中。

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

我们就是这样做的:

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

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

P.S。 Artem的答案缺少return声明(我没有足够的声誉来评论)。