Встал вопрос о том, что неплохо бы предусмотреть пакетирование сообщений принятых из реббита, и конечно же сразу подумалось про параметр prefetch count, который позволяет получать на клиента сразу необходимое количество сообщений из очереди.
Решили попробовать, и стало непонятно, а как нам получить из очереди несколько сообщений, обработать и отдать им всем после этого ack?
Например такой код:
Компонента = ОчередьСообщений.ПолучитьЭкземплярКомпоненты();
КлючПотребителя = Компонента.НачатьЧтение(“testqueue”, , Ложь, , 5);
Данные = Неопределено;
Пока Компонента.ПолучитьСообщение(КлючПотребителя, Данные, 1*1000) Цикл
Сообщить(Данные);
Компонента.ПодтвердитьСообщение();
КонецЦикла;
Работает так, что после каждого подтвержденного сообщения, на клиент приезжает еще одно и так продолжается до полной вычитки.
Если убрать из этого кода
Компонента.ПодтвердитьСообщение();
то вычитываем 5, останавливаемся по таймауту, серверу уходит noack и уже не можем отослать 5 подтверждений, как написано в документации:
Отсылает серверу подтверждение (ack), что сообщение обработано и его можно удалить.
В API жестко зашит порядок обработки сообщений. Подтвердить можно только последнее прочитанное сообщение.
Таким образом, если prefetchCount больше единицы, то отправлять ack нужно по принципу LIFO (стеком).
Как это должно работать? Кто нибудь пользовался?