我使用Spring集成JMS Outbound适配器向IBM MQ发送消息,我发现来自上游应用程序的一些JMS头文件被遗漏或默认。上游应用程序正在发送以下JMS头文件,
的JMSType:
JMSDeliveryMode:
JMSExpiration:
JMSPriority:
JMSMessageID按:
JMSTimestamp:
JMSCorrelationID:
JMSDestination:
JMSReplyTo:
JMSRedelivered:
在完成Spring的DefaultJmsHeaderMapper转换后,下面的Headers会被默认/遗漏。
JMSPriority:
JMSDeliveryMode:
JMSExpiration:
JMSRedelivered:
JMSReplyTo:
我在JMS Outbound适配器中启用了explicit-qos标志,我确实看到了Priority。但仍有其他标题的问题。
答案 0 :(得分:0)
这是入站部分DefaultJmsHeaderMapper
映射的简化版本:
public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) {
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(JmsHeaders.MESSAGE_ID, messageId);
headers.put(JmsHeaders.DESTINATION, destination);
headers.put(JmsHeaders.CORRELATION_ID, correlationId);
headers.put(JmsHeaders.REPLY_TO, replyTo);
headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered());
headers.put(JmsHeaders.TYPE, type);
headers.put(JmsHeaders.TIMESTAMP, jmsMessage.getJMSTimestamp());
if (this.mapInboundPriority) {
headers.put(IntegrationMessageHeaderAccessor.PRIORITY, jmsMessage.getJMSPriority());
}
Enumeration<?> jmsPropertyNames = jmsMessage.getPropertyNames();
while (jmsPropertyNames.hasMoreElements()) {
String propertyName = jmsPropertyNames.nextElement().toString();
String headerName = this.toHeaderName(propertyName);
headers.put(headerName, jmsMessage.getObjectProperty(propertyName));
}
}
}
return headers;
}
您是否介意分享日志在发送到JmsMessageDrivenEndpoint
的消息频道时消息的外观如何?
OTOH您始终可以扩展/覆盖默认并提供您自己的JmsHeaderMapper
实施。
答案 1 :(得分:0)
如果存在,它们将从JMS标头映射到spring-messaging标头:
GenericMessage [payload=sdf, headers={
jms_redelivered=false,
jms_destination=queue://queue.demo,
id=899e931b-7f77-3e92-9b95-349c0fc57afe,
priority=4,
jms_timestamp=1496695959175,
jms_messageId=ID:gollum.local-65233-1496695954961-4:1:2:1:1, timestamp=1496695965782}]
我唯一看到的是JMSDeliveryMode
。除优先级外,它们都使用jms_
。
并非所有经纪商都为传入的消息提供传送模式;它通常只适用于出境。如果您可以确认您的代理确实提供了入站消息的传递模式,我们可以添加映射(和/或您可以在默认映射器的子类中执行此操作)。如果要添加映射,请打开带有证据的JIRA issue(例如,入站消息的调试器的屏幕截图)。