RabbitMQ - закрытие незанятых / оборванных каналов

У меня есть многопоточное приложение, которое публикует входящие сообщения на обмен rabbitmq. Используя java-клиент rabbitmq, я создаю одно соединение rabbitmq при запуске приложения и делюсь им со всеми своими потоками. Каждый поток создает новый канал (threadlocal), чтобы каналы не использовались совместно несколькими потоками, как рекомендовано в документации rabbitmq. Я использую netty и вижу, что создается такое же количество каналов rabbitmq, что и потоков конвейера netty. Все идет нормально.

Тем не менее, у меня есть 2 минуты активности в моих потоках netty (мне это нужно, и я не могу его изменить). Итак, если поток простаивает в течение 2 минут, он умирает. Однако канал, связанный с потоком, не уничтожается и остается свободным до закрытия соединения. Таким образом, я получаю увеличивающийся список каналов, которые находятся в состоянии бездействия и никогда не закрываются. Я не нашел в документации rabbitmq ничего, что касалось бы зависших каналов. Есть ли способ закрыть канал, который какое-то время не использовался? Если нет, как лучше всего решить эту проблему?


person NewLight    schedule 22.06.2014    source источник
comment
Вы нашли решение? У меня точно такая же проблема....   -  person Omtechguy    schedule 09.08.2020


Ответы (3)


На самом деле нет возможности закрыть канал из веб-консоли, так как канал привязан к соединению. Итак, что вы можете сделать, это перейти на вкладку Connections, щелкнуть соединение (оно имеет тот же идентификатор, что и канал, поэтому его легко идентифицировать) и на открывшейся странице щелкните Force Close

person Konstantin Chernov    schedule 16.11.2016

Вы можете использовать RabbitMQ Management HTTP API и затем перечислить каналы, а затем просмотреть детали каждого канала, которые вы видите, когда канал неактивен, и отреагировать соответствующим образом, например, закрыв канал.

См. Здесь: http://hg.rabbitmq.com/rabbitmq-management/raw-file/3646dee55e02/priv/www-api/help.html

person old_sound    schedule 23.06.2014
comment
Но как закрыть канал? Возможно, страница, на которую вы указали ссылку, изменилась, но с 16.10.15 она показывает только методы для перечисления каналов, а не методы их закрытия. - person Michael Lang; 16.10.2015
comment
Я не помню, позволяет ли API управления убивать отдельный канал или все соединение. В любом случае, в качестве взлома можно найти Erlang PID канала и убить его. - person old_sound; 16.10.2015
comment
Спасибо за предложение! Я могу найти способы закрыть соединение в админке и api, но не на отдельном канале. - person Michael Lang; 17.10.2015
comment
Чтобы убить канал, вам, вероятно, придется написать код на erlang. Каналы - это просто процессы Erlang - person old_sound; 19.10.2015

У меня было аналогичное требование. Прошло некоторое время, поэтому я не помню, где я нашел информацию об этом. Но вот так я закрыл свой канал.

    if (cancellationToken.IsCancellationRequested)
    {
         logger.InfoFormat("Cancellation requested, stopping case processor.");

         // 320: connection-forced
         channel.Close(320, "Service stopped");
     }
person Rajiv    schedule 14.07.2016