Как предотвратить блокировку Spring AMQP на непрочитанных сообщениях?

У меня есть @RabbitListener аннотированный метод, для которого Spring AMQP блокируется после возврата из метода. Основной SimpleRabbitListenerContainerFactory использования AcknowledgeMode.MANUAL, Я пока не хочу подтверждать сообщение в методе слушателя.

Есть ли способ не иметь Spring AMQP блок в таком сценарии?

Более подробно

Я использую слушателя, как это:

@RabbitListener(queues = "#{ @myQueue }")
void recordRequestsFromMyMessages(
        @Payload MyMessage myMessagePayload,
        @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,
        Channel channel) {

    // record relevant parts of the given message and combine them with
    // parts from previous/future messages
    // DON'T acknowledge the consumed message, yet; instead only keep a
    // record of the channel and the delivery tag
}

Поскольку я пакетирую / объединяю несколько сообщений до того, как на самом деле обработаю их (асинхронно) позже, я не хочу сразу подтверждать использованное сообщение. Вместо этого я хочу сделать это только после того, как сообщения были успешно обработаны позже.

С моим текущим подходом Spring AMQP блокирует после возврата из вызова recordRequestsFromMyMessages выше, и больше сообщений из той же очереди больше не потребляется.

Этот SO ответ предполагает, что пакетная обработка должна работать, однако я не уверен, как это сделать.

1 ответ

Решение

Это не контейнер, который "блокирует".

Вам нужно увеличить prefetchCount в контейнере (по умолчанию 1) - брокер допускает выдачу только того количества непрочитанных сообщений.

Другие вопросы по тегам