Spring 和 Docker 上的 RabbitMQ 预取问题

Spring and RabbitMQ prefetch issue on Docker

我有一个应用程序 运行正在 Tomcat、java 8 和 Linux 上运行。我已经成功地将应用程序移植到 Docker Container 和 运行 Tomcat on Docker。我已经意识到,当发送到 RabbitMQ 的消息最初没有被应用程序获取时,同一个队列中应该始终有第二条消息,以便消费者从队列中获取它们。

应用程序写在Spring 4 上,RabbitMQ 在容器之外。令人沮丧的部分是,当我 运行 VM 上的应用程序时,同一个应用程序可以工作,而当队列中有多个消息时,消费者将获取。 预取设置为 1,相同的配置适用于 VM Linux。然而在 Docker 这不起作用。你们知道 Docker 容器上的此类问题吗?

rabbitMQ 管理向我显示了 0 个 Ready,1 个 UnAcked 和 1 个。 这可能是 JVM 在 Docker 上的行为吗?

这是来自 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 容器:

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

也许我可以继续调整 ThreadPoolTask​​Executor 以增强行为。
以下是threadpool的详细信息

corePoolSize = 1;

maxPoolSize = Integer.MAX_VALUE;

queueCapacity = 1;

setWaitForTasksToCompleteOnShutdown(true);