2017-06-05 1 views
0

私がIBM MQにメッセージを送信するためにSpring統合JMSアウトバウンドアダプタを使用していると私は上流のアプリケーションからJMSヘッダーの一部は逃したか、デフォルト設定されていることがわかります。
たJMSDeliveryMode:
たJMSExpiration:
JMSPriority:
のJMSMessageID:
JMSTimestamp:
のJMSCorrelationID: たJMSDestination:
のJMSReplyTo:
JMSRedelivered上流アプリケーションはアップストリームアプリケーションからJMSヘッダーを保持する方法は?

のJMSType、JMSヘッダーの下に送信されます:春のDEFAを通過した後

ultJmsHeaderMapperの変換では、以下のヘッダーはデフォルト/欠落しています。

JMSPriority:
たJMSDeliveryMode:
たJMSExpiration:
JMSRedelivered:
のJMSReplyTo:私はJMSアウトバウンドアダプタに明示的なQoSフラグを有効にして、私は優先順位を参照してください

。しかし、まだ他のヘッダーに問題があります。

答えて

0

存在する場合、それらは、ばねのメッセージヘッダにJMSヘッダーからマッピングされます:

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_でprefxedされています。

すべてのブローカは、受信メッセージの配信モードを供給するわけではありません。一般にアウトバウンドにのみ適用されます。ブローカーが実際にインバウンドメッセージの配信モードを提供していることを確認できる場合は、マッピングを追加できます(デフォルトのマッパーのサブクラスで行うこともできます)。あなたはマッピングを追加したい場合は、証拠とJIRA issue(インバウンドメッセージのためのデバッガのスクリーンショットなど)を開きます。

+0

クイック返信をありがとう。私のブローカーは確かに優先度、配送料と時間(有効期限)を送信します。私はJIRAの問題を作成し、あなたと共有します。 SpringでJMSExpirationのヘッダーを設定する必要がありますか教えてください。 testMessageBuilder.setHeader( "timeToLive"、30L)のようなものです。また、JMSヘッダープロパティとSpringヘッダープロパティを持つSpringのドキュメントもありますか。 – Selvakumar

+0

これらは、spring-jmsの 'JmsHeaders'クラスの定数として定義されています.Javadocsは、それらがマップする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またはexpirationを追加/再取得するためのフィールドは表示されません。私は現在、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

返信いただきありがとうございます。私の上流は、優先順位、配送モード、時間制限(期限切れ)を送信します。私は配信モードとタイムアウトヘッダーパススルーのための独自の実装を提供するように見えます。最小のヘッダーでテストアプリケーションを作成し、ログを共有します。どうもありがとう ! – Selvakumar

関連する問題