我有一个无状态的EJB-3.1会话bean,它包含一个异步方法,它执行一些昂贵的处理并将未来返回给客户端,从而允许它在准备好后显示处理结果:
@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 :(得分:1)
Nayan 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添加适配的连接器。