【问题标题】:JMS Header not getting stored into Spring Integration message headerJMS Header 未存储到 Spring Integration 消息头中
【发布时间】:2016-06-14 09:51:59
【问题描述】:

有来自 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 集成消息中。我错过了什么?

【问题讨论】:

  • 你为什么使用sampleJmsHeaderMapper?为什么不在 (payload, headers) -&gt; {...} 处理程序中使用“x-cutoffrule”?
  • 我就是这样开始将它直接放在句柄(有效负载,标题)中的,但我没有得到值。因此,通过在此实现中使用 DefaultJmsHeaderMapper 来使其显式化。还是不行。
  • 我想知道您的消息是否真的具有x-cutoffrule 属性...请调试您的确认。当我们找到该属性时,您将能够从您的自定义 toHeaders() 将其映射到适当的标题中
  • 我会尝试删除JmsHeaderMapper,将您的处理程序提取为一个单独的类作为AbstractMessageProcessingTransformer 的继承者,并将您的链中的调用从handle 更改为transform。并在您成功的transform 方法中检查Message&lt;?&gt; message 参数中您的字段的存在。
  • @StartingDev 正如您在我的上一篇文章中看到的那样。评论 message 参数有 org.springframework.messaging.Message 类型和 getPayloadgetHeaders 方法。

标签: spring-integration


【解决方案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 的评论。

【讨论】:

    猜你喜欢
    • 2016-02-10
    • 2020-04-30
    • 2017-12-12
    • 2018-04-19
    • 1970-01-01
    • 2022-01-15
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多