我正在尝试在Java Spring框架中创建一个RabbitMq使用者。我需要实现RabbitMq RPC模型,所以基本上消费者应该从RabbitMq代理接收一些消息,处理它,并将其发送回相关的回复队列。
有人可以给我一个简洁的示例代码,在Spring中实现这个要求吗?
提前致谢。
答案 0 :(得分:1)
考虑使用Spring AMQP Project。
请参阅documentation about async consumers。您只需要实现POJO方法并使用MessageListenerAdapter
(在使用XML配置时默认插入) - 如果您的POJO方法返回结果,框架将自动将回复发送到入站消息中的replyTo ,可以是简单的队列名称,也可以是exchange/routingKey
。
<rabbit:listener-container connection-factory="rabbitConnectionFactory">
<rabbit:listener queues="some.queue" ref="somePojo" method="handle"/>
</rabbit:listener-container>
public class SomePojo {
public String handle(String in) {
return in.toUpperCase();
}
}
或者,您可以再次使用POJO中的注释@RabbitListener
,请参阅the documentation。
答案 1 :(得分:0)
谢谢Gary,它对我有用。我使用了@RabbitListener注释。
奇怪的是,它仅在我单独提供队列时才有效,但是指定交换,路由密钥和队列的绑定并不起作用。不知道这里有什么问题。
以下是python中的客户端代码段。
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='myQueue',durable='true')
channel.basic_publish(exchange='myExchange',
routing_key='rpc_queue',
body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()
这是春季消费者代码。
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "myQueue", durable = "true"),
exchange = @Exchange(value = "myExchange"),
key = "rpc_queue")
)
public void processOrder(Message message) {
String messageBody= new String(message.getBody());
System.out.println("Received : "+messageBody);
}
不确定此绑定是否出错。