2017-03-24 4 views

答えて

0

すべてのバックReference Manualへの道のりを歩んでみましょう第一に:

より前のバージョン4.3に、AMQP担保チャンネルはSerializableをペイロードとヘッダとメッセージをサポート。メッセージ全体が変換され(シリアル化され)、RabbitMQに送信されました。これで、extract-payload属性(またはJava構成を使用するときはsetExtractPayload())をtrueに設定できます。このフラグがtrueの場合、メッセージ・ペイロードは変換され、ヘッダーは、チャネル・アダプターを使用する場合と同様の方法でマップされます。これにより、AMQPでバックアップされたチャネルをシリアル化可能でないペイロード(おそらく、Jackson2JsonMessageConverterなどの別のメッセージコンバータ)と一緒に使用することができます。デフォルトのマップされたヘッダーについては、11.12項「AMQPメッセージヘッダー」で説明しています。 outbound-header-mapperおよびinbound-header-mapper属性を使用してカスタムマッパーを提供することによって、マッピングを変更できます。 amqp_deliveryModeヘッダーがない場合に配信モードを設定するために使用されるdefault-delivery-modeも指定できるようになりました。デフォルトでは、Spring AMQP MessagePropertiesはPERSISTENT配信モードを使用します。

したがって、通常(デフォルトで)Amqp.channel(connectionFactory)は、Message<?>全体をターゲットキューに送信します。一方Amqp.outboundAdapter(amqpTemplate)は正反対ん - bodyとヘッダに​​をマップ:

if (this.amqpTemplate instanceof RabbitTemplate) { 
     MessageConverter converter = ((RabbitTemplate) this.amqpTemplate).getMessageConverter(); 
     org.springframework.amqp.core.Message amqpMessage = MappingUtils.mapMessage(requestMessage, converter, 
       getHeaderMapper(), getDefaultDeliveryMode()); 
     addDelayProperty(requestMessage, amqpMessage); 
     ((RabbitTemplate) this.amqpTemplate).send(exchangeName, routingKey, amqpMessage, correlationData); 
} 

AMQP担保チャンネルがpersistenceを目的とされ、メッセージの内容に依存しているロジックで使用すべきではありません。

+0

つまり、ウサギにメッセージを送信してフローを終了させたい場合は '.handle()'を使います。メッセージの途中で(同じアプリケーション内のコンポーネント間で)永続化する必要がある場合は、 'channel()'を使用してください。アプリケーション間でメッセージを配信するにはチャネルを使用しないでください(複数のアプリケーションインスタンスがある場合はそれらを使用することをお勧めしますが、各インスタンスが独自のキューを取得しない限り、同じインスタンスが送信メッセージを受け取るという保証はありません)。 –

+0

両方の説明に感謝します。 – roborative

+1

となります。私の場合は、複数のインスタンスが作業を分割できるように、プロセスの段階を分割しようとしています。あなたが言っていることと[docs](http://docs.spring.io/spring-integration/reference/html/amqp.html#amqp-channels)に基づいて、私はこれを達成するためにチャネルアダプタを使用すべきだと思います。 – roborative

関連する問題