簡體   English   中英

Docker上的Spring和RabbitMQ預取問題

[英]Spring and RabbitMQ prefetch issue on Docker

我有一個在Tomcat,java 8和Linux上運行的應用程序。 我設法將應用程序移植到Docker容器並在Docker上運行Tomcat。 我已經意識到,當應用程序最初沒有從應用程序獲取要發送到RabbitMQ的消息時,應該在同一隊列中始終存在第二條消息,以便消費者從隊列中同時獲取它們。

該應用程序是在Spring 4上編寫的,RabbitMQ在容器外部。 令人沮喪的是,當我在VM上運行該應用程序時,該應用程序可以正常工作,而當隊列中有多個消息時,使用者將提取數據。 預取設置為1,並且相同的配置在VM Linux上有效。 但是在Docker上這不起作用。 你們知道Docker容器上的此類問題嗎?

rabbitMQ管理人員向我顯示“就緒”為0,“未激活”為1,總共為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
  • 雄貓:8
  • RabbitMQ 3.6.5,Erlang 18.3
  • Spring-amqp版本:1.7.6.RELEASE
  • Docker引擎:17.12.0-ce

此問題是由ThreadPoolTask​​Executor引起的,並且每分鍾都會調用一次該線程。 為了解決該問題,我刪除了RabbitMQ Connection Factory上的Executor設置。 connectionFactory.setExecutor(asyncTaskExecutor); 刪除了connectionFactory是CachingConnectionFactory

也許我可以繼續調整ThreadPoolTask​​Executor以增強行為。
以下是線程池的詳細信息

corePoolSize = 1;

maxPoolSize = Integer.MAX_VALUE;

queueCapacity = 1;

setWaitForTasksToCompleteOnShutdown(true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM