我有一个在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经理的截图:
Docker容器:
答案 0 :(得分:0)
问题是由ThreadPoolTaskExecutor引起的,并且每分钟都会调用该线程。 为了解决这个问题,我删除了在RabbitMQ连接工厂上设置Executor。 connectionFactory.setExecutor(asyncTaskExecutor);已移除 connectionFactory是CachingConnectionFactory
我可以继续调整ThreadPoolTaskExecutor以增强行为 以下是threadpool的详细信息
corePoolSize = 1;
maxPoolSize = Integer.MAX_VALUE;
queueCapacity = 1;
setWaitForTasksToCompleteOnShutdown(true);