Mdb против асинхронного метода EJB 3.1

Когда мне следует выбрать асинхронный метод ejb, а не MDB со службой сообщений Java, чтобы запускать асинхронные длительные задачи?


person Yanosh    schedule 19.11.2014    source источник


Ответы (2)


@Asynchronous подходит только в том случае, если внешняя транзакция должна запустить несколько частей работы параллельно, а затем ожидать их всех (или запустить одну часть работы в фоновом режиме, выполнить некоторую работу на переднем плане, а затем ожидать фоновой работы) . @Asynchronous не подходит для транзакционного "выстрелил и забыл", потому что контейнер может рухнуть до того, как асинхронная работа когда-либо начнет выполняться (на мой взгляд, асинхронные методы void EJB очень редко полезны, возможно, для чего-то вроде обновления кэша в памяти). Если вы хотите гарантировать, что работа будет выполняться асинхронно, не дожидаясь ее завершения, вам следует отправить сообщение в MDB или запланировать таймер EJB.

person Brett Kail    schedule 20.11.2014
comment
Как может произойти сбой контейнера? - person Dherik; 24.02.2016
comment
Процесс JVM убит, машина резко теряет питание и т.д. - person Brett Kail; 24.02.2016

@MessageDriven (MDB) является частью JMS API. JMS имеет всевозможные дополнительные возможности, когда речь идет о повторных попытках использования ошибочных сообщений, поддержке транзакций, а также позволяет вам управлять очередью сообщений.

@Asynchronous аннотация не была введена до java-ee-6 (ejb 3.1).

Предполагая, что вариант использования представляет собой простой асинхронный вызов в контейнере java-ee-6 или выше, используйте @Asynchronous (arun блог Гупта на этом)

Если вам нужно больше, чем это, JMS может быть вариантом.

person Aksel Willgert    schedule 19.11.2014