从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集成消息中。我错过了什么?
答案 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的评论。