弹簧集成在发送给订阅者

时间:2015-07-23 22:53:02

标签: spring-integration

我正在使用与hornetQ的spring-integration。问题是我在消息(方法)中放置了一个自定义标头,但当它击中订户时,标头不再可用。我有一些配置属性需要设置以保留标题吗?

应用程序收到消息(我可以在控制台日志中看到Method标题,因此我知道它实际上正在获取正确的消息)。它基本上只是将消息路由到出站队列,以便客户端可以订阅它(如果有更简洁的方法,请告诉我)

<int:channel id="partsChannel" />

<int-jms:message-driven-channel-adapter
    id="jmsPartsInbound"
    acknowledge="transacted"
    destination-name="parts.in"
    channel="partsChannel"
    connection-factory="jmsConnectionFactory"
    /> <!-- error-channel="partsInboundFailedChannel" -->

<int-jms:outbound-channel-adapter
    id="jmsPartsOutbound"
    destination-name="parts.out"
    channel="partsChannel"
    connection-factory="jmsConnectionFactory"
    pub-sub-domain="true"
    >
    <int-jms:request-handler-advice-chain>
        <int:retry-advice max-attempts="3">
            <int:exponential-back-off initial="2000" multiplier="2" />
        </int:retry-advice>
    </int-jms:request-handler-advice-chain>
</int-jms:outbound-channel-adapter>

应用程序订阅如下:

   <int:channel id="partsInboundChannel" />

   <int-jms:message-driven-channel-adapter
      id="jmsPartsInbound"
      acknowledge="transacted"
      destination-name="parts.out"
      channel="partsInboundChannel"
      pub-sub-domain="true"
      connection-factory="jmsConnectionFactory"/> 

这是在订阅者中获取消息的部分。

@ServiceActivator(inputChannel = "partsInboundChannel")
public void processPart(final Message message) {
   ...message.getHeaders does not contain the "Method" header 
}

1 个答案:

答案 0 :(得分:1)

问题不在DefaultJmsHeaderMapper.fromHeaders

if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) {
                    try {
                        String propertyName = this.fromHeaderName(headerName);
                        jmsMessage.setObjectProperty(propertyName, value);
                    }

其中SUPPORTED_PROPERTY_TYPES是:

private static List<Class<?>> SUPPORTED_PROPERTY_TYPES = Arrays.asList(new Class<?>[] {
        Boolean.class, Byte.class, Double.class, Float.class, Integer.class, Long.class, Short.class, String.class });

因此,如果您的method确实属于Method类型,则会跳过它。

请考虑使用其name