2011-01-22 10 views
0

私のアプリケーションでは、EJB3.0とJBoss5に基づいて、複数の命令を同時に処理できる機能を実装する必要があります。例えば。ステートフルなリスニングEJBがあります。データを受信すると(非同期に)プールされたステートレスBeanがトリガされ、計算が実行されます。あるSLSBで実行を実行しても、別のSLSBでの実行の開始は停止しません(最初のSLSBがその作業を終了する前にSFSBによる要求を受け取った場合)。これはSpring ThreadPoolTask​​Executorに似ています。タスクはキューに渡され、処理できるスレッドがあるときにキューから取得されます(すべてが並列に行われます)。純粋なEJB 3.0 SpringのThreadPoolTask​​Executorのようなソリューション

残念ながら私はSpringや他のバージョンのEJB仕様を使用することはできません(ただし、JBoss固有の機能を使用できます)。そのようなことをどうやって実装するのですか?私はMDBをタスクエグゼキュータとして使用することを考えましたが、同時に実行されるかどうかはわかりません(これは私の最初の質問です))、それが正しい方法のJMS(厳密には "メッセージング"ではない)です。

すべてのヒントを事前におねがいします。

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とMessage Driven Beanがこれまで使用されていましたが、これはJOBにとって最適なツールではありません。トランザクションがコミットするまでメッセージが送信されないなどのトランザクション上の問題が発生します。値を返すことも難しくなります。また、非同期的にコードを実行するため、EJB3タイマーもこれに使用されていました。

あなたは、現時点で別のEJBバージョンに切り替えることはできないと言いましたが、とにかくEJB 3.1では@Asynchronous注釈を使用できることを言いたいと思います。これは本当にこの問題に取り組む最良の方法です。

+0

これだけです!どうもありがとうございました。 –

+0

ようこそ。) –

関連する問題