2016-05-18 11 views
0

zur Zeit habe ich eine Web-Anwendung auf Java 7, Tomcat 7 und Spring 4, die einen Thread auf Tomcat Start aufruft. Dieser Thread ist immer am Leben und der Java-Code ist:Quarz, Zeitplan Prozess immer lebendig

public class Scheduler { 
    Queue<Long> queue = new ArrayBlockingQueue<Long>(); 
    private static class ThreadExecutor implements Runnable 
    { 
     ....... 
     @Override 
     public void run() 
     { 
      while(true) 
      { 
       Long ID = queue.get(); 
       if(ID != null) 
       { 
        Object o = webFacade.get(ID); 
        //Exec.... 
       } 
       else 
       { 
        try 
        { 
         Thread.sleep(30000); 
        } 
        catch (InterruptedException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 
} 

Ein externes Ereignis füllt die Warteschlange mit der ID des Objekts. Mit einem Tomcat funktioniert dieser Thread gut, aber jetzt habe ich nedd, um einen anderen Tomcat hinzuzufügen, also möchte ich Quarz im gruppierten Modus vorstellen. Ich habe Quartz in meinem Projekt konfiguriert und es scheint zu funktionieren, aber jetzt wie kann ich diese Klasse mit Quartz "übersetzen" Ich möchte, dass nur ein Thread aktiv ist, weil es sehr teuer für meine Datenbank ist.

Vielen Dank im Voraus

Antwort

0

Im allgemeinen Quarz, während in einem Cluster-Modus ausgeführt wird, wird sichergestellt, dass der Auftrag nur auf einem Server ausgelöst werden (und behandeln).

So wird Arbeit sein die Aufgabe, die Sie (in anderen Worten, was ausgeführt werden soll) ausführen

Jetzt Quartz auch das Konzept der Trigger-einführt, die im Grunde definiert, wann wird der Auftrag ausgelöst werden.

Von Ihrem Code-Snippet aus führen Sie den Job alle 30000 ms = 30 Sekunden aus. Also triggern Sie alle 30 Sekunden Ihre Sachen (SimpleTrigger erledigt die Aufgabe).

So, die "while" Schleife geht weg, es wird automatisch von Quarz behandelt. Im Job arbeiten Sie nur mit einer Warteschlange. Es ist unklar, wer diese Warteschlange füllt, aber es sieht wie eine andere Frage aus.

Es ist schwer, genau zu sagen, wie Sie die Warteschlange übersetzen, aber im Allgemeinen Job sollte

  1. aus der Warteschlange Get
  2. Anruf webFacade wie jetzt

Das ist es

Last aber nicht zuletzt hat der Frühling eine schöne Integration mit Quarz Siehe Kapitel 33.6 Here

Hoffe, das hilft

+0

Ich mag Ihre Lösung. Ich habe eine andere Frage: Wenn ich eine Verbindung zur Produktionsdatenbank mit meinem lokalen Computer herstelle, möchte ich nicht, dass mein PC beginnt, Jobs auszuführen ... gibt es eine Möglichkeit, das Auslösen zu "deaktivieren"? Ich habe versucht, 'org.quartz.threadPool 'zu setzen .ThreadCount' mit einem niedrigeren Wert, aber es scheint nicht zu funktionieren. Danke – user3363936

+0

Ich weiß nicht, ob es in Quarz möglich ist. Das habe ich noch nie probiert. Vielleicht ist die beste Lösung, die Quarz-Integration nicht im Frühjahr einzusetzen. Für diesen Frühling hat Profile und neue @ Conditional Annotation, wenn Sie Frühling 4 laufen lassen. –

+0

Ich implementierte die Lösung, die Sie mir vorschlugen. Danke, es funktioniert. Aber jetzt habe ich noch eine Frage: Ich habe 3 Jobs: Alle sollten unabhängig voneinander ausgelöst werden, aber ich möchte, dass der selbe Job wartet, bis er wieder ausgelöst wird ... Ich habe versucht mit org.quarz.threadPool.threadCount zu spielen, aber ich bin darüber verwirrt ... kannst du mir bitte helfen? – user3363936

Verwandte Themen