AMQP メッセージヘッダー
概要
Spring Integration AMQP アダプターは、すべての AMQP プロパティとヘッダーを自動的にマッピングします。(これは 4.3 からの変更です - 以前は、標準ヘッダーのみがマップされていました)。デフォルトでは、これらのプロパティは、DefaultAmqpHeaderMapper (Javadoc) を使用して Spring Integration MessageHeaders との間でコピーされます。
アダプターには、それをサポートするプロパティがあるため、AMQP 固有のヘッダーマッパーの独自の実装を渡すことができます。
DefaultAmqpHeaderMapper の requestHeaderNames または replyHeaderNames プロパティによって明示的に否定されない限り、AMQP MessageProperties (Javadoc) 内のユーザー定義ヘッダーは AMQP メッセージとの間でコピーされます。デフォルトでは、送信マッパーの場合、x-* ヘッダーはマップされません。理由については、このセクションで後述する注意を参照してください。
デフォルトを上書きして 4.3 より前の動作に戻すには、プロパティで STANDARD_REQUEST_HEADERS および STANDARD_REPLY_HEADERS を使用します。
ユーザー定義のヘッダーをマッピングする場合、値には、照合する単純なワイルドカードパターン(thing* や *thing など)も含めることができます。* はすべてのヘッダーに一致します。 |
バージョン 4.1 から、AbstractHeaderMapper (DefaultAmqpHeaderMapper スーパークラス)により、NON_STANDARD_HEADERS トークンを(既存の STANDARD_REQUEST_HEADERS および STANDARD_REPLY_HEADERS に加えて) requestHeaderNames および replyHeaderNames プロパティ用に構成して、すべてのユーザー定義ヘッダーをマップできます。
org.springframework.amqp.support.AmqpHeaders クラスは、DefaultAmqpHeaderMapper によって使用されるデフォルトヘッダーを識別します。
amqp_appIdamqp_clusterIdamqp_contentEncodingamqp_contentLengthcontent-type(contentTypeヘッダーを参照してください)amqp_correlationIdamqp_delayamqp_deliveryModeamqp_deliveryTagamqp_expirationamqp_messageCountamqp_messageIdamqp_receivedDelayamqp_receivedDeliveryModeamqp_receivedExchangeamqp_receivedRoutingKeyamqp_redeliveredamqp_replyToamqp_timestampamqp_typeamqp_userIdamqp_publishConfirmamqp_publishConfirmNackCauseamqp_returnReplyCodeamqp_returnReplyTextamqp_returnExchangeamqp_returnRoutingKeyamqp_channelamqp_consumerTagamqp_consumerQueue
このセクションで前述したように、すべてのヘッダーをコピーする一般的な方法は、* のヘッダーマッピングパターンを使用することです。ただし、特定の RabbitMQ 独自のプロパティ / ヘッダーもコピーされるため、予期しない副作用が生じる可能性があります。例: federation (英語) を使用する場合、受信したメッセージには、メッセージを送信したノードを含む x-received-from という名前のプロパティがある場合があります。ワイルドカード文字 * を受信ゲートウェイのリクエストおよびリプライヘッダーマッピングに使用すると、このヘッダーがコピーされ、フェデレーションで問題が発生する可能性があります。この応答メッセージは送信ブローカーにフェデレートされ、メッセージがループしていると見なされ、結果としてメッセージを表示せずにドロップする場合があります。ワイルドカードヘッダーマッピングの便利な機能を使用する場合は、ダウンストリームフローの一部のヘッダーを除外する必要がある場合があります。例: x-received-from ヘッダーを返信にコピーしないようにするために、AMQP 受信ゲートウェイに返信を送信する前に <int:header-filter … header-names="x-received-from"> を使用できます。または、ワイルドカードを使用する代わりに、実際にマップしたいプロパティを明示的にリストすることもできます。これらの理由により、受信メッセージの場合、マッパーは(デフォルトで) x-* ヘッダーをマップしません。また、受信メッセージから送信メッセージへのヘッダーの伝搬を回避するために、deliveryMode を amqp_deliveryMode ヘッダーにマップしません。代わりに、このヘッダーは amqp_receivedDeliveryMode にマップされますが、出力にはマップされません。 |
バージョン 4.3 以降、ヘッダーマッピング内のパターンは、パターンの前に ! を付加することで否定できます。否定されたパターンは優先されるため、STANDARD_REQUEST_HEADERS,thing1,ba*,!thing2,!thing3,qux,!thing1 のようなリストは thing1 (thing2 と thing3 も同様)をマッピングしません。標準ヘッダーに加え、bad と qux がマッピングされます。この否定手法は、たとえば、受信側のダウンストリームで JSON デシリアライゼーションロジックが異なる方法で実行される場合、受信メッセージの JSON 型ヘッダーをマッピングしないといった場合に便利です。この目的のためには、受信チャネルアダプター / ゲートウェイのヘッダーマッパーに !json_* パターンを設定する必要があります。
マッピングしたい ! で始まるユーザー定義ヘッダーがある場合、次のように \ でエスケープする必要があります: STANDARD_REQUEST_HEADERS,\!myBangHeader。!myBangHeader という名前のヘッダーがマップされました。 |
バージョン 5.1 以降、対応する amqp_messageId または amqp_timestamp ヘッダーが送信メッセージに存在しない場合、DefaultAmqpHeaderMapper は、それぞれ MessageHeaders.ID および MessageHeaders.TIMESTAMP から MessageProperties.messageId および MessageProperties.timestamp へのマッピングにフォールバックします。受信プロパティは、以前と同様に amqp_* ヘッダーにマップされます。メッセージコンシューマーがステートフルリトライを使用している場合は、messageId プロパティを設定すると便利です。 |
contentType ヘッダー
他のヘッダーとは異なり、AmqpHeaders.CONTENT_TYPE には amqp_ というプレフィックスが付いていません。これにより、異なるテクノロジー間で contentType ヘッダーを透過的に渡すことができます。例: RabbitMQ キューに送信される受信 HTTP メッセージ。
contentType ヘッダーは Spring AMQP の MessageProperties.contentType プロパティにマッピングされ、その後 RabbitMQ content_type プロパティにマッピングされます。
バージョン 5.1 より前のバージョンでは、このヘッダーは MessageProperties.headers マップのエントリとしてもマッピングされていましたが、これは誤りであり、さらに、基盤となる Spring AMQP メッセージコンバーターがコンテンツ型を変更する可能性があるため、値が誤っている可能性がありました。このような変更はファーストクラスの content_type プロパティには反映されますが、RabbitMQ ヘッダーマップには反映されませんでした。受信マッピングでは、ヘッダーマップの値は無視されました。contentType は、ヘッダーマップのエントリにマッピングされなくなりました。