Как предотвратить блокировку 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) - брокер допускает выдачу только того количества непрочитанных сообщений.