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
からの変換、Message
から RabbitTemplate
への変換を参照してください。
RabbitTemplate
を使用して、専用チャネルで複数の操作を実行できるようになりました。詳細については、範囲指定された操作を参照してください。
リスナーアダプター
MessageListenerAdapter
でラムダを使用するには、便利な FunctionalInterface
を使用できます。詳細については、MessageListenerAdapter
を参照してください。
リスナーコンテナーの変更
プリフェッチのデフォルト値
以前のプリフェッチのデフォルト値は 1 であり、効率的なコンシューマーが十分に活用されない可能性がありました。デフォルトのプリフェッチ値は 250 になりました。これにより、ほとんどの一般的なシナリオでコンシューマーがビジーになり、スループットが向上します。
プリフェッチ値を低くする必要があるシナリオがあります。たとえば、大きなメッセージで、特に処理が遅い場合 (メッセージがクライアントプロセスで大量のメモリを追加する可能性がある場合)、および厳密なメッセージの順序付けが必要な場合 (この場合、プリフェッチ値を 1 に戻す必要があります)。また、少量のメッセージングと複数のコンシューマー (単一のリスナーコンテナーインスタンス内での同時実行を含む) では、プリフェッチを減らして、コンシューマー間でメッセージをより均等に分散させたい場合があります。 |
プリフェッチの背景について詳しくは、RabbitMQ でのコンシューマーの使用 (英語) に関するこの投稿とキューイング理論 (英語) に関するこの投稿を参照してください。
メッセージ数
以前は、コンテナーによって発行されたメッセージに対して MessageProperties.getMessageCount()
は 0
を返しました。このプロパティは、basicGet
を使用する場合 (たとえば、RabbitTemplate.receive()
メソッドから) にのみ適用され、コンテナーメッセージの null
に初期化されるようになりました。
トランザクションのロールバック動作
トランザクションマネージャーが構成されているかどうかに関係なく、トランザクションロールバックでのメッセージの再キューイングが一貫したものになりました。詳細については、受信メッセージのロールバックに関する注意を参照してください。
シャットダウン動作
コンテナースレッドが shutdownTimeout
内のシャットダウンに応答しない場合、チャネルはデフォルトで強制的に閉じられます。詳細については、メッセージリスナーコンテナーの設定を参照してください。
接続ファクトリの変更
接続およびチャネルリスナーインターフェースは、例外に関する情報を取得するメカニズムを提供するようになりました。詳細については、接続リスナーとチャネルリスナーおよび公開は非同期です — 成功と失敗を検出する方法を参照してください。
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 に基づく同様のコンポーネントを使用できます。詳細については、Jackson2JsonMessageConverter
を参照してください。
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
によって発行されます。
詳細については、接続とリソースの管理を参照してください。