Vorwort
Um eine hohe Verfügbarkeit und eine hohe Parallelität der Anwendungen zu gewährleisten, werden im Allgemeinen mehrere Knoten eingesetzt. Bei Timing -Aufgaben konsumiert er, wenn jeder Knoten seine eigenen Zeitaufgaben ausführt, eineseits Systemressourcen.
Andererseits werden einige Aufgaben mehrmals ausgeführt, was zu Logikproblemen von Anwendungen führen kann. Daher ist ein verteiltes Planungssystem erforderlich, um jeden Knoten für die Ausführung von Zeitaufgaben zu koordinieren.
Spring integriert Quarz
Quartz ist ein ausgereiftes Aufgabenplanungssystem. Der Frühling ist mit Quarz für eine einfache Entwicklung kompatibel. Mal sehen, wie man es integriert:
1.Maven -Abhängigkeitsdatei
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.5.RELEASE</version> </abhängig> <depeopecy> <gruppe> org.quartz-Planer </GroupId> <artifactId> Quarz </artifactId> <version> 2.2.3 </Version> </abhängig> <Depopenty> <GroupId> mySQL </gruppen> <artifactid> mysql-connector-java </artifactid> </artifactId> 5.1.29 </artifactid> </artifactId> 5.1.2Sql-connector-java </artifactId> </artifactid> </artifactid> 5.1.2. </Abhängigkeiten>
Die wichtigsten sind Frühlingsbibliotheken, Quarzbibliotheken und MySQL-Treiberbibliotheken. Hinweis: Verteilte Planung erfordert eine Datenbankgebrauch, und MySQL wird hier ausgewählt.
2. Konfigurieren Sie den Job
Es gibt zwei Möglichkeiten, Jobs zu konfigurieren:
2.1MethodinvokingJobDetailFactoryBean
Wenn Sie eine Methode einer bestimmten Bean aufrufen möchten, lautet die spezifische Konfiguration wie folgt:
<bean id = "firstTask"> <Eigenschaft name = "targetObject" Ref = "FirstService" /> <Eigenschaft name = "targetMethod" value = "service" /> < /bea>
2.2jobdetailFactoryBean
Diese Methode ist flexibler und kann wie folgt die Passparameter einstellen:
<bean id = "firstTask"> <Eigenschaft name = "JobClass" value = "zh.maven.squartz.task.firsttask"/> <Eigenschaft name = "jobdatamap"> <map> <eintragsschlüssel = "FirstService" Value-REF = "FirstService"/> </map> </momites> </banes.
Die von JobClass definierte Aufgabenklasse erbt Quartzjobbean und implementiert die executeInternale Methode. Jobdatamap wird verwendet, um Daten an den Job weiterzugeben
3. Konfigurieren Sie die für die Planung verwendeten Trigger
Es werden auch zwei Triggertypen bereitgestellt: SimpliggerFactoryBean und CrontriggerfactoryBean
Konzentrieren Sie sich auf CrontriggerFactoryBean, dieser Typ ist flexibler, wie folgt:
<bean id = "firstcontrigger"> <Eigenschaft name = "JobDetail" ref = "firstTask" /> <Eigenschaft name = "cronexpression" value = "0/5 * * * * *" /> < /bean>
JobDetail gibt den in Schritt 2 konfigurierten Job an, und die Cronexpression ist so konfiguriert, dass sie den Job alle 5 Sekunden ausführen.
4. Konfigurieren Sie die SchedulerFactoryBean des Quartz Scheduler
Es gibt auch zwei Methoden: Speicher -Ramjobstore- und Datenbankmethoden
4.1 Speicher Ramjobstore
Die berufsbezogenen Informationen werden im Speicher gespeichert, und jeder Knoten speichert seine eigenen, isoliert sich gegenseitig und wird wie folgt konfiguriert:
<bean> <Eigenschaft name = "Triggers"> <list> <ref bean = "firstcontrigger"/> </list> </property> </bean>
4.2 Datenbankmethode
Die relevanten Informationen des Jobs werden in der Datenbank gespeichert. Alle Knoten teilen die Datenbank. Jeder Knoten kommuniziert über die Datenbank, um sicherzustellen, dass ein Job nur gleichzeitig auf einem Knoten ausgeführt wird.
Wenn ein Knoten fehlschlägt, wird der Job anderen Knoten für die Ausführung zugewiesen. Die spezifische Konfiguration ist wie folgt:
<bean id = "dataSource" Destroy-method = "close"> <Eigenschaft name = "TRAVERCLASS" value = "com.mysql.jdbc.driver </bean> <bean> <Eigenschaft name = "dataSource" ref = "dataSource"/> <Eigenschaft name = "configLocation" value = "classPath: quartz.properties"/> <Eigenschaft name = "Triggers"> <list> <ref bean
DataSource wird verwendet, um Datenquellen und Datentabellenbezogene Informationen zu konfigurieren. Sie können das GZ -Paket von der offiziellen Website herunterladen. Die SQL -Datei befindet sich unter dem Pfad: DOCS/DBTABLE, der die SQL -Datei für die Mainstream -Datenbank bereitstellt.
Die in der Konfiguration konfigurierte Quartz.Properties -Datei befindet
org.quartz.jobstore.class: org.quartz.simpl.ramjobstore
Hier müssen Sie Quartz.Properties kopieren und einige Änderungen vornehmen. Die spezifischen Modifikationen sind wie folgt:
org.quartz.scheduler.instanceId: autoorg.quartz.jobstore.class: org.quartz.impl.jdbcjobstore.jobstoretxorg.quartz.jobstore.isclustered: trueorg.quartz.jobstore
5. Verwandte Kategorien
Public Class FirstTask erweitert Quartzjobbean {private FirstService FirstService; @Override Protected void executeInternal (JobExecutionContext Context) löst JobExecutionException {FirstService.Service () aus; } public void setFirstService (FirstService FirstService) {this.FirstService = FirstService; }}FirstTask erbt Quartzjobbean, implementiert ExecuteInternal -Methode und ruft FirstService auf
öffentliche Klasse FirstService implementiert serialisierbare {private statische endgültige lange Serialversionuid = 1L; public void service () {System.out.println (new SimpledateFormat ("yyymmdd HH: mm: ss"). Format (neues Datum ()) + "--- start firstService"); try {thread.sleep (2000); } catch (interruptedException e) {e.printstacktrace (); } System.out.println (new SimpledateFormat ("yyymmdd hh: mm: ss"). Format (neuer Date ()) + "--- End FirstService"); }}FirstService muss eine Serialisierungsschnittstelle bereitstellen, da sie in der Datenbank gespeichert werden muss.
public class App {public static void main (String [] args) {AbstractApplicationContext context = new classPhodexMlApplicationContext ("quartz.xml"); }}Die Hauptklasse wird verwendet, um die Quartz -Konfigurationsdatei zu laden.
Testverteilter Planung
1. Starten Sie die App zweimal gleichzeitig und beobachten Sie das Protokoll:
20180405 14:48:10 --- Start FirstService
20180405 14:48:12 ---- Ende FirstService
20180405 14:48:15 --- Start FirstService
20180405 14:48:17 ---- Ende FirstService
Unter ihnen hat A1 eine logarithmische Ausgabe, A2 nicht; Wenn A1 gestoppt wird, hat A2 eine Protokollausgabe;
2. Fügen Sie neue Jobs hinzu und erstellen Sie neue: SecondTask bzw. SecondService. Fügen Sie gleichzeitig relevante Konfigurationsdateien hinzu. Starten Sie die App zweimal und beobachten Sie das Protokoll:
Das A1 -Protokoll lautet wie folgt:
20180405 15:03:15 --- Start FirstService
20180405 15:03:15 --- Start SecondService
20180405 15:03:17 ---- Ende FirstService
20180405 15:03:17 --- Ende SecondService
20180405 15:03:20 --- Start FirstService
20180405 15:03:22 ---- Ende FirstService
20180405 15:03:25 --- Start FirstService
20180405 15:03:27 ---- Ende FirstService
Das A2 -Protokoll lautet wie folgt:
20180405 15:03:20 --- Start SecondService
20180405 15:03:22 --- Ende SecondService
20180405 15:03:25 --- Start SecondService
20180405 15:03:27 --- Ende SecondService
Es ist festzustellen, dass sowohl A1 als auch A2 Ausführungsaufgaben haben, aber dieselbe Aufgabe wird nur gleichzeitig auf einem Knoten ausgeführt, und es ist möglich, anderen Knoten nach Abschluss der Ausführung zugeordnet zu werden.
3. Wenn die Intervallzeit beispielsweise geringer ist als die Ausführungszeit der Aufgaben, wird hier hier in den Schlaf geändert (6000)
Das A1 -Protokoll lautet wie folgt:
20180405 15:14:40 --- Start FirstService
20180405 15:14:45 --- Start FirstService
20180405 15:14:46 ---- Ende FirstService
20180405 15:14:50 --- Start FirstService
20180405 15:14:50 --- Start SecondService
20180405 15:14:51 --- Ende FirstService
Das A2 -Protokoll lautet wie folgt:
20180405 15:14:40 --- Start SecondService
20180405 15:14:45 --- Start SecondService
20180405 15:14:46 --- Ende SecondService
20180405 15:14:51 --- Ende SecondService
Das Intervall beträgt 5 Sekunden, während die Aufgabenausführung 6 Sekunden dauert. Wenn Sie das Protokoll beobachten, können Sie feststellen, dass die Aufgabe noch nicht beendet ist und eine neue Aufgabe begonnen hat. Diese Situation kann logische Probleme in der Anwendung verursachen, was tatsächlich die Frage ist, ob die Aufgabe Serien unterstützen kann.
4. @DisallowConcurrentExecution Annotation sorgt für die Serialisierung von Aufgaben
Fügen Sie @DisallowConcurrentExecution Annotation auf FirstTask und SecondTask hinzu, und die Protokollergebnisse sind wie folgt:
Das A1 -Protokoll lautet wie folgt:
20180405 15:32:45 --- Start FirstService
20180405 15:32:51 --- Ende FirstService
20180405 15:32:51 --- Start FirstService
20180405 15:32:51 --- Start SecondService
20180405 15:32:57 ---- Ende FirstService
20180405 15:32:57 --- Ende SecondService
20180405 15:32:57 --- Start FirstService
20180405 15:32:57 --- Start SecondService
Das A2 -Protokoll lautet wie folgt:
20180405 15:32:45 --- Start SecondService
20180405 15:32:51 --- Ende SecondService
Wenn Sie die Protokolle beobachten, können Sie feststellen, dass die Aufgabe erst nach dem Ende eine neue Aufgabe startet und die Serialisierung der Aufgabe erkennen.
Zusammenfassen
Dieser Artikel zielt darauf ab, ein intuitives Verständnis der verteilten Zeitplanung von Spring+Quarz zu haben und das Problem durch die tatsächliche Verwendung zu lösen. Natürlich kann es viele Fragen geben, wie es geplant ist, was passieren wird, wenn die Datenbank aufgehängt wird, und ein ausführlicheres Verständnis ist erforderlich.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.