2013-10-09 5 views
2

В 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.

ответ

1

В Java EE 6 недопустимо запускать поток внутри EJB. В Java EE 7 они сделали немного более расслабленным.

+0

Итак, в мире JEE6, какой был бы лучший подход к решению этой проблемы? Моя основная проблема заключается в том, что я создаю компонент с @Produces, и это может быть длительная работа? – DarVar

+0

Это должно быть синхронно. Даже в EE7 метод '@ Produces' (CDI) должен быть синхронным. –

+0

Джон прав. Я немного расскажу о том, почему потоки в Java EE 6 и ниже неприемлемы. Всякий раз, когда вы начинаете свой собственный поток, сервер больше не управляет чем-либо в этом потоке. Вы не получаете никаких транзакций, на контейнерных сервисах, без инъекций и т. Д. Кроме того, поскольку сервер не справляется с этим, нет никакой гарантии, что все будет очищено, когда сервер выключится, что, по крайней мере, может привести к зомбическим процессам и утечкам памяти, проблемы безопасности в худшем случае. Это просто не очень хорошая идея. – LightGuard

0

Для выполнения длительных операций в JEE6 вы можете использовать @Asynchronous annotation в EJB. Он будет запускать ваш метод асинхронно в отдельном потоке, управляемом контейнером, все законным. Вот отличный пример: http://www.adam-bien.com/roller/abien/entry/conveniently_transactionally_and_legally_starting

Смежные вопросы