Асинхронное выполнение в 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.