2017-06-05 50 views
0

我正在使用Spring集成JMS出站適配器向IBM MQ發送消息,並且發現來自上游應用程序的一些JMS標頭被遺漏或默認。上游應用程序發送所述下面JMS頭,如何保持來自上游應用程序的JMS頭文件?

的JMSType:
JMSDeliveryMode:
JMSExpiration:
JMSPriority:
JMSMessageID按:
JMSTimestamp:
JMSCorrelationID: JMSDestination:
JMSReplyTo:
JMSRedelivered :

經過Spring的Defa ultJmsHeaderMapper轉換,下面的Headers默認/錯過。

JMSPriority:
JMSDeliveryMode:
JMSExpiration:
JMSRedelivered:
JMSReplyTo:

我啓用了明確的QoS標記在JMS出站適配器和我看到優先權。但仍然有其他頭文件的問題。

回答

0

如果存在,它們是從JMS頭映射到Spring的消息標題:

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(例如入站消息的調試器屏幕截圖)。

+0

感謝您的快速回復。我的經紀人確實發送優先級,deliverymode和timetolive(到期)。我將創建一個JIRA問題並將與您分享。你能告訴我,我應該在Spring中爲JMSExpiration設置什麼標題?像testMessageBuilder.setHeader(「timeToLive」,30L);另外,在Spring中是否有一個文檔具有JMS頭部屬性和Spring頭部屬性。 – Selvakumar

+0

它們被定義爲在彈簧JMS'JmsHeaders'類常量 - 的[Javadoc中展示給它們映射到其中的JMS頭(http://docs.spring.io/spring/docs/current/javadoc-api/index。 html?org/springframework/jms/support/JmsHeaders.html),但名稱不言自明。是的,看起來映射中也沒有到期。 –

+0

單獨覆蓋DefaultJMSheaderMapper不會將這些標題添加到Out消息中。 JMS出站適配器使用DynamicJMSTemplate進行發送;反過來它使用DynamicJmsTemplateProperties來設置優先級。我沒有看到在DynamicJMSTemplate或Props中添加/刪除deliveryMode或過期的字段。我現在正在重寫JMSTemplate並將我的自定義JMSTemplate傳遞給Out Bound Adapter。將不得不構建類似於DynamicJMSTemplate的東西,因爲它使用ThreadLocal持有者來處理多線程處理的優先級 – Selvakumar

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實施。

+0

感謝您的回覆。我的上游發送優先級,deliverymode和timetolive(到期)。看起來我將爲deliverymode和timetolive頭文件傳遞提供自己的實現。我將用最小的標題創建一個測試應用程序,並與您共享日誌。非常感謝 ! – Selvakumar

相關問題