BITERP / PinkRabbitMQ

Внешняя Native API компонента для взаимодействия с RabbitMQ из 1С
MIT License
264 stars 107 forks source link

Сообщения удаляются из очереди, хотя делаю BasicReject(ID) #64

Open aleksandrchernyaev opened 2 years ago

aleksandrchernyaev commented 2 years ago

При обработке, все сообщения удаляются из очереди, хотя я их не АSKаю, использую метод BasicReject(ID). После выполнения данного кода, все сообщения удаляются из очереди, хотя необходимо, чтобы они вернулись назад в очередь.

Пример кода:

Клиент  = PinkRabbitMQ_Подключиться();

ИмяОчереди = "q.site.1c.test";

Попытка
    //Клиент.DeclareQueue(ИмяОчереди, Ложь, Истина, Ложь, Ложь);
    Потребитель = Клиент.BasicConsume(ИмяОчереди, "", Ложь, Ложь, 1);
    Сообщение = ""; //Первоначально задаем параметры
    ID = 0;     //Первоначально задаем параметры
    Пока Клиент.BasicConsumeMessage("", Сообщение, ID, 5000) Цикл
        // Начало Обработчика сообщения
        Сообщить("Успешно! Из очереди прочитано сообщение " + Сообщение);
        // Конец Обработчика сообщения

        Клиент.BasicReject(ID);
        Сообщение = ""; // Обнуляем, чтобы избежать утечку памяти
        ID = 0; // Обнуляем, чтобы избежать утечку памяти
    КонецЦикла;
    Клиент.BasicCancel("");
Исключение
    Сообщить(Клиент.GetLastError());
КонецПопытки;
Magister commented 2 years ago

Тоже заметил. При этом если не делать Reject то сообщения остаются.

aleksandrchernyaev commented 2 years ago

Пробовал не делать Reject, тогда на следующем сообщении В "Пока Клиент.BasicConsumeMessage("", Сообщение, ID, 5000) Цикл" Клиент.BasicConsumeMessage("", Сообщение, ID, 5000) возращает ЛОЖЬ и прекращается обход сообщений.

Т.е. не пробегает по всем сообщениям, как будто они закончились!

Magister commented 2 years ago

Странно, но у меня работает. Правда использую версию 1.10.

rkablukov commented 2 years ago

image В веб-интерфейсе есть два варианта Reject-а. Насколько я понимаю requeue true возвращает сообщение в очередь, а requeue false удаляет сообщение из очереди. Следовательно в библиотечной функции BasicReject видимо нужно реализовать ещё один параметр, который бы и отвечал за возможность возвращать сообщение в очередь.

korableg commented 2 years ago

image В веб-интерфейсе есть два варианта Reject-а. Насколько я понимаю requeue true возвращает сообщение в очередь, а requeue false удаляет сообщение из очереди. Следовательно в библиотечной функции BasicReject видимо нужно реализовать ещё один параметр, который бы и отвечал за возможность возвращать сообщение в очередь.

Кажется, что эта фича лишняя для компоненты. В 1С обычно из кролика данные сначала грузятся в какой-нибудь регистр сведений (справочник) и тут либо подтвердил либо нет. Сценарий с requeue: true нужен если допустим пятисотит какой-нибудь http/grpc запрос и нужно заново переставить в очередь чтобы повторно обработать. В любом случае интересен ваш сценарий использования.