J'ai un bean de session EJB-3.1 sans état contenant une méthode asynchrone qui effectue un traitement coûteux et renvoie un futur au client, ce qui lui permet d'afficher le résultat du traitement dès qu'il est prêt :
@Asynchronous
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Future<String> importModules() {
String result = doSomeHeavyStuff();
return new AsyncResult<String>(result);
}
Ce haricot est exécuté sur une instance de JBoss 6 et invoqué à distance depuis un client 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();
}
/* ... */
}
/* ... */
}
Bien que le traitement se termine généralement avec succès, certains calculs prennent plus de 300 secondes pour se terminer.
Pour ces calculs, un délai d'attente de la socket JBoss fait que le client reçoit une ExecutionException au lieu du résultat du calcul lorsqu'il appelle termination.get() :
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)
Malheureusement, l'annotation @Asynchronous ne fournit aucune option de configuration.
Ma question est de savoir comment je peux augmenter le délai d'attente de la communication client-serveur, et si cela est possible uniquement pour la connexion établie lors de l'invocation de la méthode asynchrone.
Merci, Thomas