首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待@Asynchronous方法结果的JBoss 6套接字超时

等待@Asynchronous方法结果的JBoss 6套接字超时
EN

Stack Overflow用户
提问于 2012-01-02 17:53:59
回答 1查看 3.5K关注 0票数 2

我有一个无状态的EJB-3.1会话bean,其中包含一个异步方法,该方法执行一些开销很大的处理,并将一个将来返回给客户端,从而允许它在准备就绪后显示处理结果:

代码语言:javascript
复制
@Asynchronous
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Future<String> importModules() {
   String result = doSomeHeavyStuff();
   return new AsyncResult<String>(result);
}

此bean在JBoss 6实例上运行,并从Swing客户端远程调用:

代码语言:javascript
复制
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而不是计算结果:

代码语言:javascript
复制
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注解没有提供任何配置选项。

我的问题是,如何增加客户机-服务器通信套接字超时,以及如何以任何可能的方式仅针对在调用异步方法期间建立的连接。

谢谢,托马斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-07 01:33:33

Nayan Wadekar发布的链接指出了正确的方向。负责管理JBoss AS上的套接字的组件是JBoss remoting,它提供所谓的连接器来调用适当的调用处理程序来进行连接传输。

在EJB方法调用的情况下,负责的连接器似乎是DefaultEjb3Connector,其参数可以在deploy文件夹中的ejb3-connectors-jboss-beans.xml文件中配置,例如在

代码语言:javascript
复制
$JBOSS_HOME/server/default/deploy/ejb3-connectors-jboss-beans.xml

如果使用默认配置文件。

在套接字URL被证明是有效的之后,提高超时参数。

代码语言:javascript
复制
<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添加适配的连接器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8699439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档