【问题标题】:Spring and RabbitMQ prefetch issue on DockerDocker 上的 Spring 和 RabbitMQ 预取问题
【发布时间】: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


【解决方案1】:

这个问题是由 ThreadPoolTask​​Executor 引起的,线程每分钟都会被召回。 为了解决这个问题,我删除了 RabbitMQ Connection Factory 上的设置 Executor。 connectionFactory.setExecutor(asyncTaskExecutor);已移除 connectionFactory 是 CachingConnectionFactory

也许我可以继续调整 ThreadPoolTask​​Executor 以增强行为。
下面是线程池的详细介绍

corePoolSize = 1;

maxPoolSize = Integer.MAX_VALUE;

queueCapacity = 1;

setWaitForTasksToCompleteOnShutdown(true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多