Описание:
Если запустить последовательно в рамках одной сессии 2 цикла чтения сообщения, то второй цикл не прочитает ни одного сообщения, даже если они есть в очереди
Способ обхода:
Заново инициализировать компоненту при повторном чтении
Псевдокод:
Процедура ПрочитатьСообщениеКлиентСервер(КлиентКомпоненты, Форма)
Попытка
КлиентКомпоненты.Connect(
Форма.Адрес,
Форма.Порт,
Форма.Логин,
Форма.Пароль,
Форма.ВиртуальныйХост);
ИмяОчереди = Форма.ИмяОчереди;
ТегСообщения = 0;
Попытка
КлиентКомпоненты.DeclareQueue(ИмяОчереди, Ложь, Ложь, Ложь, Ложь);
Потребитель = КлиентКомпоненты.BasicConsume(ИмяОчереди, "", Истина, Ложь, 0);
ОтветноеСообщение = "";
//Если КлиентКомпоненты.BasicConsumeMessage("", ОтветноеСообщение, 5) Тогда
Если КлиентКомпоненты.BasicConsumeMessage("", ОтветноеСообщение, ТегСообщения,1000) Тогда
КлиентКомпоненты.BasicAck(ТегСообщения);
Форма.ОтветноеСообщение = ОтветноеСообщение;
ТекстСообщения = НСтр("ru='Сообщение успешно прочитано!'");
Иначе
Форма.ОтветноеСообщение = ОтветноеСообщение;
ТекстСообщения = НСтр("ru='Очередь пустая!'");
КонецЕсли;
Сообщить(ТекстСообщения);
// Обнуляем, чтобы избежать утечку памяти
ОтветноеСообщение = "";
ТегСообщения = 0;
КлиентКомпоненты.BasicCancel("");
Исключение
ВызватьИсключение КлиентКомпоненты.GetLastError();
КонецПопытки;
Исключение
СистемнаяОшибка = ОписаниеОшибки();
ТекстСообщения = "Ошибка чтения сообщения!%СистемнаяОшибка%";
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%СистемнаяОшибка%", СистемнаяОшибка);
ВызватьИсключение ТекстСообщения;
КонецПопытки;
КонецПроцедуры
Описание:
Если запустить последовательно в рамках одной сессии 2 цикла чтения сообщения, то второй цикл не прочитает ни одного сообщения, даже если они есть в очереди
Способ обхода:
Заново инициализировать компоненту при повторном чтении
Псевдокод: