仅供参考,我是RabbitMQ的新手。
对于我尝试使用RabbitMQ的应用程序,我有这个用例:
对于上面的场景,我使用了convertSendAndReceive,当生产者和消费者都在同一个RabbitMQ服务器中时,它就像魅力一样。但是当队列被Shoveled时,同样的方法不起作用。
如果我使用了错误的方法/配置,请告诉我w.r.t RabbitMQ。
提前致谢。
添加代码
消费
public static void main(String[] args) throws InterruptedException {
ConnectionFactory cf = new CachingConnectionFactory("10.223.19.89");
// set up the queue, exchange, binding on the broker
RabbitAdmin admin = new RabbitAdmin(cf);
Queue queue = new Queue("myQueue");
Queue queueReply = new Queue("myQueue_reply");
admin.declareQueue(queue);
admin.declareQueue(queueReply);
TopicExchange exchange = new TopicExchange("myExchange");
admin.declareExchange(exchange);
admin.declareBinding(
BindingBuilder.bind(queue).to(exchange).with("foo.*"));
admin.declareBinding(
BindingBuilder.bind(queueReply).to(exchange).with("foo.*"));
SimpleMessageListenerContainer container =
new SimpleMessageListenerContainer(cf);
Object listener = new Object() {
public String handleMessage(String foo) {
return foo + "test";
}
};
MessageListenerAdapter adapter = new MessageListenerAdapter(listener);
container.setMessageListener(adapter);
container.setQueueNames("myQueue");
container.start();
}
生产者
public void run()
{
Thread t = Thread.currentThread();
ConnectionFactory cf = new CachingConnectionFactory("10.223.19.93");
RabbitTemplate template = new RabbitTemplate(cf);
template.setExchange("myExchange");
template.setRoutingKey("foo.bar");
Queue queueReply = new Queue("myQueue_reply");
template.setReplyQueue(queueReply);
Object test = template.convertSendAndReceive("Hello world");
System.out.println(test.toString());
}
public static void main(String[] args) throws InterruptedException {
for(int i=0; i< 5; i++)
{
Thread t = new Thread(new SendReceiveThread());
t.setName("Thread # " + i);
t.start();
Thread.sleep(100);
}
}
答案 0 :(得分:1)
最好的猜测是你需要使用named reply queue并铲除它。
此方案需要<reply-listener/>
。
在rabbitmq 3.4之前,临时队列用于回复;直接回复与3.4及以上版本一起使用,但我的猜测是,兔子没有铲除为此创建的伪队列。
修改强>:
使用固定回复队列并以编程方式创建兔子模板时,必须连接侦听器容器并将模板设置为侦听器。请参阅the documentation。
如果您将RabbitTemplate定义为
<bean/>
,或使用@Configuration
类将其定义为@Bean
,或以编程方式创建模板,您需要自己定义并连接回复侦听器容器。如果您没有这样做,模板将永远不会收到回复,并最终会超时并返回null作为对sendAndReceive方法调用的回复。