Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 44647|Ответ: 8

[WinForm] rabbitMQ Queue Queue Message Persistence [с исходным кодом]

[Скопировать ссылку]
Опубликовано 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, предикат)
Опубликовано 09.04.2018 13:17:51 |
Учитесь учиться
Опубликовано 25.06.2019 23:22:47 |
Учитесь учиться
Опубликовано 29.06.2019 9:36:23 |
Почему я не увидел демо, нужно ответить, чтобы увидеть
Опубликовано 09.07.2019 17:34:42 |
Мне нужен исходный код на C#
Опубликовано 24.07.2019 14:21:51 |
Это хорошо, это именно то, что мне нужно
Опубликовано 11.04.2020 14:34:54 |
Учитесь
Опубликовано 01.01.2022 14:45:24 |
1111111111111111
 Хозяин| Опубликовано 03.05.2023 22:12:22 |
Параметры очереди RabbitMQ и их значения


/**
* Постройте новую очередь с именем, флагом надёжности, флагом автоудаления и аргументами.
* @param называть название очереди — не должно быть null; Установите на "" для того, чтобы брокер генерировал имя.
* @param это устойчиво, если мы объявляем долговечную очередь (очередь переживёт перезагрузку сервера)
* @param эксклюзивно верно, если мы объявляем эксклюзивную очередь (очередь будет использоваться только для деклараторов
* связь)
* @param autoDelete true, если сервер должен удалить очередь, когда она больше не используется
* @param аргументы, используемые для объявления очереди
*/
публичная очередь (имя строки, булево долговечное, булево эксклюзивное, булево autoDelete, Map<строка, объект> аргументы) {
   Assert.notNull (name, «'name' не может быть null»);
   this.name = имя;
   this.actualName = StringUtils.hasText(name) ? Название
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = устойчивый;
   this.exclusive = эксклюзив;
   this.autoDelete = autoDelete;
   this.arguments = аргументы != null ? аргументы: новый HashMap<>();
}

Введение параметров:
1. имя: название очереди;
2. actualName: Настоящее имя очереди, параметр имени используется по умолчанию, если имя пусто, оно генерируется согласно правилам;
3. Долговечность: является ли она устойчивой;
4. Эксклюзивность: является ли она эксклюзивной или эксклюзивной;
5. autoDelete: удалять ли автоматически;
6. Аргументы: Другие параметры атрибутов очереди имеют следующие опции, см. Аргументы на рисунке 2:
(1) x-message-ttl: время истечения сообщения в миллисекундах;
(2) x-expires: время истечения очереди, как долго очередь будет удалена, если к ней не будет доступен, единица: миллисекунды;
(3) x-max-length: максимальная длина очереди, если она превышает максимальное значение, сообщение удаляется из заголовка очереди;
(4) x-max-length-bytes: содержимое сообщения очереди занимает максимальное пространство, ограниченное размером памяти, и если оно превышает этот порог, сообщение удаляется из заголовка очереди;
(5) x-overflow: Установите поведение переполнения очереди. Это определяет, что происходит с сообщением при достижении максимальной длины очереди. Допустимые значения — drop-head, reject-publish или reject-publish-dlx. Типы очереди кворума поддерживают только drop-head;
(6) x-dead-letter-exchange: название обмена мёртвыми буквами и сообщения, истёкшие или удаленные (из-за длины длины очереди или превышающего порог), могут быть указаны для отправки на биржу;
(7) ключ маршрутизации x-dead-letter: ключ маршрутизации мёртвого сообщения, который будет использоваться при отправке сообщения обменчику мёртвых букв; если не установлен, будет использоваться исходное значение ключа маршрутизации сообщения
(8) x-single-active-consumer: указывает, является ли очередь одним активным потребителем; если верно, то сообщения потребляют только один потребитель из зарегистрированной потребительской группы, остальные игнорируются, и ложно, когда сообщение распространяется всем потребителям по циклу (по умолчанию false)
(9) x-max-priority: максимальное количество приоритетов, поддерживаемых очередью; Если не установлен, очередь не будет поддерживать приоритет сообщений;
(10) режим x-queue (Lazy mode): Установите очередь в режим задержки, храните как можно больше сообщений на диске для снижения использования оперативной памяти; Если она не настроена, очередь сохраняет кэш памяти для максимально быстрой доставки сообщений;
(11) x-queue-master-locator: Установите информацию о главном узле зеркальной очереди в режим кластера.


Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com