2014-01-12 22 views
6

併發工具(JSR 236)已經在Java EE中引入了7的Java EE 7 - 注入了Runnable/Callable對象

有什麼辦法如何注入我的EJB到了Runnable/Callable對象?

具體來說,我想是這樣的:

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()); 
    } 
} 

MyTask中的myEjb字段始終爲空。我想有可能有助於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的實例機制的情況下,容器調用myTaskInstance.get()當準備MyTask的每個實例。

+0

它給「org.jboss.weld.exceptions.UnsatisfiedResolutionException:WELD-001308:無法解決任何類型的bean ...」例外 – ravthiru

+0

@ravthiru - 您需要確保您傳入的bean是由容器。例如。在聲明該類之前添加「@ManagedBean」。 – Dan

0

如果由您創建MyTask實例,則EJB無法注入,因爲Container只知道自己創建的實例。相反,你可以注入在MyTaskManager辛格爾頓SB的EJB和定義MyTask運行的類的內部類如下:

@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(); 
      ... 
     } 
    } 
}