Spring integration JMS头未存储到Spring集成消息头中

Spring integration JMS头未存储到Spring集成消息头中,spring-integration,Spring Integration,拥有来自ActiveMQ队列的传入消息,并且消息已正确传递。我需要在spring集成流中访问JMS头值x-cutoffrule,但是handle部分中的cutoffrule值始终为null。我的代码如下: @Bean public JmsHeaderMapper sampleJmsHeaderMapper() { return new DefaultJmsHeaderMapper() { public Map<String, Object> toHeaders

拥有来自ActiveMQ队列的传入消息,并且消息已正确传递。我需要在spring集成流中访问JMS头值
x-cutoffrule
,但是handle部分中的
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();
}
@Bean
公共JmsHeaderMapper示例JmsHeaderMapper(){
返回新的DefaultJmsHeaderMapper(){
公共映射到头文件(javax.jms.Message jmsMessage){
Map headers=super.toHeaders(jmsMessage);
试一试{
headers.put(“cutoffrule”,jmsMessage.getStringProperty(“x-cutoffrule”);
}捕获(JME){
e、 printStackTrace();
}
返回标题;
}
};
}
@豆子
公共集成流jmsMessageDrivenFlow(JmsHeaderMapper示例JmsHeaderMapper){
返回积分流
.来自(
messageDriverChannelAdapter(JMSMessageTemplate.getConnectionFactory())
.destination(integrationProps.getIncomingRequestQueue())
.errorChannel(errorChannel())
.setHeaderMapper(sampleJmsHeaderMapper)
)
.handle((有效负载、标题)->{
输入有效载荷=有效载荷;
logger.debug(“截止规则”+headers.get(“截止规则”);
返回有效载荷;
})
.handle(消息->{
debug(“消息已成功处理”);
})
.get();
}

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

了解错误的最好方法是调试代码。 或者,至少记录所有的事情。 最适合您的地方是
DefaultJmsHeaderMapper
扩展名

因此,
DefaultJmsHeaderMapper
映射所有传入的
属性。但它是通过
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);
            }
        }
    }
}
枚举jmsPropertyNames=jmsMessage.getPropertyNames();
if(jmsPropertyNames!=null){
while(jmsPropertyNames.hasMoreElements()){
String propertyName=jmsPropertyNames.nextElement().toString();
试一试{
字符串headerName=this.toHeaderName(propertyName);
headers.put(headerName,jmsMessage.getObjectProperty(propertyName));
}
捕获(例外e){
if(logger.iswarnabled()){
logger.warn(“映射JMS属性时出错”)
+propertyName+“'到消息头”,e);
}
}
}
}
因此,您的
x-cutoffrule
应该准确地映射到
x-cutoffrule
标题中


也请参见安德烈的评论。

为什么要使用
sampleJmsHeaderMapper
?为什么不在
(有效负载,标题)->{…}
处理程序中使用“x-cutoffrule”?我就是这样开始的,直接把它放在句柄(有效负载,标题)中,但我没有得到值。因此,我们通过在这个实现中使用DefaultJmsHeaderMapper使其显式化。仍然不起作用。我想知道你的邮件是否真的有
x-cutoffrule
属性。。。请调试您的程序以确认。当我们找到该属性时,您将能够将其从自定义的
toHeaders()
映射到相应的头中。我将尝试删除
JmsHeaderMapper
,将处理程序提取为一个单独的类,作为
AbstractMessageProcessingTransformer
的后续类,并将调用从链中的
handle
更改为
transform
。在成功的
transform
方法中,检查
Message
参数中字段的显示。@StartingDev,如您在我的上一篇文章中所看到的。comment
message
param具有
org.springframework.messaging.message
类型和
getPayload
getHeaders
方法。