アノテーション付きエンドポイントメソッドシグネチャー

これまでのところ、エンドポイントに単純な String を注入してきましたが、実際には非常に柔軟なメソッドシグネチャーを持つことができます。次の例では、Order にカスタムヘッダーを挿入するように書き換えています。

@Component
public class MyService {

    @RabbitListener(queues = "myQueue")
    public void processOrder(Order order, @Header("order_type") String orderType) {
        ...
    }
}

次のリストは、リスナーエンドポイントのパラメーターと照合するために使用できる引数を示しています。

  • 生の org.springframework.amqp.core.Message

  • 生の Message からの MessageProperties

  • メッセージを受信した com.rabbitmq.client.Channel

  • 受信 AMQP メッセージから変換された org.springframework.messaging.Message

  • @Header - 標準 AMQP ヘッダーを含む特定のヘッダー値を抽出するためのアノテーション付きメソッド引数。

  • @Headers - すべてのヘッダーにアクセスするために java.util.Map にも割り当て可能でなければならないアノテーション付き引数。

  • 変換されたペイロード

サポートされている型 (つまり、MessageMessagePropertiesMessage<?>Channel) の 1 つではないアノテーションなしの要素は、ペイロードと一致します。パラメーターに @Payload のアノテーションを付けることで、それを明示的にすることができます。追加の @Valid を追加して検証をオンにすることもできます。

Spring のメッセージ抽象化を挿入する機能は、トランスポート固有の API に依存することなく、トランスポート固有のメッセージに格納されているすべての情報を利用するのに特に役立ちます。次の例は、その方法を示しています。

@RabbitListener(queues = "myQueue")
public void processOrder(Message<Order> order) { ...
}

メソッド引数の処理は DefaultMessageHandlerMethodFactory によって提供されます。これをさらにカスタマイズして、追加のメソッド引数をサポートできます。変換と検証のサポートもそこでカスタマイズできます。

たとえば、処理する前に Order が有効であることを確認したい場合は、ペイロードに @Valid のアノテーションを付けて、次のように必要なバリデータを構成できます。

@Configuration
@EnableRabbit
public class AppConfig implements RabbitListenerConfigurer {

    @Override
    public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
        registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
    }

    @Bean
    public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
        factory.setValidator(myValidator());
        return factory;
    }
}