![](/img/trans.png)
[英]How to receive all the prefetch rabbitmq messages using spring framework?
[英]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容器:
此問題是由ThreadPoolTaskExecutor引起的,並且每分鍾都會調用一次該線程。 為了解決該問題,我刪除了RabbitMQ Connection Factory上的Executor設置。 connectionFactory.setExecutor(asyncTaskExecutor); 刪除了connectionFactory是CachingConnectionFactory
也許我可以繼續調整ThreadPoolTaskExecutor以增強行為。
以下是線程池的詳細信息
corePoolSize = 1;
maxPoolSize = Integer.MAX_VALUE;
queueCapacity = 1;
setWaitForTasksToCompleteOnShutdown(true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.