Docker上的Spring和RabbitMQ预取问题

时间:2018-02-01 23:17:22

标签: java docker jvm rabbitmq spring-amqp

我有一个在Tomcat,java 8和Linux上运行的应用程序。我已设法将应用程序移植到Docker Container并在Docker上运行Tomcat。我已经意识到当正在发送给RabbitMQ的消息没有被应用程序在第一个初始化时获取,而应该总是在同一个队列中有第二个消息,以便消费者从队列中获取它们。 / p>

应用程序在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经理的截图:

enter image description here

Docker容器:

  • linux:16.04
  • 的java:8
  • 的Tomcat:8
  • RabbitMQ 3.6.5,Erlang 18.3
  • Spring-amqp版本:1.7.6.RELEASE
  • Docker Engine:17.12.0-ce

1 个答案:

答案 0 :(得分:0)

问题是由ThreadPoolTask​​Executor引起的,并且每分钟都会调用该线程。 为了解决这个问题,我删除了在RabbitMQ连接工厂上设置Executor。 connectionFactory.setExecutor(asyncTaskExecutor);已移除 connectionFactory是CachingConnectionFactory

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

corePoolSize = 1;

maxPoolSize = Integer.MAX_VALUE;

queueCapacity = 1;

setWaitForTasksToCompleteOnShutdown(true);