2012-01-02 33 views
2

我有一個包含異步方法的無狀態EJB-3.1會話Bean,它執行一些昂貴的處理並向客戶端返回未來,從而允許它在處理結果準備就緒時顯示處理結果:JBoss 6套接字超時等待@Asynchronous方法結果

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

這個bean是在一個JBoss 6實例運行,並從Swing客戶端遠程調用:

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秒來完成。

對於這些計算,在JBoss插座超時導致客戶端呼叫termination.get()時接收爲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註釋不提供任何配置選項。

我的問題是我怎麼可以增加客戶端服務器通信套接字的超時時間,並且如果以任何方式可能只是爲了在調用異步方法期間建立的連接。

感謝, 托馬斯

+0

可以參考http://docs.jboss.org/jbossremoting/docs/guide/2.5/html/chapter-configuration.html來配置JBoss套接字超時。 – 2012-01-05 17:12:30

+0

謝謝,這已經有所幫助。至少它允許我全局增加套接字超時,這在上面的例子中使我擺脫了ExecutionExceptions。 – tzangerl 2012-01-06 17:03:04

回答

1

發表拿煙Wadekar的鏈接指向正確的方向。負責管理JBoss AS上的套接字的組件是JBoss remoting,它提供所謂的連接器來調用連接傳輸的合適調用處理程序。

對於EJB方法調用,責任連接器看起來是DefaultEjb3Connector,其參數可以在deploy文件夾的文件ejb3-connectors-jboss-beans.xml中配置,例如,在

$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添加適配連接器實際上是可能的。