Приемник RabbitMQ не завершает работу

#java #rabbitmq

#java #rabbitmq

Вопрос:

У меня есть основные сомнения по поводу RabbitMQ. Я прочитал пример программы в https://www.rabbitmq.com/tutorials/tutorial-two-java.html

   public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    **Connection connection = factory.newConnection();
    Channel channel = connection.createChannel()**;

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    System.out.println(" [*] Waiting for messages. To exit press CTRL C");

  }
}
 

В нем говорится, что мы не должны использовать оператор try-with-resource для автоматического закрытия канала и соединения, но вместо этого мы должны писать так, как указано.

Но я сомневаюсь, почему программа не завершается после выполнения System.out.println(» [*] Ожидает сообщений. Для выхода нажмите CTRL C»);, я не смог увидеть цикл ожидания / ожидания в коде.

Я знаю, что мне не хватает некоторой базовой информации, но я пока не смог этого выяснить.

Ответ №1:

Программа не закрылась автоматически, поскольку RabbitMQ выполняет задачи асинхронно. Connection И Channel открыты.

Это потому, что мы не использовали «оператор try-with-resource». Без этого нам нужно закрыть соединение и канал вручную.

Цитируя страницу, которую вы упомянули: RabbitMQ Tutorial 1: Java

В случае издателя:

Мы можем использовать оператор try-with-resources, потому что оба Connection и Channel реализуют java.io.Closeable . Таким образом, нам не нужно явно закрывать их в нашем коде

Приемник (относится к рассматриваемому здесь классу):

Почему бы нам не использовать оператор try-with-resource для автоматического закрытия канала и соединения? Поступая таким образом, мы просто заставили бы программу двигаться дальше, закрыть все и выйти! Это было бы неудобно, потому что мы хотим, чтобы процесс оставался в живых, пока потребитель асинхронно прослушивает поступающие сообщения.

Редактировать: добавление ссылки для моего комментария к этому ответу: java-daemon-thread

Комментарии:

1. Спасибо за ответ. Часть, которая мне непонятна, заключается в том, что в библиотеке должна быть какая-то часть, которая выполняет процесс ожидания, верно? Я ищу эту часть. Аналогично части, в которых говорится, что соединение закрыто, поэтому вам больше не нужно ждать

2. @nantitv Я не думаю, что был бы метод, специально написанный для ожидания выполнения. Программа Java завершается, когда завершается последний поток, не связанный с демоном, или вы вызываете System exit() .

3. @prashanthI просмотрел некоторые части исходного кода RabitMQ и понял, как это происходит. Это в com.rabbitmq.client.impl. AMQConnection. Существует основной поток, который зацикливается до завершения работы. while (_running) { Frame frame = _frameHandler.readFrame(); readFrame(frame); }. С помощью autclosable в методе close () мы закрываем вышеупомянутое соединение, которое вызывает завершение работы