SpringIntegration:Service-Activator没有调用方法

时间:2012-12-20 11:20:43

标签: spring spring-integration

我想从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: [class org.springframework.integration.service.MessageExaminer]类型的目标对象没有合格的方法来处理消息。

我在这里做错了什么?

但是,如果我只是将它用作ServiceMsg类中的一个方法 - 那么有效:

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

我的目标是在Service-Activator方法中掌握Message本身,Payload和Headers。

1 个答案:

答案 0 :(得分: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
}