Java 持有消息的AMQP使用者(侦听器适配器和SimpleMessageListenerContainer)
最近,我们遇到了这样一种情况:消息被消费者从队列中接收,但没有到达绑定到该队列的侦听器。我们之所以能够做出这个断言,是因为我们的侦听器上有一个没有为这些消息触发的拦截器(它打印日志消息)。当我们重新启动服务器(tomcat)时,消息被消费并确认Java 持有消息的AMQP使用者(侦听器适配器和SimpleMessageListenerContainer),java,rabbitmq,amqp,spring-amqp,Java,Rabbitmq,Amqp,Spring Amqp,最近,我们遇到了这样一种情况:消息被消费者从队列中接收,但没有到达绑定到该队列的侦听器。我们之所以能够做出这个断言,是因为我们的侦听器上有一个没有为这些消息触发的拦截器(它打印日志消息)。当我们重新启动服务器(tomcat)时,消息被消费并确认 我们想知道这种行为的原因。我们分析了线程转储,但没有成功。此类问题总是由以下两个问题之一引起的: 容器线程“卡在”用户代码中 某些网络组件(如路由器)会静默关闭其认为空闲的连接,这样客户端和/或服务器就不会意识到该连接已关闭 你似乎已经排除了第一个(
我们想知道这种行为的原因。我们分析了线程转储,但没有成功。此类问题总是由以下两个问题之一引起的:
- 容器线程“卡在”用户代码中
- 某些网络组件(如路由器)会静默关闭其认为空闲的连接,这样客户端和/或服务器就不会意识到该连接已关闭
您可以在连接上启用心跳,以避免网络认为连接处于空闲状态。请参阅RabbitMQ文档。如果能看到有关此问题的配置和调试日志,那将非常好。在日志中,请告诉我们,您确定应该在哪里使用消息。嗨,Gary,我们在连接上设置了心跳,我们确信情况并非如此,因为此连接上的其他侦听器工作得非常好。只有在某些队列中,消息才会被卡住,正如所说的,这些消息已经到达消费者端,但侦听器尚未接收到。当您指出这种行为只有两个原因时,我们将再次查看线程转储。