我一直在将我的开发环境从 Linux 转移到 Mac,突然间我面临着奇怪的 RabbitMQ 行为。
我有 Ubuntu 盒子,在上面运行 RabbitMQ 2.8.7-1,我在同一个盒子上做了开发工作。我一直在运行我的测试代码(如下所示),Rabbit 很高兴收到所有消息。
// using spring-rabbit 1.1.1.RELEASE
AmqpTemplate amqpTemplate = (AmqpTemplate) context.getBean("amqpTemplate");
amqpTemplate.convertAndSend("bar.queue", "Foo message");
现在我搬到了 Mac 机器(主机 A),我在其中运行带有 Linux 的 VirtualBox(主机 B),在该机器上运行 RabbitMQ,其配置与以前的 Linux 机器相同。我在 Mac 上运行我的开发环境,它在 VM 中调用 Rabbit :)。但是什么也没来,所以我使用 Wireshark 来追踪通信,这似乎还可以:
. . . .
B > A: Connection.Start
A > B: Connection.Start-Ok
B > A: Connection.Tune
A > B: Connection.Tune-Ok
A > B: Connection.Open
B > A: Connection.Open-Ok
A > B: Channel.Open
B > A: Channel.Open-Ok
A > B: Basic.Publish (bar.queue)
A > B: Content-Header (text/plain)
A > B: Content-Body (Foo message)
A > B: Channel.Close (200-OK)
B > A: [[TCP ACK for Channel.Close]]
. . . .
所以看起来消息已经收到,但可能没有被代理处理?登录客户端也告诉我消息已发布。
17:09:37.450 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'amqpTemplate'
17:09:37.576 [main] DEBUG o.s.a.r.c.CachingConnectionFactory - Creating cached Rabbit Channel from AMQChannel(amqp://guest@hostB:5672/,1)
17:09:37.611 [main] DEBUG o.s.amqp.rabbit.core.RabbitTemplate - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@hostB:5672/,1)
17:09:37.612 [main] DEBUG o.s.amqp.rabbit.core.RabbitTemplate - Publishing message on exchange [], routingKey = [bar.queue]
我完全不知道从哪里开始解决问题,为什么它以前可以工作而不是现在,问题可能出在哪里?
编辑:好的,我尝试从 RabbitMQ 教程中实现简单的发送器,它看起来像挂在 close() 上,因为应用程序仍在运行并且未到达 close() 之后的代码。
channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);
channel.close();
// this is never reached and app still running :-o
conn.close();