如何保持JMS Headers来自上游应用程序?

时间:2017-06-05 20:23:19

标签: spring jms spring-integration ibm-mq spring-jms

我使用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。但仍有其他标题的问题。

2 个答案:

答案 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(例如,入站消息的调试器的屏幕截图)。