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

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