2016-07-27 6 views
0

Viele Beiträge sagten, wir können ScheduledExecutorService in einem ServletContextListener verwenden. Aber ich möchte einen Timer auf irgendeine Art von Umständen starten und dann bei einem anderen Umstand stoppen. Starten Sie beispielsweise einen Timer in Anfrage A von Client A, stoppen Sie ihn in Anfrage B von Client A oder Client B. Soll ich den Timer in der Sitzung speichern oder nicht?Wie starte und beende ich einen Timer oder einen Job in der Tomcat-Servlet-Anfrage dynamisch?

Das eigentliche Problem ist dies: Ich erstelle eine Bestellung von einer Web-Anfrage, ich möchte die Bestellung stornieren, wenn sie nicht nach 24 Stunden bezahlt wurde.

Um die Dinge klar zu machen, nehme ich die Situation so: Ich erstelle ein Objekt aus einer Web-Anfrage, ich möchte das Objekt löschen, wenn es nach 10 Sekunden nicht behandelt wurde. War es in so kurzer Zeit gut, einen Zeitplan-Job wie alle 5 oder 8 Sekunden auszuführen? Ich möchte den Job genau nach 10 Sekunden oder sogar 1 Sekunde erledigen.

Antwort

0

Normalerweise würde diese Art von Aufgabe als geplante Hintergrundaufgabe ausgeführt, die Ihr Repository von Aufträgen für diejenigen überprüfen würde, die abgelaufen sind und abgebrochen werden müssen. Sie sollten dafür nicht die HTTP-Sitzung verwenden müssen.

In Ihrer Order Klasse können Sie eine Eigenschaft hinzufügen, die der Zeitstempel ist, als sie in Anforderung A erstellt wurde, die beim Nachschlagen helfen würde.

Erstellen Sie dann einen Scheduler:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

erstellen Runnable Aufgabe, die für alte Aufträge überprüfen wird, die Aufhebung müssen:

Runnable cancelUnpaidOrdersTask = new Runnable() { 
     public void run() { 
      // Your code to look for orders where the timestamp is older than 24 hours and then cancel them. 
     } 
    }; 

Dann jede Minute diese Aufgabe ausführen - oder aber oft Sie fühlen müsste nach Ihren eigenen Anforderungen überprüfen.

scheduler.scheduleAtFixedRate(cancelUnpaidOrdersTask, 0, 1, TimeUnit.MINUTES); 

Weitere Details in der Javadocs für ScheduledExecutorService

+0

Diese Antwort hier erklärt, wie man einen Testamentsvollstrecker Service in einem Web-Kontext instanziieren: http://stackoverflow.com/a/9186070/2892670 – tchambers

+0

Dank. Aber ich möchte etwas anderes. Ich bearbeite meine Frage, um es klarzustellen. –

+0

Ich bin nicht sicher, dass es ein sehr gutes Design ist, aber Sie könnten eine [PassiveExpiringMap] verwenden (https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/ PassiveExpiringMap.html) um die Objekte zu speichern - vermutlich benötigen Sie irgendeine Art von ID oder Schlüssel, um sie nachzuschlagen. Guava hat ein ähnliches Konzept in [CacheBuilder] (https://google.github.io/guava/releases/17.0/api/docs/com/google/common/cache/CacheBuilder.html), wo Sie den '.expireAfterWrite verwenden können (10, TimeUnit.SECONDS) Methode während des Aufbaus. – tchambers

Verwandte Themen