私は、高価な処理を行う非同期メソッドを含むステートレスEJB-3.1セッションBeanを用意しています。クライアントに未来を返し、準備が整ったら処理結果を表示できます。 :このBeanは、JBoss 6インスタンス上で実行されているとSwingクライアントからリモートで呼び出された@Asynchronousメソッドの結果を待っているJBoss 6ソケットタイムアウト
@Asynchronous
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Future<String> importModules() {
String result = doSomeHeavyStuff();
return new AsyncResult<String>(result);
}
:処理は通常、正常に終了しながら
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秒よりも長い時間がかかります。
これらの計算のためにtermination.getを呼び出すときに、JBossのソケットタイムアウトが(代わりに、演算結果の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アノテーションはいずれも提供していません設定オプション。
私の質問は、どのように非同期メソッドの呼び出し中に確立された接続に対してのみ可能な場合は、クライアントサーバーの通信ソケットのタイムアウトを増やすことができます。
おかげで、Nayan Wadekarによって投稿 トーマス
JBossソケットタイムアウトの設定についてはhttp://docs.jboss.org/jbossremoting/docs/guide/2.5/html/chapter-configuration.htmlを参照できます。 –
ありがとう、それはすでに役立ちます。少なくとも、ソケットのタイムアウトをグローバルに増やすことができます。これにより、上記の例のExecutionExceptionsがなくなります。 – tzangerl