【发布时间】:2018-07-12 09:39:51
【问题描述】:
我有一个在 Tomcat、java 8 和 Linux 上运行的应用程序。我已经设法将应用程序移植到 Docker 容器并在 Docker 上运行 Tomcat。我已经意识到,当发送到 RabbitMQ 的消息最初没有被应用程序获取时,应该总是在同一个队列中存在第二条消息,以便消费者从队列中获取它们。
应用程序是在 Spring 4 上编写的,并且 RabbitMQ 在容器之外。令人沮丧的部分是,当我在 VM 上运行应用程序时,同一个应用程序可以工作,而当队列中有多个消息时,消费者将获取。 预取设置为 1,并且相同的配置适用于 VM Linux。但是在 Docker 上这不起作用。你们知道 Docker 容器上的此类问题吗?
rabbitMQ 管理显示有 0 个 Ready、1 个 UnAcked 和 1 个。 可能是 Docker 上 JVM 的行为?
这是来自 AMQP Spring 的日志示例:
Retrieving delivery for Consumer@3a6237b3: tags=[{amq.ctag-DRCYJkVeEnTtN94Yuk-7dw=dispatcher.all}], channel=Cached Rabbit Channel: AMQChannel(amqp://user@192.168.1.5:5672/DEV-CI,17), conn: Proxy@45e9797b Shared Rabbit Connection: SimpleConnection@43eb454d [delegate=amqp://user@192.168.1.5/DEV-CI, localPort= 60354], acknowledgeMode=AUTO local queue size=0|BlockingQueueConsumer:nextMessage:499|Pool-Executor-18
这是来自rabbitmq管理器的截图:
Docker 容器:
- linux:16.04
- java:8
- tomcat:8
- RabbitMQ 3.6.5,Erlang 18.3
- Spring-amqp 版本:1.7.6.RELEASE
- Docker 引擎:17.12.0-ce
【问题讨论】:
-
我建议开启 DEBUG 日志并观察消息流。
-
不要在 cmets 中放这样的东西;它以这种格式不可读-改为编辑问题-日志不够;我们需要看到更多。一定有什么东西在消耗消息 - 您可能需要使用网络监视器(如 WireShark)来弄清楚发生了什么。
-
这和你的描述不一样;您的问题说 1 准备好,0 未确认;图像显示 0 准备就绪,1 未确认。同样,需要更多日志来了解为什么您有未确认的消息。您还需要提供有关 RabbitMQ 和 Spring AMQP 版本的信息。
-
我正在使用以下 Loggs。是否有任何其他日志可以监控? org.springframework.amqp.rabbit.listener org.springframework.amqp 同样在上面我提供了版本
-
如果
org.springframework日志没有提供任何线索,你需要用wireshark之类的东西来监控Docker接口——它有一个分析amqp协议的插件。这是well documented on the RabbitMQ site。
标签: java docker jvm rabbitmq spring-amqp