ActiveMQ:分派的队列包含的消息多于预取大小

时间:2018-12-14 11:52:47

标签: spring-integration activemq spring-integration-dsl

我将预取大小设置为1(URL中的jms.prefetchPolicy.all = 1)。在Web控制台中,我可以看到所有消费者的预取值为1。一位消费者卡住了,他的调度队列中有67条消息-请参阅我的screenshot

您能帮助我理解它怎么发生吗?我已经阅读了很多有关此的文章,我的理解是调度队列的大小应该达到预取大小?!

我使用以下配置来消耗队列中的消息:

ConnectionFactory getActiveMQConnectionFactory() {
    // Configure the ActiveMQConnectionFactory
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
    activeMQConnectionFactory.setBrokerURL(brokerUrl);
    activeMQConnectionFactory.setUserName(user);
    activeMQConnectionFactory.setPassword(password);
    activeMQConnectionFactory.setNonBlockingRedelivery(true);

    // Configure the redeliver policy and the dead letter queue
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setInitialRedeliveryDelay(initialRedeliveryDelay);
    redeliveryPolicy.setRedeliveryDelay(redeliveryDelay);
    redeliveryPolicy.setUseExponentialBackOff(useExponentialBackOff);
    redeliveryPolicy.setMaximumRedeliveries(maximumRedeliveries);
    RedeliveryPolicyMap redeliveryPolicyMap = activeMQConnectionFactory.getRedeliveryPolicyMap();
    redeliveryPolicyMap.put(new ActiveMQQueue(thumbnailQueue), redeliveryPolicy);
    activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);
    return activeMQConnectionFactory;
}

public IntegrationFlow createThumbnailFlow(String concurrency, CreateThumbnailReceiver receiver) {
    return IntegrationFlows.from(
            Jms.messageDrivenChannelAdapter(
                    Jms.container(getActiveMQConnectionFactory(), thumbnailQueue)
                            .concurrency(concurrency)
                            .sessionTransacted(true)
                            .get()
            ))
            .transform(new JsonToObjectTransformer(CreateThumbnailRequest.class, jsonObjectMapper()))
            .handle(receiver)
            .get();
}

1 个答案:

答案 0 :(得分:0)

问题是由代理(5.14.5)和客户端(5.15.3)版本之间的差异引起的。升级后,代理分发的调度队列最多包含2条消息。