リスナーエンドポイントアノテーションを有効にする

@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);
}