Предпосылка асинхронного обмена сообщениями, особенно при использовании MDB, заключается в том, что каждое сообщение является атомарным. Другими словами, предполагается, что результат обработки любого одного сообщения не зависит от результата обработки любого другого сообщения. Идеальное решение вашей проблемы сохранит атомарность сообщений.
Если бы вы обрабатывали несколько сообщений в одной единице работы, вы бы потеряли эту атомарность. Например, предположим, что вы решили синхронизировать каждые 25 сообщений. Если в 25-м сообщении произошла ошибка, например, проблема с преобразованием кодовой страницы, из-за которой он не мог быть извлечен из очереди, весь пакет сообщений был бы отклонен. Тогда они все будут доставлены. Количество повторных доставок для сообщений будет увеличиваться с каждым циклом чтения / возврата. Как только количество повторных доставок превысило пороговое значение, установленное на сервере приложений, все 25 сообщений будут отброшены или помещены в очередь в зависимости от вашей конфигурации. Чем больше пакет, тем больше сообщений могут быть затронуты в ситуации ошибки, потому что весь пакет живет или умирает вместе. Установите размер пакета равным 100, и в случае одного сообщения о заражении риску подвергнется 100 сообщений.
Альтернативное решение - разрешить множество потоков обработки в вашей MDB. С JMS вы можете создавать много сеансов под одним и тем же соединением. Каждый сеанс может управлять собственной единицей работы, поэтому каждый сеанс может независимо запускать транзакцию XA, получать сообщение, обновлять базу данных и затем фиксировать транзакцию. Если одно сообщение является ошибочным, затрагивается только это сообщение и обновление базы данных.
Есть исключения из этого. Например, если обрабатывается большой пакет, и все сообщения происходят от одного и того же производителя, обычно используется что-то кроме MDB для извлечения многих сообщений и обновления многих строк в рамках одной и той же единицы работы. Точно так же, если сообщения зависят от последовательности, параллельная обработка невозможна, потому что она не сохранит последовательность. Но опять же, зависимые от последовательности сообщения не являются атомарными. Опять же, в этом случае MDB не является идеальным решением.
В зависимости от вашего транспортного провайдера, количество поддерживаемых потоков может быть ограничено только объемом памяти. Например, WebSphere MQ может легко обрабатывать сотни одновременных потоков геттеров в очереди. Проверьте настройку конфигурации MDB сервера приложений, чтобы увидеть, сколько потоков вы можете раскрутить, а затем убедитесь, что ваш транспорт может справиться с нагрузкой. Затем поиграйте немного, чтобы найти оптимальное количество потоков. Производительность резко возрастет по мере увеличения потоков от одного, но только до определенного уровня. После этого вы обычно видите плато, а затем снижение, поскольку накладные расходы на управление потоками компенсируют прирост производительности. Место, где находится swe3et, зависит от того, насколько сильно загружен брокер обмена сообщениями и насколько сильно он ограничен процессором, памятью, диском или сетью.