2016-12-12 2 views
0

J'ai ci-dessous le code, la méthode doTransaction est invoquée après 20 secondes, quelqu'un peut-il me dire pourquoi cela prend autant de temps pour invoquer la méthode doTransaction. Cela n'arrive pas toujours que cela se produise très rarement. Toute aide à ce sujet est appréciée. Merci,Executerservice soumet la tâche invoque le code après le temps

 ExecutorService service = Executors.newSingleThreadExecutor();   

    TransactionTask task = new TransactionTask(object); 
    Future<Result> future = service.submit(task); 
    Result r = future.get(20000, TimeUnit.MILLISECONDS); 


    class TransactionTask implements Callable<Result> { 
     private Request req = null; 
      public TransactionTask(Request trx){ 
      this.req = trx; 
     } 
    @Override 
    public Result call() throws Exception { 
     Result o = doTransaction(req); 

     return o; 

    } 
    } 
+0

À quelle fréquence soumettez-vous la tâche? Seulement une fois ou plusieurs fois? –

+0

Merci pour votre réponse rapide. La tâche est soumise une seule fois et une tâche à la fois, le code est sur le serveur Tomcat, le code ci-dessus sera invoqué une fois par demande. T – anil

+0

Tomcat gère chaque requête simultanément, créez-vous ExecutorService pour chaque requête. Si non, alors voilà, plusieurs tâches sont créées et soumises par Tomcat dans le même service. –

Répondre

0

Le comportement ci-dessus pourrait être expliqué si vous soumettez plusieurs tâches.

Le ExecutorService que vous avez créé est un thread unique, il ne peut donc exécuter qu'une seule tâche simultanément. Les autres tâches soumises seront mises en file d'attente et commenceront à s'exécuter si la première tâche est terminated/completed

Elle s'exécute au bout de 20 secondes car vous annulez la tâche déjà en cours en future.get(20000, TimeUnit.MILLISECONDS);. Pourriez-vous vérifier que vous n'obtenez pas CancellationException.

Edit: Puisque vous utilisez Tomcat qui est en même temps en cours d'exécution, je suggère, vous utilisez multithread au lieu de fil simple sinon nécessaire: - Executors.newFixedThreadPool(N); pour avoir des tâches de N exécutent et augmenter la timout