2011-01-22 73 views
0

在我的基於EJB3.0和JBoss5的應用程序中,我需要實現允許多條指令同時處理的功能。例如。有一個有狀態的偵聽EJB,在接收數據的情況下(異步)觸發合併的無狀態bean來進行計算。在一個SLSB中執行執行不會停止在另一個SLSB中開始執行(在第一個SLSB完成其工作之前接收到SFSB請求的情況下)。這與Spring ThreadPoolTask​​Executor類似 - 任務被傳遞到隊列中,當有線程可用來處理它時,它從隊列中獲取它(一切都是並行的)。純EJB 3.0 Spring的ThreadPoolTask​​Executor-like解決方案

不幸的是,我不能使用Spring或其他版本的EJB規範(但我可以使用一些JBoss特有的功能)。我怎樣才能實現這樣的事情?我想過使用作爲任務執行者的MDB,但我不確定它是否會同時完成(這是我的第一個問題;)),以及它是否是正確的使用方式(不是嚴格意義上的「消息傳遞」)。

在此先感謝所有提示。

Piotr

回答

2

使用org.jboss.ejb3.common.proxy.plugins.async.AsyncUtils。這將在任何SLSB(或者甚至具有接口的其他bean)上執行代碼異步。

一個例子:

@Stateless 
public class SomeBean implements SomeBeanLocal { 

    public Future<Order> getByUserIDAsync(Long userID) { 
     SomeBeanLocal asyncSomeBean = AsyncUtils.mixinAsync(this); 
     asyncSomeBean.getByUserID(userID); 
     return (Future<Order>) AsyncUtils.getFutureResult(asyncSomeBean); 
    } 

    // normal non-async methods or other async methods here ... 
} 

這將派遣調用每個EJB容器具有管理線程池,並立即返回。代碼將在後臺運行。

JMS和消息驅動bean在過去的確已被使用過,但它並不是JOB的最佳工具。你遇到了一堆事務性問題,比如在事務提交之前不會發送消息等等。它也很難返回值。 EJB3定時器也用於此,因爲它們也是異步執行代碼的。

我知道您提到您目前無法切換到另一個EJB版本,但我仍想提一下,在EJB 3.1中可以使用@Asynchronous註釋。這真的是解決這個問題的最好方法。

+0

就是這樣!非常感謝你。 – 2011-01-23 19:46:42