BITERP / PinkRabbitMQ

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

Не удается организовать чтение сообщений #18

Open bf0rce opened 4 years ago

bf0rce commented 4 years ago

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

Пример выполняемого кода.

Потребитель = Клиент.BasicConsume(Параметры.Очередь, "", Истина, Ложь, 0);
// После этого вызова Потребитель = ""
// Второй параметр не влияет на дальнейший результат.

Пока Клиент.BasicConsumeMessage(Потребитель, ОтветноеСообщение, ТегСообщения, 1) Цикл
    // В цикл не заходит.
    ОтветноеСообщение = ""; // Обнуляем, чтобы избежать утечку памяти
    ТегСообщения = 0; // Обнуляем, чтобы избежать утечку памяти
КонецЦикла;
ripreal commented 4 years ago

Не является ошибкой. Потребитель - это не реализованный параметр API. (см документацию.) Он всегда будет пустой строкой. А сообщения не приходят из очереди потому что слишком маленький таймаут в методе Клиент.BasicConsumeMessage. Рекомендуется ставить хотя бы 3000 (3 секунды) для маленьких сообщений.

bf0rce commented 4 years ago

Исправил так, но все равно не получает.

Пока Клиент.BasicConsumeMessage("", ОтветноеСообщение, ТегСообщения, 30000) Цикл

В результате исполнение этой строки занимает 30 секунд и отладчик внутри цикла не останавливается. Подключенного потребителя на стороне RabbitMQ не видно.

Большее значение таймаута нецелесообразно, так как получение того же сообщения через HTTP занимает 69 мс.

ripreal commented 4 years ago

Значит в этой очереди нет сообщений, либо коннекта с сервером раббита нет. Нужно в веб-интерефейсе RAbbitMQ посмотреть, чтобы на закладках Connections и channels были активные элементы в момент вызова метода BasicConsumeMessage()

bf0rce commented 4 years ago

Да, есть там сообщение. Я одно забрал через HTTP (для проверки настроек соединения на форме), а второе компонента не забирает (с теми же настройками, что примечательно). И потребителя подключенного не видно. 2020-02-11_12-25-11

Видимо, где-то есть какая-то опция, которая не позволяет компоненте зарегистрировать потребителя, что и ведет к 30 секундному таймауту при вызове метода BasicConsumeMessage().

Если интересно, я могу и обработку целиком прикрепить. Может быть, проблема где-то в другом месте моего кода.

ripreal commented 4 years ago

Да, нужна обработка. Желательно, чтобы в ней также программно создавались точки обмена и очереди с нужными свойствами

bf0rce commented 4 years ago

Обработка и скриншот. RabbitMQ_Console.zip

2020-02-16_17-16-32