1.7 以降の 2.0 の変更点

CachingConnectionFactory を使用する

バージョン 2.0.2 以降では、RabbitTemplate を構成して、リスナーコンテナーで使用される接続とは異なる接続を使用できます。この変更により、プロデューサーが何らかの理由でブロックされた場合に、コンシューマーのデッドロックが回避されます。詳細については、別の接続を使用するを参照してください。

AMQP クライアントライブラリ

Spring AMQP は、RabbitMQ チームが提供する amqp-client ライブラリの新しい 5.0.x バージョンを使用するようになりました。このクライアントには、デフォルトで自動回復が構成されています。RabbitMQ 自動接続 / トポロジリカバリを参照してください。

バージョン 4.0 以降、クライアントはデフォルトで自動回復を有効にします。この機能と互換性がありますが、Spring AMQP には独自の回復メカニズムがあり、通常、クライアント回復機能は必要ありません。ブローカーが使用可能であるが接続がまだ回復していない場合に AutoRecoverConnectionNotCurrentlyOpenException インスタンスを取得しないように、amqp-client 自動回復を無効にすることをお勧めします。バージョン 1.7.1 以降、独自の RabbitMQ 接続ファクトリを明示的に作成して CachingConnectionFactory に提供しない限り、Spring AMQP はそれを無効にします。RabbitConnectionFactoryBean によって作成された RabbitMQ ConnectionFactory インスタンスでも、このオプションはデフォルトで無効になっています。

一般的な変更

ExchangeBuilder は、デフォルトで永続的な交換を構築するようになりました。@QeueueBinding 内で使用される @Exchange アノテーションも、デフォルトで永続的な交換を宣言します。デフォルトで @RabbitListener 内で使用される @Queue アノテーションは、名前付きの場合は永続キューを宣言し、匿名の場合は非永続キューを宣言します。詳細については、キューとエクスチェンジのビルダー API およびアノテーション駆動型のリスナーエンドポイントを参照してください。

削除されたクラス

UniquelyNameQueue は提供されなくなりました。一意の名前で永続的な非自動削除キューを作成することはまれです。このクラスは削除されました。その機能が必要な場合は、new Queue(UUID.randomUUID().toString()) を使用してください。

新しいリスナーコンテナー

DirectMessageListenerContainer は、既存の SimpleMessageListenerContainer と共に追加されました。使用するコンテナーの選択とその構成方法については、コンテナーの選択およびメッセージリスナーコンテナーの設定を参照してください。

Log4j アペンダー

このアペンダーは、log4j のサポートが終了したため、使用できなくなりました。利用可能なログアペンダについては、ロギングサブシステム AMQP アペンダを参照してください。

RabbitTemplate の変更

以前は、非トランザクション RabbitTemplate は、トランザクションリスナーコンテナースレッドで実行されている場合、既存のトランザクションに参加していました。これは深刻なバグでした。ただし、ユーザーはこの動作に依存していた可能性があります。バージョン 1.6.2 以降、コンテナートランザクションに参加するには、テンプレートに channelTransacted ブール値を設定する必要があります。

RabbitTemplate は、リクエストごとに新しいコンシューマーを作成する代わりに、(デフォルトで) DirectReplyToMessageListenerContainer を使用するようになりました。詳細については、RabbitMQ 直接返信を参照してください。

AsyncRabbitTemplate は、直接返信をサポートするようになりました。詳細については、非同期 Rabbit テンプレートを参照してください。

RabbitTemplate および AsyncRabbitTemplate には、ParameterizedTypeReference<T> 引数を取る receiveAndConvert および convertSendAndReceiveAsType メソッドがあり、呼び出し元が結果を変換する型を指定できるようになりました。これは、複雑な型の場合、または型情報がメッセージヘッダーで伝達されない場合に特に役立ちます。Jackson2JsonMessageConverter などの SmartMessageConverter が必要です。詳細については、リクエスト / 応答メッセージ非同期 Rabbit テンプレートRabbitTemplate を使用した Message からの変換[json-complex] を参照してください。

RabbitTemplate を使用して、専用チャネルで複数の操作を実行できるようになりました。詳細については、範囲指定された操作を参照してください。

リスナーアダプター

MessageListenerAdapter でラムダを使用するには、便利な FunctionalInterface を使用できます。詳細については、MessageListenerAdapter を参照してください。

リスナーコンテナーの変更

プリフェッチのデフォルト値

以前のプリフェッチのデフォルト値は 1 であり、効率的なコンシューマーが十分に活用されない可能性がありました。デフォルトのプリフェッチ値は 250 になりました。これにより、ほとんどの一般的なシナリオでコンシューマーがビジーになり、スループットが向上します。

プリフェッチ値を低くする必要があるシナリオがあります。たとえば、大きなメッセージで、特に処理が遅い場合 (メッセージがクライアントプロセスで大量のメモリを追加する可能性がある場合)、および厳密なメッセージの順序付けが必要な場合 (この場合、プリフェッチ値を 1 に戻す必要があります)。また、少量のメッセージングと複数のコンシューマー (単一のリスナーコンテナーインスタンス内での同時実行を含む) では、プリフェッチを減らして、コンシューマー間でメッセージをより均等に分散させたい場合があります。

プリフェッチの背景について詳しくは、RabbitMQ でのコンシューマーの使用 (英語) に関するこの投稿とキューイング理論 (英語) に関するこの投稿を参照してください。

メッセージ数

以前は、コンテナーによって発行されたメッセージに対して MessageProperties.getMessageCount() は 0 を返しました。このプロパティは、basicGet を使用する場合 (たとえば、RabbitTemplate.receive() メソッドから) にのみ適用され、コンテナーメッセージの null に初期化されるようになりました。

トランザクションのロールバック動作

トランザクションマネージャーが構成されているかどうかに関係なく、トランザクションロールバックでのメッセージの再キューイングが一貫したものになりました。詳細については、受信メッセージのロールバックに関する注意を参照してください。

シャットダウン動作

コンテナースレッドが shutdownTimeout 内のシャットダウンに応答しない場合、チャネルはデフォルトで強制的に閉じられます。詳細については、メッセージリスナーコンテナーの設定を参照してください。

メッセージの受信後ポストプロセッサー

afterReceiveMessagePostProcessors プロパティの MessagePostProcessor が null を返す場合、メッセージは破棄されます (適切な場合は確認応答されます)。

接続ファクトリの変更

接続およびチャネルリスナーインターフェースは、例外に関する情報を取得するメカニズムを提供するようになりました。詳細については、接続リスナーとチャネルリスナーおよび公開は非同期です — 成功と失敗を検出する方法を参照してください。

AbstractConnectionFactory からのターゲット RabbitMQ 接続のアプリケーション固有の ID を取り込むために、新しい ConnectionNameStrategy が提供されるようになりました。詳細については、接続とリソースの管理を参照してください。

変更を再試行

MissingMessageIdAdvice は提供されなくなりました。その機能が組み込まれました。詳細については、同期操作の失敗と再試行のオプションを参照してください。

匿名キューの命名

デフォルトでは、AnonymousQueues は、単純な UUID 文字列ではなく、デフォルトの Base64UrlNamingStrategy で名前が付けられるようになりました。詳細については、AnonymousQueue を参照してください。

@RabbitListener の変更

@RabbitListener アノテーションで単純なキュー宣言 (デフォルト交換のみにバインド) を提供できるようになりました。詳細については、アノテーション駆動型のリスナーエンドポイントを参照してください。

例外が送信者に返されるように、@RabbitListener アノテーションを構成できるようになりました。例外を処理するように RabbitListenerErrorHandler を構成することもできます。詳細については、例外の処理を参照してください。

@QueueBinding アノテーションを使用すると、キューを複数のルーティングキーにバインドできるようになりました。また、@QueueBinding.exchange() はカスタム交換型をサポートし、デフォルトで永続的な交換を宣言するようになりました。

異なる同時実行設定のために別のコンテナーファクトリを構成するのではなく、アノテーションレベルでリスナーコンテナーの concurrency を設定できるようになりました。

リスナーコンテナーの autoStartup プロパティをアノテーションレベルで設定し、コンテナーファクトリの既定の設定をオーバーライドできるようになりました。

RabbitListener コンテナーファクトリで、受信後および送信 (応答) の前に MessagePostProcessor インスタンスを設定できるようになりました。

詳細については、アノテーション駆動型のリスナーエンドポイントを参照してください。

バージョン 2.0.3 以降、クラスレベル @RabbitListener の @RabbitHandler アノテーションの 1 つをデフォルトとして指定できます。詳細については、マルチメソッドリスナーを参照してください。

コンテナーの条件付きロールバック

外部トランザクションマネージャー (JDBC など) を使用する場合、コンテナーにトランザクション属性を指定すると、ルールベースのロールバックがサポートされるようになりました。また、トランザクションアドバイスを使用する際の柔軟性も向上しました。詳細については、条件付きロールバックを参照してください。

Jackson 1.x サポートを削除

以前のバージョンでは非推奨であった Jackson 1.x コンバーターと関連コンポーネントが削除されました。Jackson 2.x に基づく同様のコンポーネントを使用できます。詳細については、JSON メッセージコンバーターを参照してください。

JSON メッセージコンバーター

受信 JSON メッセージの TypeId が Hashtable に設定されている場合、デフォルトの変換型は LinkedHashMap になりました。以前は Hashtable でした。Hashtable に戻すには、DefaultClassMapper で setDefaultMapType を使用できます。

XML パーサー

Queue および Exchange XML コンポーネントを解析するときに、id 属性が存在する場合、パーサーは name 属性値を Bean エイリアスとして登録しなくなりました。詳細については、id および name 属性に関する注意を参照してください。

ブロックされた接続

com.rabbitmq.client.BlockedListener を org.springframework.amqp.rabbit.connection.Connection オブジェクトに挿入できるようになりました。また、ConnectionBlockedEvent および ConnectionUnblockedEvent イベントは、ブローカーによって接続がブロックまたはブロック解除されたときに、ConnectionFactory によって発行されます。

詳細については、接続とリソースの管理を参照してください。