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