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