2012-01-02 5 views
2

私は、高価な処理を行う非同期メソッドを含むステートレスEJB-3.1セッションBeanを用意しています。クライアントに未来を返し、準備が整ったら処理結果を表示できます。 :このBeanは、JBoss 6インスタンス上で実行されているとSwingクライアントからリモートで呼び出された@Asynchronousメソッドの結果を待っているJBoss 6ソケットタイムアウト

@Asynchronous 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public Future<String> importModules() { 
    String result = doSomeHeavyStuff(); 
    return new AsyncResult<String>(result); 
} 

:処理は通常、正常に終了しながら

final Future<String> termination = 
      Proxy.getProxy().getMenfpImportService().importModules(); 

SwingWorker<String, Object> worker = new SwingWorker<String, Object>() { 

    @Override 
    protected String doInBackground() { 
     /* ... */ 
     if (termination.isDone()) { 
      return termination.get(); 
     } 
     /* ... */ 
    } 

    /* ... */ 
} 

、いくつかの計算が終了する300秒よりも長い時間がかかります。

これらの計算のために

termination.getを呼び出すときに、JBossのソケットタイムアウトが(代わりに、演算結果のExecutionExceptionを受け取るために、クライアントの原因):

10:26:16,301  INFO Application:1150 - Execution exception during modules import: 
java.util.concurrent.ExecutionException: org.jboss.remoting.InvocationFailureException: Socket timed out. Waited 300000 milliseconds for response while calling on InvokerLocator [socket://degotte:3873/?timeout=300000]; nested exception is: 
java.net.SocketTimeoutException: Read timed out 
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) 
at java.util.concurrent.FutureTask.get(FutureTask.java:83) 
at org.jboss.ejb3.async.spi.AsynchronousClientFuture.get(AsynchronousClientFuture.java:113) 
at org.jboss.ejb3.async.impl.util.concurrent.LocalJvmSerializableFutureWrapper.get(LocalJvmSerializableFutureWrapper.java:161) 
at lu.lippmann.forminitiale.client.gui.Application$2.doInBackground(Application.java:1137) 
at lu.lippmann.forminitiale.client.gui.Application$2.doInBackground(Application.java:1) 
at javax.swing.SwingWorker$1.call(SwingWorker.java:277) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at javax.swing.SwingWorker.run(SwingWorker.java:316) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 

残念ながら、@Asynchronousアノテーションはいずれも提供していません設定オプション。

私の質問は、どのように非同期メソッドの呼び出し中に確立された接続に対してのみ可能な場合は、クライアントサーバーの通信ソケットのタイムアウトを増やすことができます。

おかげで、Nayan Wadekarによって投稿 トーマス

+0

JBossソケットタイムアウトの設定についてはhttp://docs.jboss.org/jbossremoting/docs/guide/2.5/html/chapter-configuration.htmlを参照できます。 –

+0

ありがとう、それはすでに役立ちます。少なくとも、ソケットのタイムアウトをグローバルに増やすことができます。これにより、上記の例のExecutionExceptionsがなくなります。 – tzangerl

答えて

1

リンクは正しい方向に指摘しました。 JBoss AS上のソケットを管理するコンポーネントは、JBoss remotingです。これは、コネクタを使用して、接続するトランスポートの適切な呼び出しハンドラを呼び出します。

EJBメソッド呼び出しの場合、担当するコネクタはDefaultEjb3Connectorのようですが、そのパラメータはdeployフォルダ内のejb3-connectors-jboss-beans.xmlファイルで設定できます。 in

$JBOSS_HOME/server/default/deploy/ejb3-connectors-jboss-beans.xml 

デフォルトプロファイルを使用している場合。

ソケットURLが有効であることが判明した後にタイムアウトパラメータを上げる。

<bean name="org.jboss.ejb3.RemotingConnector" 
class="org.jboss.remoting.transport.Connector"> 

<property name="invokerLocator"> 

    <value-factory bean="ServiceBindingManager" 
    method="getStringBinding"> 
    <parameter> 
     jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3 
    </parameter> 
    <parameter> 
     <null /> 
    </parameter> 
    <!-- <parameter>socket://${hostforurl}:${port}?timeout=300000</parameter> --> 
    <parameter>socket://${hostforurl}:${port}?timeout=1200000</parameter> 
    <parameter> 
     <null /> 
    </parameter> 
    <parameter>3873</parameter> 
    </value-factory> 

</property> 
<property name="serverConfiguration"> 
    <inject bean="ServerConfiguration" /> 
</property> 

しかし、これはすべてのEJBメソッド呼び出しのタイムアウトを発生させます。私がJBossリモーティングの概念を読んだところで、特定のセッションBeanに適応したコネクタを追加することだけが実際に可能かどうかはわかりません。

関連する問題