2012-03-28 16 views
1

Ich habe eine ScheduledExecutorService und ich habe eine Aufgabe alle 15 Minuten (in einer Web-Anwendung in Tomcat).
In einem ServletContextListener in contextDestroyed ich getan habe:Wie funktioniert das Herunterfahren in Executoren?

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run(){ 
       scheduler.shutdown(); 
      } 
     });  

Der Scheduler wie gestartet:

final Runnable r = new Runnable(){ 

      @Override 
      public void run() { 
       System.out.println("My task"); 
       //Do some task 
      } 

     }; 
updater.scheduleWithFixedDelay(r, 30, 15, TimeUnit.MINUTES); 

Frage: Auf shutdown jede verbleibende Aufgabe nicht ausgeführt wird.
Es läuft eine Aufgabe, aber ich sehe keine Protokolle, also scheint es, dass sie nicht ausgeführt wird. Warum?

UPDATE:
Wenn ich anfangen Kater und dann nach 2 Minuten I Abschaltung dann ist nicht die Aufgabe als geplant betrachtet und muss laufen? Ich meine, wenn eine Aufgabe eingereicht wird, gilt sie nicht als ausstehend? Oder muss es tatsächlich laufen?

Antwort

0

Ich kann nicht ganz Ihre Frage analysieren, aber vielleicht Ihre Anwendung zu beenden ist nicht wie man erwarten würde?

ein Executor Ausschalten wird für alle Aufgaben stoppen vorgelegt werden aber alle laufenden Tasks wird fortgesetzt, bis sie Ausfahrt laufen. Aus dem shutdown() javadocs:

Leitet ein ordnungsgemäßes Abschalten, in der zuvor eingereichten Aufgaben ausgeführt werden, aber keine neue Aufgaben akzeptiert werden. Aufruf hat keinen zusätzlichen Effekt, wenn bereits heruntergefahren wird.

Wenn Sie Ihre Frage bearbeiten, um klarer zu sein, können wir passender antworten.

+0

ich in Tomcat.The Abschaltung laufen die ServletContextListener ist im Inneren. Ich höre mit 'shutdown' – Jim

+0

Normalerweise müssen Sie Ihre eigene Logik implementieren entweder 1) -Prozess all (oder einige mit einem Timeout) ausstehende Nachrichten in der Warteschlange oder 2) die Nachrichten speichern und verarbeiten, wenn die Anwendung neu gestartet wird (in der Regel über JMQ mit persistenten Queues erledigt) – AngerClown

+0

Ich verstehe deine Frage @Jim immer noch nicht ganz. Können Sie die Frage bearbeiten und genauer sein? Sie stellen Shutdown-Code zur Verfügung, aber vielleicht ist Ihr Problem, dass Ihre Hintergrund-Task überhaupt nicht ausgeführt wird? – Gray

1

Um explizit zu warten, bis alle laufenden Aufgaben fertig sind, etwas tun, wie folgt aus:

try { 
    // Wait for one second indefinitively 
    while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) { 
    // wait until completion 
    } 
} catch (final InterruptedException ex) { 
    // interrupted... you may log something 
}