我有一個包含異步方法的無狀態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