Повторное создание очереди и повторное подключение к rabbitMQ
Вовлеченные компоненты: Spring Config-сервер, Spring AMQP (RabbitMQ), Spring Config-клиент
Цель: использовать push-уведомление, чтобы сообщить клиенту конфигурации, чтобы обновить конфигурацию.
- Экземпляр RabbitMQ. Из док-станции я вытащил образ управления rabbitmq:3 и запустился.
Конфигурация клиента AMQP версия pom.xml:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> <version>1.3.1.RELEASE</version> </dependency>
Конфиг-сервер pom.xml:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-monitor</artifactId> <version>1.3.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> <version>1.2.1.RELEASE</version> </dependency>
Сценарий отказоустойчивости:- Отключить службу / кластер / экземпляр RabbitMQ. - Весь клиент конфигурации теряет связь. Очереди удаляются, так как они были созданы как автоудаления. - Верните сервис RabbitMQ.
Ожидание: все клиенты конфигурации должны повторно подключиться успешно.
Реальность: это не работает. Пожалуйста, смотрите ниже ошибку.
2018-03-27 09: 07: 12.850 ПРЕДУПРЕЖДЕНИЕ 21251 --- [AO2Q06fYCALSA-6] osarlistener.BlockingQueueConsumer: Не удалось объявить очередь:springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA 2018-03-27 09:07:12.81 --- ER AO2Q06fYCALSA-6] osarlSimpleMessageListenerContainer: потребитель получил фатальное исключение при запуске
org.springframework.amqp.rabbit.listener.QueuesNotAvailableException: не удается подготовить очередь для прослушивателя. Либо очередь не существует, либо брокер не позволит нам ее использовать. по адресу org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:548) по адресу org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessbjserjConvice.lang.Thread.run(Thread.java:844) Вызвано: org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclaException: Не удалось объявить очередь (я):[springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCwork.spr. atS].amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:621) в org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start (блокирующий QueueConsumer.javaExjected.java frames: 20): 5: ноль
Вызывается: com.rabbitmq.client.ShutdownSignalException: ошибка канала; Метод протокола: #method(код ответа =404, текст ответа =NOT_FOUND - нет очереди 'springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA' в vhost '/', идентификатор класса =50, идентификатор метода =10)
[общие кадры опущены]. Причина: com.rabbitmq.client.ShutdownSignalException: ошибка канала; Метод протокола: #method(код ответа =404, текст ответа =NOT_FOUND - нет очереди 'springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA' в vhost '/', идентификатор класса =50, идентификатор метода =10) в com.rabbitmq. client.impl.ChannelN.asyncShutdown (ChannelN.java:505)
[общие рамки опущены]
2018-03-27 09: 07: 12.852 ОШИБКА 21251 --- [AO2Q06fYCALSA-6] osarlSimpleMessageListenerContainer: Остановка контейнера от прерванного потребителя 2018-03-27 09:07:12.853 INFO 21251 --- [AO2Q06fYCALSA-6] osarlSistener для рабочих, чтобы закончить. 2018-03-27 09:07:12.853 ИНФОРМАЦИЯ 21251 --- [AO2Q06fYCALSA-6] osarlSimpleMessageListenerContainer: Успешно ожидание завершения работниками.
- Описание ошибки из моего понимания клиента конфигурации с использованием существующего посредника, прослушиватель попытался восстановить соединение, но очередь отсутствует. Делает 3 попытки по умолчанию. Это ожидается, поскольку мы проходим сценарий, когда служба Rabbit MQ не работает и перезапускается без постоянных данных. Проблема в том, что переподключение не удалось. Из многих статей я знаю, что упоминается, что мы не можем переопределить очередь без использования admin. Для этого мы создадим XML-файл конфигурации, который создает бины свойств, объявляющие admin и другие вещи.
Что за вопрос?- Будет ли это идеально, если все это позаботиться, как по умолчанию. ** Также у меня все еще нет рабочего решения. НУЖНА ПОМОЩЬ"
1 ответ
Я только что протестировал его с Boot 2.0 и Finchley.M9 (шина 2.0.0.M7) без проблем...
2018-03-27 13: 25: 06.125 INFO 36716 --- [main] csbrpRabbitExchangeQueueProvisioner: объявление очереди для входящего: springCloudBus.anonymous.tySvAS8BSpS7OtQ_VCeiVQ, привязанного к: springCloudBus
...
2018-03-27 13: 26: 38.220 ОШИБКА 36716 --- [ 127.0.0.1:5672] osarcCachingConnectionFactory: отключение канала: ошибка подключения; Метод протокола: #method(код ответа =320, текст ответа =CONNECTION_FORCED - принудительное закрытие соединения брокером по причине "завершение", идентификатор класса =0, идентификатор метода = 0)
2018-03-27 13: 26: 58.757 INFO 36716 --- [pS7OtQ_VCeiVQ-6] osarcCachingConnectionFactory: Попытка подключиться к: [localhost: 5672]
2018-03-27 13: 26: 58.761 INFO 36716 --- [pS7OtQ_VCeiVQ-6] osarcCachingConnectionFactory: создано новое соединение: rabbitConnectionFactory#52c8295b:5/SimpleConnection@74846ead [делегат =amqp://guest@127.0.0:, localPort = 49746]
2018-03-27 13: 26: 58.762 INFO 36716 --- [pS7OtQ_VCeiVQ-6] osamqp.rabbit.core.RabbitAdmin: автоматическое объявление недолговечной, автоматически удаляемой или исключительной очереди (springCloudBus.anonymous.tySvAS8BSpS7OtQ_Vei) длительный: ложь, автоудаление: правда, эксклюзив: правда. Он будет объявлен повторно, если посредник остановится и перезапустится, пока фабрика соединений активна, но все сообщения будут потеряны.
RabbitExchangeQueueProvisioner
явно устанавливает RabbitAdmin
повторно объявить очередь после восстановления соединения.
Сейчас попробую со старыми версиями...
РЕДАКТИРОВАТЬ
Тот же результат с загрузкой 1.5.10 и Edgware.SR3 (шина 1.3.3.RELEASE).
EDIT2
Тот же самый результат со стартером шины 1.3.1 (приносит кролика потока 1.2.1). Работает отлично.