リスナーエンドポイントアノテーションを有効にする
@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
は、再試行が使い果たされると呼び出されます。SendRetryContextAccessor
を使用して、コンテキストから情報を取得できます。次の例は、その方法を示しています。
factory.setRetryTemplate(retryTemplate);
factory.setReplyRecoveryCallback(ctx -> {
Message failed = SendRetryContextAccessor.getMessage(ctx);
Address replyTo = SendRetryContextAccessor.getAddress(ctx);
Throwable t = ctx.getLastThrowable();
...
return null;
});
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);
}