リスナーエンドポイントアノテーションを有効にする
@RabbitListener アノテーションのサポートを有効にするために、@EnableRabbit を @Configuration クラスの 1 つに追加できます。次の例は、その方法を示しています。
@Configuration
@EnableRabbit
public class AppConfig {
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
factory.setContainerCustomizer(container -> /* customize the container */);
return factory;
}
} バージョン 2.0 以降、DirectMessageListenerContainerFactory も利用できます。DirectMessageListenerContainer インスタンスを作成します。
SimpleRabbitListenerContainerFactory と DirectRabbitListenerContainerFactory の選択に役立つ情報については、コンテナーの選択を参照してください。 |
バージョン 2.2.2 以降では、ContainerCustomizer 実装を提供できます (上記を参照)。これは、コンテナーを作成して構成した後で、コンテナーをさらに構成するために使用できます。たとえば、これを使用して、コンテナーファクトリによって公開されていないプロパティを設定できます。
バージョン 2.4.8 は、複数のカスタマイザーを適用したい状況のために CompositeContainerCustomizer を提供します。
デフォルトでは、インフラストラクチャーは、ファクトリがメッセージリスナーコンテナーを作成するために使用するソースとして、rabbitListenerContainerFactory という名前の Bean を探します。この場合、RabbitMQ インフラストラクチャの設定を無視して、processOrder メソッドを 3 スレッドのコアポーリングサイズと 10 スレッドの最大プールサイズで呼び出すことができます。
リスナーコンテナーファクトリをカスタマイズして各アノテーションで使用することも、RabbitListenerConfigurer インターフェースを実装して明示的にデフォルトを設定することもできます。デフォルトは、特定のコンテナーファクトリを指定せずにエンドポイントが少なくとも 1 つ登録されている場合にのみ必要です。詳細と例については、Javadoc を参照してください。
コンテナーファクトリは、メッセージを受信した後 (リスナーを呼び出す前) および応答を送信する前に適用される MessagePostProcessor インスタンスを追加するためのメソッドを提供します。
応答については、返信管理を参照してください。
バージョン 2.0.6 以降では、リスナーコンテナーファクトリに RetryTemplate と RecoveryCallback を追加できます。これらは応答の送信時に使用されます。RecoveryCallback は再試行回数が上限に達したときに呼び出されます。
XML 構成を好む場合は、<rabbit:annotation-driven> 要素を使用できます。@RabbitListener でアノテーションが付けられたすべての Bean が検出されます。
SimpleRabbitListenerContainer インスタンスの場合、次のような XML を使用できます。
<rabbit:annotation-driven/>
<bean id="rabbitListenerContainerFactory"
class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="concurrentConsumers" value="3"/>
<property name="maxConcurrentConsumers" value="10"/>
</bean>DirectMessageListenerContainer インスタンスの場合、次のような XML を使用できます。
<rabbit:annotation-driven/>
<bean id="rabbitListenerContainerFactory"
class="org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="consumersPerQueue" value="3"/>
</bean> バージョン 2.0 以降、@RabbitListener アノテーションには concurrency プロパティがあります。SpEL 式 (#{…}) とプロパティプレースホルダー (${…}) をサポートしています。その意味と許可される値は、次のようにコンテナーの種類によって異なります。
DirectMessageListenerContainerの場合、値はコンテナーのconsumersPerQueueプロパティを設定する単一の整数値である必要があります。SimpleRabbitListenerContainerの場合、値はコンテナーのconcurrentConsumersプロパティを設定する単一の整数値にするか、m-nの形式にすることができます。ここで、mはconcurrentConsumersプロパティで、nはmaxConcurrentConsumersプロパティです。
いずれの場合も、この設定は提供時の設定を上書きします。以前は、異なる同時実行性を必要とするリスナーがある場合、異なるコンテナーファクトリを定義する必要がありました。
このアノテーションにより、autoStartup および executor (2.2 以降) のアノテーションプロパティを介して、ファクトリ autoStartup および taskExecutor プロパティをオーバーライドすることもできます。それぞれに異なるエグゼキューターを使用すると、ログとスレッドダンプで各リスナーに関連付けられているスレッドを特定するのに役立つ場合があります。
バージョン 2.2 では、コンテナーファクトリの acknowledgeMode プロパティをオーバーライドできる ackMode プロパティも追加されました。
@RabbitListener(id = "manual.acks.1", queues = "manual.acks.1", ackMode = "MANUAL")
public void manual1(String in, Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
...
channel.basicAck(tag, false);
}