2012-01-18 52 views
5

EJB Bを呼び出すEJB Aがあります。 UIは応答のために30秒以上待つべきではありません。一部のデータが欠落している場合、部分的な応答が返されます。タイムアウトのあるEJB呼び出しを作成する

EJB Bでタイムアウト(30秒の制限時間)を定義するにはどうすればよいですか?

Futureを返してからFuture.get(30, TimeUnit.SECONDS)を返すように、BAsynchronousと定義できます。 しかし、それは最善の解決策ですか?

ありがとう

P.S.私はグラスフィッシュを使用する3.1

答えて

0

すべてのメソッドに適用されるBeanのタイムアウトを設定するには、glassfish-ejb-jar.xmlに属性cmt-timeout-in-secondsを設定する必要があります。

このタイムアウト値は、新しいトランザクションを開始するBeanのすべてのメソッドで使用されます。他の進行中のトランザクションに参加する場合は適用されません。

タイムアウトの詳細については、linkも参照してください。

2

ターゲットEJBを中断する方法はありません。実際の唯一のオプションは、対象とするEJBが意図したターゲット応答時間を超えているかどうかを協調的かつ定期的にチェックすることです。

@AsynchronousFuture.getがタイムアウトしても、結果を待たずにクライアントのブロックを解除しただけです。ターゲットEJBは実行し続けてリソースを消費します。ただし、非同期メソッドでは、Future.cancelSessionContext.wasCancelCalledを使用して組み込みの協調キャンセルの利点があります。

+0

私はEJBを中断することを意味しません。アイデアは、30秒後にUIに応答(または「タイムアウトエラー」)を返すことでした。 – lili

+2

バックエンドをタイムアウトせずにフロントエンドをタイムアウトさせるのは賢明ではないようです。最終的には、バックエンドスレッドが消費され、フロントエンドスレッドはいずれにしても待機する必要があります。あなたが言ったことを考えれば、 '@ Asynchronous'を使うのがおそらく最も良いでしょう。 –

5

このためにトランザクションタイムアウトを使用することをお勧めします。

アプリケーションサーバーに依存するように構成する標準的な方法はないと思います。私はあなたがクラスまたはメソッドごとにそれを具体的に設定したいと仮定します。

WebLogicの場合は、 "transaction-descriptor"の "weblogic-ejb-jar.xml"で指定するか、 "@TransactionTimeoutSeconds"という注釈を使用します。 JBossの

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

あなたが "@TransactionTimeout" 注釈を使用して、トランザクション・タイムアウトを設定したり、 "のjboss.xml" の可能性がAS。

https://community.jboss.org/wiki/TransactionTimeout

私は、すべてのアプリケーションサーバーで同様の構成オプションがあります確信しています。

関連する問題