2 votes

JBoss 6 socket timeout en attente du résultat de la méthode @Asynchronous

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X