Управляемые контейнером транзакции - асинхронные вызовы методов - PullRequest
1 голос
/ 10 марта 2019

Ниже мое требование: 1. MDB получает сообщение

Запускает асинхронный метод в другом сессионном компоненте - асинхронный, потому что этот метод будет длинным потоком, и мы не хотим удерживать поток MDB в течение длительного времени.Асинхронный метод читает записи из БД, обрабатывает их и вызывает # 3.

Записывает в другой MQ, а затем вставляет некоторые данные в БД. POSTING TO MQ и DB INSERT должно быть в одна транзакция.

Вот реализация:

Для # 1 - Использование управляемой контейнером транзакции MDB без какого-либо атрибута транзакции.

Для # 2 - Сессионный компонент без сохранения состояния - управляемый контейнер, асинхронный , но атрибут транзакции как NOT_SUPPORTED (не поддерживается, так как это длительный поток, поэтому не нужно, чтобы транзакция была задержана по тайм-ауту).

Для # 3 - компонент сеансов без сохранения состояния (вызывается из # 2 длякаждая запись, которая читается в 2 - выполняется в цикле) - атрибут транзакции - REQUIRES_NEW , поскольку этот метод отправляет сообщения в MQ и вставляет в БД.

Проблемы:

  1. Исключение времени выполнения - когда я выбрасываю исключение времени выполнения из # 3, следующие записи не обрабатываются - сессионный компонент просто завершается.

  2. Исключение - при создании пользовательскогоисключение, сообщение в очередине восстанавливается при сбое вставки БД.

Каков наилучший способ реализации или решения этой проблемы.

Я приложил все усилия, чтобы сообщить подробности - благодарю за любую помощь поэто.

...