Чтение сообщений из очереди в 1С


#1
  1. С помощью демо-консоли из поставки компоненты записываем в кролика несколько сообщений
  2. В веб-интерфейсе кролика видим что они появились там
  3. При чтении в демо-консоли из поставки компоненты пытаемся читать сообщения, но удается прочитать только первое сообщение, а остальные исчезают

Версия компоненты 1.8


#2

Как происходит подписка и чтение всех сообщений из очереди, лучше посмотреть в ПолучениеСообщенийСлужебный.ПолучитьСообщение()

В данном случае нет цикла. Должно быть Пока Получатель.ПолучитьСообщение()

А вот что теряются остальные сообщения, это забавно :slight_smile:
Тут вся соль думаю вот здесь: Компонента.НачатьЧтение(ИмяОчереди, ИмяОчереди) я чето в доке не вижу, какие параметры по умолчанию ставятся компонентой…
Если ставится no_ack и prefetch > 1, то вполне могут и теряться сообщения.
Но это конечно мои догадки.


#3

У вас запущен Консьмюер (подписчик) без подтверждений. Он именно так и работает, в любом клиенте на любом языке. Вы запросили пачку сообщений с сервера, он вам их все отдал. Вы прочитали не все, ну ок. Сервер-то свое дело сделал. Чтобы отдавалось только одно сообщение надо настроить prefetchCount для консьюмера.


#4

т.е. код Компонента.ПолучитьСообщение (…) - читает не одно, а ВСЕ сообщения из очереди?
или же Компонента.НачатьЧтение(…) - забирает все сообщения из очереди, а Компонента.ПолучитьСообщение (…) - прочитывает первое сообщение, как и должно?


#5

Когда вы подключаетесь к серверу ЛЮБЫМ клиентом amqp, вы передаете параметр prefetch count. Он означает размер пачки, которую сервер отдает клиенту при запросе сообщений. Если ack отключен, то всю пачку надо обработать, т.к. сервер просто о даст ее и забудет.