我想从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。
答案 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
}