Добрый день.
Инфраструктура:
- РИБ, Розница 2.2. Через RMQ обменивается пока один магазин. База на узле - серверная, postgresql.
- В узле одна очередь на прием, другая на отправку.
- Тип точки публикации – direct, features – durable.
- Интервал ожидания – 60с, частота пульса – 30с.
Проблема: после получения сообщения из RMQ оно переходит в Unacked. То есть получено, но не подтверждено. Но еще до окончания обработки сообщение становится непринятым (из колонки "Unacked" переходит в "Ready").
Типовой код процедуры получения сообщений:
В цикле получаем сообщения, вычленяем тело сообщения, передаем в обработку. В методе " ОбработатьСообщение " вызывается функционал БСП по обмену с РИБ. Сообщения могут быть достаточно большие, т.к. выгружаются большие документы. Соответственно, метод " ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции) " может выполняться достаточно долго, вплоть до 1 часа и более.
И вот когда метод « ПланыОбмена.ПрочитатьИзменения() » находится в процессе выполнения, сообщение из «Unacked» в какой-то момент (по наблюдением – примерно через минуту-две) переходит в «Ready». При этом фоновое задание получение сообщений выполняется и новых не стартует. И когда все же метод « ПланыОбмена.ПрочитатьИзменения() » отработает и таки загрузит сообщение, то, естественно, произойдет ошибка подтверждения при выполнении метода Клиент.BasicAck(), потому что уже нет сообщений для подтверждения. То есть в базу сообщение загружено, но возвращается обратно в очередь, а значит будет загружать повторно.
Заметил, что «откат» сообщения в очередь до обработки происходит, когда соединение RabbitMQ с узлом отваливается (вкладка Connections в админке). Хотя, по идее, ЧастотаПульса (HeartBeat) должна обеспечивать постоянное соединение, пока сообщение уже получено, но еще не подтверждено, насколько я понимаю. Причем с небольшими сообщениями проблем нет – 2 дня обмен шел идеально.
Итак, главный вопрос в том, почему сообщение, даже если долго обрабатывается после получения, не дожидается окончания обработки приложением?