2

RabbitMQ キューからメッセージを読み取りたい > Service-Activator を使用してサービスを呼び出します。

関連する構成セクションは次のとおりです。

<int-amqp:inbound-channel-adapter channel="fromRabbit"                                           queue-names="si.test.queue" mapped-request-headers="whatever" 
                                  connection-factory="connectionFactory" />
<int:service-activator input-channel="fromRabbit" output-channel="whatever"
               ref="msgService" method="checkMsg"/>

<bean id="msgService" class="com.whatever.MsgService"/>

MsgService クラスは次のとおりです。

public class MsgService{
//Does not work!
public void checkMsg( @Payload String s) {
    System.out.println("The Payload is: " +s);      
     }

}

しかし、次のエラー メッセージが表示
されます: ... 原因: java.lang.IllegalArgumentException:タイプ [クラス org.springframework.integration.service.MessageExaminer] のターゲット オブジェクトには、メッセージを処理するための適格なメソッドがありません。

ここで何が間違っていますか?

しかし、これを単に ServiceMsg クラスのメソッドとして使用すると、うまくいきます:

public void seeMessage(String m)
    {
        System.out.println(m);
    }

私の目標は、 Service-Activator メソッドでメッセージ自体、ペイロード、およびヘッダーを取得することです。

4

1 に答える 1

2

SpEL 経由で適切なメッセージを取得したい場合は、次を使用できます。

#root

例は

    <int:channel id="quick.channel"/>

    <int:service-activator input-channel="quick.channel" 
        expression="@quickService.process(#root)"/>

これにより、サービス内のメッセージにアクセスできるようになります

    public void process(Message<?> msg) {
        //do something with it
    }

注: これにより、サービス コードが Spring Integration と緊密に結合されます - 本当にそうしますか? ヘッダーとペイロードの組み合わせが必要な場合は、それらを個別の引数としてサービスに渡して、サービスを Spring Integration メッセージ オブジェクトから切り離してみませんか?

お気に入り

<int:service-activator input-channel="quick.channel" 
expression="@quickService.process(headers['headerValue'],payload)"/>

そしてサービスは

public void process(String headerValue,Object payload) {
    //use them together
} 
于 2013-01-03T05:12:05.427 に答える