我有一个包含异步方法的无状态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注释不提供任何配置选项。
我的问题是我怎么可以增加客户端服务器通信套接字的超时时间,并且如果以任何方式可能只是为了在调用异步方法期间建立的连接。
感谢, 托马斯
可以参考http://docs.jboss.org/jbossremoting/docs/guide/2.5/html/chapter-configuration.html来配置JBoss套接字超时。 – 2012-01-05 17:12:30
谢谢,这已经有所帮助。至少它允许我全局增加套接字超时,这在上面的例子中使我摆脱了ExecutionExceptions。 – tzangerl 2012-01-06 17:03:04