#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 () мы закрываем вышеупомянутое соединение, которое вызывает завершение работы