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 容器:
- 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
问题是由 ThreadPoolTaskExecutor 引起的,并且线程每分钟被召回一次。
为了解决这个问题,我删除了 RabbitMQ Connection Factory 上的 Executor 设置。
connectionFactory.setExecutor(asyncTaskExecutor);已移除
connectionFactory 是 CachingConnectionFactory
也许我可以继续调整 ThreadPoolTaskExecutor 以增强行为。
以下是threadpool的详细信息
corePoolSize = 1;
maxPoolSize = Integer.MAX_VALUE;
queueCapacity = 1;
setWaitForTasksToCompleteOnShutdown(true);
我有一个应用程序 运行正在 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 容器:
- 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
问题是由 ThreadPoolTaskExecutor 引起的,并且线程每分钟被召回一次。 为了解决这个问题,我删除了 RabbitMQ Connection Factory 上的 Executor 设置。 connectionFactory.setExecutor(asyncTaskExecutor);已移除 connectionFactory 是 CachingConnectionFactory
也许我可以继续调整 ThreadPoolTaskExecutor 以增强行为。
以下是threadpool的详细信息
corePoolSize = 1;
maxPoolSize = Integer.MAX_VALUE;
queueCapacity = 1;
setWaitForTasksToCompleteOnShutdown(true);