2012-01-02 35 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添加适配连接器实际上是可能的。