В JEE6
это нормально использовать Thread внутри CDI
@Singleton
bean, что @Produces
подключение к внешней сторонней службе.Использование нити внутри CDI Singleton bean
У меня есть война JEE6, которая делает именно это:
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
@Singleton
@Startup
public class MyBean {
@Produces
public SomeService getSomeService() {
/** Retry a number of times to connect to some service **/
SomeService someService = retry("127.0.0.1");
return someService;
}
}
Метод повторных попыток будет попробовать несколько раз, чтобы подключиться к службе. Он использует Executors.newSingleThreadScheduledExecutor()
для повторной попытки подключения каждые x секунд.
Я верю в JEE7
, они добавили Управляемого Исполнителя для такого рода вещей. Но нормально ли использовать обычный Исполнитель в JEE6
.
Итак, в мире JEE6, какой был бы лучший подход к решению этой проблемы? Моя основная проблема заключается в том, что я создаю компонент с @Produces, и это может быть длительная работа? – DarVar
Это должно быть синхронно. Даже в EE7 метод '@ Produces' (CDI) должен быть синхронным. –
Джон прав. Я немного расскажу о том, почему потоки в Java EE 6 и ниже неприемлемы. Всякий раз, когда вы начинаете свой собственный поток, сервер больше не управляет чем-либо в этом потоке. Вы не получаете никаких транзакций, на контейнерных сервисах, без инъекций и т. Д. Кроме того, поскольку сервер не справляется с этим, нет никакой гарантии, что все будет очищено, когда сервер выключится, что, по крайней мере, может привести к зомбическим процессам и утечкам памяти, проблемы безопасности в худшем случае. Это просто не очень хорошая идея. – LightGuard