Ответ зависит от вашей модели потоков и транзакций. Как правило, клиенты обмена сообщениями всегда должны использовать транзакционность, даже если это только однофазная фиксация. Причина в том, что существуют неоднозначности результатов, которые могут вызвать дублирование или потерю сообщений в противном случае. Я предоставил более подробное объяснение этого в другом ответе .
Проблема в том, что транзакции ограничены подключением. Когда вы делаете COMMIT, вы делаете это для всего соединения. Безопасное использование одного и того же соединения в нескольких потоках исключает использование транзакций и, таким образом, приводит к тому, что приложение теряет или дублирует сообщения. Поскольку дескрипторы очереди действительны только в контексте определенного соединения, они наследуются от вашей модели потоков и пула соединений.
Наиболее распространенная модель для приложения поставщика услуг - поддерживать соединение для каждого потока во входной очереди и динамически открывать / помещать / закрывать выходную очередь. Например, в одной единице работы ...
- Прочитать следующее сообщение запроса
- Используйте информацию ответа для получения пункта назначения
- Открыть очередь ответа
- Поставь ответ
- Commit
- Уничтожить целевой объект ответа и, таким образом, закрыть очередь ответа
В этом случае соединения не перестраиваются постоянно, а входная очередь никогда не закрывается. Однако требуется, чтобы каждый поток поддерживал выделенное соединение.