JMS标头未存入Spring Integration消息头

时间:2016-03-01 19:45:21

标签: spring-integration

从ActiveMQ队列传入消息,并正在正确传递消息。我需要在Spring集成流中访问JMS头值x-cutoffrule,但句柄部分中cutoffrule的值始终为null。我的代码如下:

@Bean
public JmsHeaderMapper sampleJmsHeaderMapper() {
    return new DefaultJmsHeaderMapper() {
        public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) {
            Map<String, Object> headers = super.toHeaders(jmsMessage);
            try {
                headers.put("cutoffrule", jmsMessage.getStringProperty("x-cutoffrule"));
            } catch (JMSException e) {
                e.printStackTrace();
            }
            return headers;
        }
    };
}


@Bean
public IntegrationFlow jmsMessageDrivenFlow(JmsHeaderMapper sampleJmsHeaderMapper ) {
    return IntegrationFlows
            .from(
                    Jms.messageDriverChannelAdapter(jmsMessagingTemplate.getConnectionFactory())
                            .destination(integrationProps.getIncomingRequestQueue())
                            .errorChannel(errorChannel())
                            .setHeaderMapper( sampleJmsHeaderMapper )
            )
            .handle((payload, headers) -> {
                incomingPayload = payload;
                logger.debug("cutoffrule"+ headers.get("cutoffrule"));
                return payload;
            })
            .handle(message -> {
                logger.debug("Message was succcessfully processed");
            })
            .get();
}

我认为DefaultJmsHeaderMapper会将所有JMS标头映射到spring集成消息中。我错过了什么?

1 个答案:

答案 0 :(得分:1)

了解调试代码的错误的最佳方法。 或者,至少 log 一切。 最适合您的是DefaultJmsHeaderMapper扩展名。

因此,DefaultJmsHeaderMapper会映射所有传入的properties。但它与getObjectProperty()而不是getStringProperty()一样,就像你的代码一样:

Enumeration<?> jmsPropertyNames = jmsMessage.getPropertyNames();
if (jmsPropertyNames != null) {
    while (jmsPropertyNames.hasMoreElements()) {
        String propertyName = jmsPropertyNames.nextElement().toString();
        try {
            String headerName = this.toHeaderName(propertyName);
            headers.put(headerName, jmsMessage.getObjectProperty(propertyName));
        }
        catch (Exception e) {
            if (logger.isWarnEnabled()) {
                logger.warn("error occurred while mapping JMS property '"
                            + propertyName + "' to Message header", e);
            }
        }
    }
}

因此,您的x-cutoffrule应该完全映射到x-cutoffrule标题。

请参阅Andriy的评论。