Spring integration JMS头未存储到Spring集成消息头中
拥有来自ActiveMQ队列的传入消息,并且消息已正确传递。我需要在spring集成流中访问JMS头值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
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,如您在我的上一篇文章中所看到的。commentmessage
param具有org.springframework.messaging.message
类型和getPayload
和getHeaders
方法。