2014-01-12 1 views
6

Параллелизм Утилита (JSR 236) была введен в Java EE 7.Java EE 7 - Инъекция в Runnable/вызываемый объект

Есть ли способ, как привнести свои EJBs в Runnable/вызываемый объект?

В частности, я хочу что-то вроде этого:

EJB с бизнес-логикой

@LocalBean 
public class MyEjb { 
    public void doSomeStuff() { 
     ... do some stuff ... 
    } 
} 

работоспособной/вызываемым класс, где я хочу, чтобы ввести экземпляр MyEjb

public class MyTask implements Runnable { 
    @EJB 
    MyEjb myEjb; 

    @Override 
    public void run() { 
     ... 
     myEjb.doSomeStuff(); 
     ... 
    } 
} 

объекта, который начинается новый Задача

@Singleton 
@Startup 
@LocalBean 
public class MyTaskManager { 
    @Resource 
    ManagedExecutorService executor; 

    @PostConstruct 
    void init() { 
     executor.submit(new MyTask()); 
    } 
} 

Поле myEjb в MyTask всегда равно null. Полагаю, что может помочь JNDI-поиск, но есть ли способ, как это сделать?

+1

Поймать немного, кажется, что вы должны просто сделать это. Пример: http://martinsdeveloperworld.wordpress.com/2014/02/25/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions/. Но, как уже сказано в другом комментарии, вы должны позволить серверу обрабатывать создание задачи. – Gimby

ответ

6

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

@Stateless 
public class MyBean { 
    @Resource 
    ManagedExecutorService managedExecutorService; 
    @PersistenceContext 
    EntityManager entityManager; 
    @Inject 
    Instance<MyTask> myTaskInstance; 

    public void executeAsync() throws ExecutionException, InterruptedException { 
    for(int i=0; i<10; i++) { 
     MyTask myTask = myTaskInstance.get(); 
     this.managedExecutorService.submit(myTask); 
    } 
} 

Потому что вы не создать экземпляр с новым оператором, а по механизму экземпляра CDI, контейнер готовит каждый экземпляр MyTask при вызове myTaskInstance.get() ,

+0

Он дает «org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: невозможно разрешить любые бобы для типа ...» Исключение – ravthiru

+0

@ravthiru - вам нужно убедиться, что компонент, который вы проходите, управляется контейнер. Например. Добавьте «@ManagedBean» непосредственно перед объявлением класса. – Dan

0

EJB нельзя вставить, если экземпляр MyTask создан вами, потому что Контейнер знает только созданные экземпляры. Вместо этого вы можете вводить EJB в MyTaskManager Singleton SB и определить свой MyTask Runnable класс как InnerClass следующим образом:

@Singleton 
@Startup 
@LocalBean 
public class MyTaskManager { 
    @Resource 
    ManagedExecutorService executor; 

    @EJB 
    MyEjb myEjb; 

    @PostConstruct 
    void init() { 
     executor.submit(new MyTask()); 
    } 

    class MyTask implements Runnable { 
     @Override 
     public void run() { 
      ... 
      myEjb.doSomeStuff(); 
      ... 
     } 
    } 
} 
Смежные вопросы