PinkRabbitMQ icon indicating copy to clipboard operation
PinkRabbitMQ copied to clipboard

Компоненты не читает сообщения при повторном начале чтения в цикле

Open ripreal opened this issue 5 years ago • 4 comments

Описание: Если запустить последовательно в рамках одной сессии 2 цикла чтения сообщения, то второй цикл не прочитает ни одного сообщения, даже если они есть в очереди Способ обхода: Заново инициализировать компоненту при повторном чтении

Псевдокод:

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

            КлиентКомпоненты.BasicCancel("");
        Исключение
            ВызватьИсключение КлиентКомпоненты.GetLastError();
        КонецПопытки;
    Исключение
        СистемнаяОшибка = ОписаниеОшибки();
        ТекстСообщения = "Ошибка чтения сообщения!%СистемнаяОшибка%";
        ТекстСообщения = СтрЗаменить(ТекстСообщения, "%СистемнаяОшибка%", СистемнаяОшибка);
        ВызватьИсключение ТекстСообщения;
    КонецПопытки;
    
КонецПроцедуры

ripreal avatar Dec 16 '19 09:12 ripreal

v1.9: Повторная инициализация не помогает.

RIS2000 avatar Sep 23 '20 10:09 RIS2000

@RIS2000 А перед повторной инициализацией старая компонента выгружается через Компонента = Неопределено?

ripreal avatar Sep 23 '20 17:09 ripreal

@RIS2000 А перед повторной инициализацией старая компонента выгружается через Компонента = Неопределено?

Да.

Так же имеется следующее поведение: Если не делать BasicCancel("") после первого цикла, то второй читает. И при окончании очереди BasicCancel("") после второго цикла вешает наглухо.

RIS2000 avatar Sep 24 '20 11:09 RIS2000

Наблюдаю ту же проблему, релиз 1.9. Если получить клиент компоненты и попытаться обойти двумя циклами две очереди, то читает только первую очередь. При чтении из второй очереди BasicConsumeMessage возвращает false. Перед обходом каждой очереди вызываю Connect, после обхода очереди - BasicCancel. Но у меня работает способ обхода: 1) получить клиент компоненты, 2) обойти одну очередь (с Connect и BasicCancel), 3) КлиентКомпоненты = Неопределено, 4) повторить для второй очереди вместе с повторным получением клиента.

Плюк к тому КлиентКомпоненты = Неопределено без предварительного BasicCancel() вешает 1С.

avdunaev1 avatar Feb 16 '21 10:02 avdunaev1