クラス MessageListenerAdapter

  • 実装されたすべてのインターフェース:
    MessageListenerChannelAwareMessageListener

    public class MessageListenerAdapter
    extends AbstractAdaptableMessageListener
    柔軟なメッセージ型変換を使用して、リフレクションを介してメッセージの処理をターゲットリスナーメソッドに委譲するメッセージリスナーアダプター。リスナーメソッドが Rabbit API から完全に独立して、メッセージコンテンツ型を操作できるようにします。

    デフォルトでは、受信 Rabbit メッセージのコンテンツは、ターゲットリスナーメソッドに渡される前に抽出されます。これにより、ターゲットメソッドは、生の Message ではなく、文字列やバイト配列などのメッセージコンテンツ型を操作できるようになります。メッセージ型の変換は Spring AMQ MessageConverter に委譲されます。デフォルトでは、SimpleMessageConverter が使用されます。(このような自動メッセージ変換を行わない場合は、必ず MessageConverter を null に設定してください。)

    ターゲットリスナーメソッドが null 以外のオブジェクト (通常は String やバイト配列などのメッセージコンテンツ型) を返す場合、Rabbit Message にラップされ、受信メッセージの交換に送信されます。Rabbit ReplyTo プロパティまたは specified routingKey 経由)。

    : レスポンスメッセージの送信は、ChannelAwareMessageListener エントリポイントを使用する場合にのみ使用できます (通常は Spring メッセージリスナーコンテナーを介して)。MessageListener としての使用は、レスポンスメッセージの生成をサポートしませ

    このアダプタークラスに準拠するメソッドシグネチャーの例を以下に示します。この最初の例では、すべての Message 型を処理し、各 Message 型の内容を引数として渡します。これらのメソッドはすべて void を返すため、Message は返送されません。

     public interface MessageContentsDelegate {
            void handleMessage(String text);
    
            void handleMessage(Map map);
    
            void handleMessage(byte[] bytes);
    
            void handleMessage(Serializable obj);
     }
     
    次の例では、Message 型を処理し、実際の (生の) Message を引数として渡します。ここでも、これらのメソッドはすべて void を返すため、Message は返されません。
     public interface RawMessageDelegate {
            void handleMessage(Message message);
     }
     
    この次の例は、Messages の String コンテンツを使用するだけの Message デリゲートを示しています。Message 処理メソッドの名前が original とどのように異なるかにも注意してください(これは、適切な Bean 定義で構成する必要があります)。この場合も、メソッドが void を返すため、Message は返送されません。
     public interface TextMessageContentDelegate {
            void onMessage(String text);
     }
     
    この最後の例は、Messages の String コンテンツを使用するだけの Message デリゲートを示しています。このメソッドの戻り値の型が String であることに注意してください。これにより、構成済みの MessageListenerAdapter がレスポンスとして Message を送信します。
     public interface ResponsiveTextMessageContentDelegate {
            String handleMessage(String text);
     }
     
    さらなる例と議論については、このクラス (およびそれに付随する XML 構成) について詳しく説明している Spring リファレンスドキュメントを参照してください。
    作成者:
    Juergen Hoeller, Mark Pollack, Mark Fisher, Dave Syer, Gary Russell, Greg Turnquist, Cai Kun
    関連事項:
    setDelegate(java.lang.Object), setDefaultListenerMethod(java.lang.String), AbstractAdaptableMessageListener.setResponseRoutingKey(String), AbstractAdaptableMessageListener.setMessageConverter(org.springframework.amqp.support.converter.MessageConverter), SimpleMessageConverter, ChannelAwareMessageListener, AbstractMessageListenerContainer.setMessageListener(MessageListener)
    • フィールドの詳細

      • ORIGINAL_DEFAULT_LISTENER_METHOD

        public static final StringSE ORIGINAL_DEFAULT_LISTENER_METHOD
        デフォルトのリスナーメソッド "handleMessage" のすぐに使える値。
        関連事項:
        定数フィールド値
    • コンストラクターの詳細

      • MessageListenerAdapter

        public MessageListenerAdapter()
        デフォルト設定で新しい MessageListenerAdapter を作成します。
      • MessageListenerAdapter

        public MessageListenerAdapter​(ObjectSE delegate)
        指定されたデリゲートの新しい MessageListenerAdapter を作成します。
        パラメーター:
        delegate - デリゲートオブジェクト
      • MessageListenerAdapter

        public MessageListenerAdapter​(ObjectSE delegate,
                                      MessageConverter messageConverter)
        指定されたデリゲートの新しい MessageListenerAdapter を作成します。
        パラメーター:
        delegate - デリゲートオブジェクト
        messageConverter - 使用するメッセージコンバーター
      • MessageListenerAdapter

        public MessageListenerAdapter​(ObjectSE delegate,
                                      StringSE defaultListenerMethod)
        POJO メソッドも宣言しながら、指定されたデリゲートの新しい MessageListenerAdapter を作成します。
        パラメーター:
        delegate - デリゲートオブジェクト
        defaultListenerMethod - メッセージ受信時に呼び出す POJO メソッドの名前
    • メソッドの詳細

      • setDelegate

        public void setDelegate​(ObjectSE delegate)
        リスニングするメッセージを委譲するターゲットオブジェクトを設定します。指定したリスナーメソッドは、このターゲットオブジェクトに存在する必要があります。

        明示的なデリゲートオブジェクトが指定されていない場合、リスナーメソッドは、このアダプターインスタンス(つまり、このアダプターのカスタムサブクラス)に存在し、リスナーメソッドを定義することが想定されています。

        パラメーター:
        delegate - デリゲートリスナーまたは POJO。
      • getDelegate

        protected ObjectSE getDelegate()
        戻り値:
        リッスンするメッセージをデリゲートするターゲットオブジェクト。
      • getDefaultListenerMethod

        protected StringSE getDefaultListenerMethod()
        戻り値:
        デリゲート先のデフォルトリスナーメソッドの名前。
      • setQueueOrTagToMethodName

        public void setQueueOrTagToMethodName​(MapSE<StringSE,​StringSE> queueOrTagToMethodName)
        キュー名またはコンシューマータグのマッピングをメソッド名に設定します。最初のルックアップはキュー名によるもので、null が返された場合はコンシューマータグでルックアップされ、null が返された場合は defaultListenerMethod が使用されます。
        パラメーター:
        queueOrTagToMethodName - 地図。
        導入:
        1.5
      • addQueueOrTagToMethodName

        public void addQueueOrTagToMethodName​(StringSE queueOrTag,
                                              StringSE methodName)
        キュー名またはコンシューマータグのマッピングをメソッド名に追加します。最初のルックアップはキュー名によるもので、null が返された場合はコンシューマータグでルックアップされ、null が返された場合は defaultListenerMethod が使用されます。
        パラメーター:
        queueOrTag - キュー名またはコンシューマータグ。
        methodName - メソッド名。
        導入:
        1.5
      • removeQueueOrTagToMethodName

        public StringSE removeQueueOrTagToMethodName​(StringSE queueOrTag)
        キュー名またはコンシューマータグからメソッド名へのマッピングを削除します。
        パラメーター:
        queueOrTag - キュー名またはコンシューマータグ。
        戻り値:
        削除されたメソッド名、または null。
        導入:
        1.5
      • onMessage

        public void onMessage​(Message message,
                              com.rabbitmq.client.Channel channel)
                       throws ExceptionSE
        Spring ChannelAwareMessageListener エントリポイント。

        メッセージ引数を適切に変換して、メッセージをターゲットリスナーメソッドに委譲します。ターゲットメソッドが null 以外のオブジェクトを返す場合は、Rabbit メッセージをラップして送り返します。

        パラメーター:
        message - 受信 Rabbit メッセージ
        channel - 動作する Rabbit チャネル
        例外:
        ExceptionSE - Rabbit API メソッドによってスローされた場合
      • getListenerMethodName

        protected StringSE getListenerMethodName​(Message originalMessage,
                                               ObjectSE extractedMessage)
        指定されたメッセージを処理するリスナーメソッドの名前を決定します。

        デフォルトの実装では、最初に queueOrTagToMethodName マップを調べて、コンシューマーキューまたはコンシューマータグで一致を探します。一致が見つからない場合は、構成されたデフォルトのリスナーメソッドを返すか、構成されていない場合は "handleMessage" を返します。

        パラメーター:
        originalMessage - Rabbit リクエストメッセージ
        extractedMessage - 変換された Rabbit リクエストメッセージ。引数としてリスナーメソッドに渡されます
        戻り値:
        リスナーメソッドの名前 (非 null)
        関連事項:
        setDefaultListenerMethod(java.lang.String), setQueueOrTagToMethodName(java.util.Map<java.lang.String, java.lang.String>)
      • buildListenerArguments

        protected ObjectSE[] buildListenerArguments​(ObjectSE extractedMessage,
                                                  com.rabbitmq.client.Channel channel,
                                                  Message message)
        ターゲットリスナーメソッドに渡される引数の配列を作成します。単一のメッセージオブジェクトから複数のメソッド引数を作成できるようにします。

        デフォルトの実装では、指定されたメッセージオブジェクトを唯一の要素として配列を構築します。つまり、抽出されたメッセージは、たとえそれが配列であっても、常に単一のメソッド引数に渡され、ターゲットメソッドには対応する配列の型の単一の引数が宣言されます。

        これをオーバーライドして、配列などの特別なメッセージコンテンツを異なる方法で処理することができます。たとえば、メッセージ配列の各要素を個別のメソッド引数として渡します。

        パラメーター:
        extractedMessage - メッセージの内容
        channel - 動作する Rabbit チャネル
        message - 受信 Rabbit メッセージ
        戻り値:
        リスナーメソッドに渡される引数の配列 (個別のメソッド引数に対応する配列の各要素)