Вслед за комментариями в вопросе WMQ не имеет понятия «постоянная очередь» (отсюда и причина, по которой я изменил заголовок сообщения). Атрибут queue для persistence никоим образом не изменяет, как QMgr обрабатывает очередь или любые сообщения в ней. Все, что он делает, - это указать программу, для которой параметр persistence используется, если программисту не удается явно установить это значение. Независимо от того, существует ли какое-либо данное сообщение, зависит от того, было ли задано постоянство MQMD
, когда сообщение было сначала помещено в очередь. Любая очередь может содержать постоянные и непостоянные сообщения в любой комбинации.
В частности, фрагмент кода int he post не указывает сохранение, используя message.setPersistence()
, чтобы он наследовал все значения по умолчанию для очереди. Это, в свою очередь, зависит от значения, унаследованного от атрибута очереди. В любом случае параметр атрибута очереди переопределяет явное значение из приложения.
Таким образом, разница в производительности, которую вы видите, скорее всего будет отражать настройку атрибута DEFPSIST
очереди, но это не значит, что асинхронные установки не работают. Помните, что async puts никоим образом не уменьшает количество времени, которое требуется для размещения сообщения в очереди. QMgr имеет тот же путь к коду, что и для сохранения сообщения, является ли он синхронным или нет. Разница в том, что ваше приложение больше не ждет, пока QMgr завершит свою работу. Вполне возможно, что когда вы вызываете обновление MQAsyncStatus
, что WMQ еще не написал любые сообщения. Это даже более вероятно, если все они находятся в одной единице работы, потому что WMQ не вернет статус для всех сообщений до тех пор, пока обработка COMMIT
не будет завершена. Если вы не вызываете COMMIT
явно, это происходит, когда вы закрываете очередь.
Вы можете проверить это, повторив вызов qMgr.getAsyncStatus()
каждую секунду в течение нескольких секунд после COMMIT
или CLOSE
. Вы должны увидеть, что первый из них не возвращает сообщений, которые были успешно удалены, но в конечном итоге вы можете учитывать их все.
Кстати, вопрос о постоянстве сообщений должен быть всегда обработан в вашем коде. Постоянство сообщений обычно выводится как бизнес-требование, которое фиксируется в дизайне приложения.Поэтому руководитель проекта и разработчик обязаны гарантировать, что это требование выполнено. Единственный способ надежно удостовериться, что это выполнено, - это то, что приложение вызывает явно setPErsistence()
. В противном случае приложение будет использовать значение из атрибута DEFPSIST
очереди, чтобы неявно вызвать setPersistence()
. Итак, зачем беспокоиться о разрешении такого типа по умолчанию в API? Потому что есть несколько законных случаев, когда настойчивость должна быть в состоянии изменить во время выполнения. Написание приложения для намеренного использования значения по умолчанию и повторного открытия очереди после выполнения каждой единицы работы. Во всех остальных случаях персистентность должна быть задана в программе или в управляемых объектах.
И, наконец, если вы помещаете 10 000 сообщений под единую единицу работы, еще одна причина, по которой вы можете получить ответ, в котором говорится, что сообщения не были успешно отправлены, - это нехватка места в журналах или перегородок, которые не установлены для размещения нагрузки. Например, если MAXUMSGS
настроено на то, что меньше 10 000, вся ваша транзакция будет отклонена. С другой стороны, если MAXUMSGS
настроен правильно, но размер и количество первичных и вторичных журналов недостаточны для хранения объема данных в транзакции, тогда снова вся транзакция откатится. Вы должны немного поиграть с интервалом COMMIT
, потому что оптимальное значение зависит от размера сообщений в зависимости от размера очереди и буферов журналов. Как только вы превысите объем данных, которые можно оптимизировать в одну операцию записи, дополнительные сообщения фактически снижают производительность. Когда люди помещают 10 000 сообщений в единую единицу работы, это вряд ли когда-либо для производительности, а скорее потому, что это их соответствующая единица восстановления, и соответствующий удар производительности является вторичным по отношению к требованию восстановления.
Сообщения, отправленные в фоновом режиме, не сохраняются, потому что они могут быть потеряны, если ваше приложение останавливается до отправки сообщения. Единственный способ узнать сообщение остался в том, чтобы дождаться его принятия восстановимым способом (обычно записывается на диск на сервере) –
Спасибо, можно ли использовать огонь и забыть о постоянных очередях? Я хочу, чтобы отправлять сообщения в постоянную очередь, чтобы они выдержали перезагрузку, но не дождались ответа диспетчера очереди на каждый PUT, я просто хочу выкидывать сообщения в диспетчере очередей, но не нужно знать, если они попадают в очередь или нет для каждого сообщения. Я могу использовать MQAsyncStatus для согласования чисел после каждой партии сообщений. Это чисто по соображениям производительности. –
Проблема в том, что либо вам нужны гарантии, либо нет. Похоже, что вы в порядке, если потеряно одно или два сообщения, но не все из них? –