Оба метода, предложенные в вопросе, по-видимому, полагаются на один экземпляр приложения.Что не так с использованием нескольких экземпляров приложения, транзакционных сеансов и COMMIT?Все отчеты о производительности (это SupportPacs с именами, такими как MP **) показывают, что пропускная способность максимизируется для нескольких экземпляров приложения, а горизонтальное масштабирование является одним из наиболее часто используемых подходов в вашем сценарии.
Дизайн для этого будет либо несколько экземпляров приложения или несколько потоков в одном приложении.Ключ к правильной работе должен помнить, что транзакции ограничены дескриптором соединения.Это означает, что многопоточное приложение должно отправлять отдельный поток для каждого экземпляра соединения, а сообщения читаются в одном потоке.
Поток процесса заключается в том, что при использовании транзакционного сеанса приложение выполняет обычныйMQGet
для очереди, обрабатывает содержимое сообщения, как требуется, а затем выдает MQCommit
.(Я буду использовать собственные имена API MQ в моих примерах, потому что это не зависит от языка.) Если это транзакция XA, приложение будет вызывать MQBegin
, чтобы начать транзакцию, но для однофазной фиксации транзакция предполагается.В обоих случаях MQCommit
завершает транзакцию, которая удаляет сообщения из очереди.Пока сообщения синхронизированы, никакой другой экземпляр приложения не может их извлечь;MQ просто доставляет следующее доступное сообщение.Если транзакция откатывается, следующая MQGet
из любого потока извлекает ее, предполагая доставку FIFO.
Есть несколько примеров в:
[WMQ install home]\tools\dotnet\samples\cs\xms\simple\wmq\
... и SimpleXAConsumer.cs
один пример, который показывает версию XA этого.Версия без XA проще, так как вам не нужен внешний координатор, глаголы MQBegin
и так далее.Если вы начнете с одного из них, убедитесь, что в нем не указано исключительное использование очереди, и вы можете запустить несколько экземпляров, используя одну и ту же конфигурацию.В качестве альтернативы возьмите часть примера, которая включает создание соединения, обработку сообщений, закрытие и уничтожение соединения, и оберните все это в класс средства порождения потока.
[ Вставьте обычный совет по использованию последней версии.версия занятия здесь. ]