|
|
Опубликовано 09.04.2018 10:23:21
|
|
|
|

По умолчанию сообщения очереди rabbitMQ не сохраняются на жёстком диске, поэтому после перезапуска сервиса rabbitMQ сообщения будут теряны.
Сохранение очередей
Например, определяется сохранение очередиDurableis установлен в true, то есть это постоянная очередь, затем после перезапуска сервиса он также будет существовать, потому что сервис хранит сохраняющуюся очередь на жёстком диске, а при перезагрузке сервис восстановит ранее сохраненную очередь. Очередь может сохраняться, но остаются ли сообщения внутри — зависит от настроек сохранения сообщения. Другими словами, если в очереди не было отправлено сообщение до перезапуска, то сохранение исходного сообщения в очереди после перезапуска зависит от настроек сообщения, возникших при отправке. Если вы хотите, чтобы сообщения оставались постоянными после перезагрузки, необходимо установить идентичность сохранения сообщения.
Настройте сохранение очереди:
Четвёртый параметр метода, autoDelete, обычно вводится как false. В документации этот параметр описывается, если он верен, то есть если очередь больше не используется (не подписана), сервер её удалит. Во время тестирования, пока все получатели очереди смены соединения отключены, очередь удаляется, даже если в ней остались необработанные сообщения. Перезапуски RabbitMQ тоже их удалят. Если введено false, сервис не удалит очередь, и сообщения в очереди будут существовать, если все подключённые к нему клиенты отключены. Отправитель также может вставлять сообщения в очередь изменений, когда нет клиентского соединения, и когда клиент подключается, он получает эти сообщения. Однако если сервис RabbitMQ перезапущен, очередь исчезнет, и сообщения в ней естественным образом исчезнут.
Третий параметр является эксклюзивным, и в документации указано, что если это верно, то соединение очереди прервано, и очередь удаляется, включая сообщения внутри.
Второй параметр, устойчивый, описан в документации как такой, что если верно, он представляет собой постоянную очередь, которая также будет существовать после перезапуска сервиса. Потому что сервис хранит постоянную очередь на жёстком диске, и при перезагрузке сервис подтверждает эту очередь. Конечно, это должно быть, когда и autoDelet, и эксклюзив — ложные. Очередь может сохраняться, но остаются ли сообщения внутри — зависит от настроек сохранения сообщения. Другими словами, если в очереди до перезапуска всё ещё были отправлены сообщения, то сохранение исходного сообщения в очереди после перезапуска зависит от настроек отправителя для сообщения при отправке.
После изменения кода мы пытаемся его запустить, и ошибка будет следующей:
Необработанное исключение: RabbitMQ.Client.Exceptions.OperationInterruptedException: Операция AMQP была прервана: AMQP close-reason, инициирована Peer, code=406, text="PRECONDITION_FAILED - inequivalent arg 'durable' для очереди 'hello' в vhost 'myserver': получено 'true', но текущий 'false'", classId=50, methodId=10, cause=
Потому что мы определили несохраняемую очередь под названием hello. RabbitMQ не позволяет переопределять существующие очереди с разными настройками параметров.
Существует два решения:
1: Повторное объявление очереди с другим именем, например, my_queue 2: Удалите определённую очередь «привет» с адресом http://localhost:15672 и войдите с именем пользователя и паролем. Пароль и имя пользователя по умолчанию для RabbitMQ — гостевый. Нажмите на столбец «очередь», чтобы увидеть список очередей, нажмите на очередь «привет», чтобы расширить детали очереди. Перетяните страницу в конец — там есть элемент «Удалить», нажмите на него, нажмите кнопку «Удалить очередь», и вы сможете удалить очередь. Затем, когда код запускается, создаётся hello queue, поддерживающая сохранение.
Сохранение сообщений
Если вы хотите, чтобы сообщение оставалось постоянным после перезагрузки, необходимо установить его на сохранение. Настройка — когда отправитель отправляет сообщение, что относительно просто, и код выглядит следующим образом:
DeliveryMode по умолчанию установлен на 1, не постоянный, а при 2 сообщение остаётся персистентным
После изменения кода мы пытаемся открыть только программу producer для отправки сообщений, затем перезапускаем сервис rabbitMQ, снова открываем потребитель и обнаруживаем, что сообщение не потеряно.
(Конец)
Прилагается исходный код на C#:
Туристы, если вы хотите увидеть скрытое содержание этого поста, пожалуйста Ответ
|
Предыдущий:Исключение: «StrongTypingException: IsPrima...Следующий:Введение к делегатам C# (делегат, Действие, Func, предикат)
|