Асинхронное выполнение в Java EE - PullRequest
8 голосов
/ 27 ноября 2011

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

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

Ответы [ 4 ]

18 голосов
/ 27 ноября 2011

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

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

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

2 голосов
/ 27 ноября 2011

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

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

Для большихприложения, которые вы могли бы даже рассмотреть с использованием Enterprise Service Bus.

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

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

1 голос
/ 27 ноября 2011

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

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

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

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

1 голос
/ 27 ноября 2011

По сути, асинхронное поведение достигается с потоками, это не обходится.

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

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

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

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

...