Асинхронное выполнение в Java EE

Я изучаю Java EE в настоящее время (перемещение из SE), и я смущен асинхронным выполнением в среде Java EE.
В основном то, что я понимаю, создавая Thread или Timer точно не рекомендуется. Еще один метод, который я нашел до сих пор, - использовать JMS для передачи сообщения в EJB Message Bean, и он будет выполняться асинхронно.

Каковы некоторые другие методы для достижения этого поведения? Причина использования JMS выглядит слишком много накладных расходов для простых задач.

4 ответов


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

в pre-Java EE 6 дней JMS использовался для этой цели.

в качестве примечания - в сервлеты вы также можете использовать асинхронный исполнение.


можно использовать весенний задач исполнителем.

другие задания могут помещать его в базу данных и выполнять задачу, которая опрашивает базу данных.

для больших приложений вы можете даже рассмотреть возможность использования служебной шины предприятия.

все зависит от того, насколько важно, чтобы задачи и какие усилия вы готовы сделать.

для не столь важных задач простые темы часто будут делать трюк.


в принципе, асинхронное поведение достигается с потоками,это невозможно обойти.

однако в среде Java EE считается плохой практикой открывать потоки самостоятельно. Скорее всего, вы захотите использовать средство вашего сервера, которое даст вам (правильно) управляемую среду для выполнения асинхронных вещей.

JMS-один из способов выполнения асинхронных задач, я бы рекомендовал это для потоков задач, которые необходимо непрерывно обрабатывать. Большинство Java-приложения серверы имеют диспетчеры планирования, которые позволяют планировать отдельные задачи в будущем (например, через quartz). Некоторые фреймворки также поддерживают аннотации Java EE 6 для @javax.ejb.Asynchronous.

и да, если вы должны, вы всегда можете просто породить один Thread и забыть обо всем этом. Просто убедись, что знаешь, что делаешь.

все сводится к тому, каков ваш точный вариант использования и какие методы поддерживает ваша среда. Нет ни одного правдивого ответа.


Java EE 6 и весенние энтузиасты говорили; как-то все оставили javax.ejb.TimerService из Java EE 5, который, я рискну предположить, в настоящее время [по состоянию на 2011] является преобладающей платформой.

в основном, вы вводите TimerService в своем или управлемые зерно, и использовать один из его createTimer(...) методы планирования асинхронного выполнения. Затем вы реализуете логику тайм-аута в аннотированном методе:

@Timeout
void anyMethod(javax.ejb.Timer timer) { ... }

и вот и все. Использование JMS только ради его асинхронного характера никогда не было хорошим вариантом, если только не так давно, как в J2EE.