Heim >Java >javaLernprogramm >Wie verwende ich Quartz, um geplante Java-Aufgaben mit hoher Verfügbarkeit zu implementieren?
Wenn Sie geplante Aufgaben erledigen möchten, hohe Verfügbarkeit
-Anforderungen haben oder einfach nur schnell loslegen
und einfach loslegen möchten, dann sind Sie hier genau richtig Es ist richtig, es zu wählen. 高可用
方面的需求,或者仅仅想入门快
,上手简单,那么选用它准没错。
定时任务模块是对Quartz框架进一步封装,使用更加简洁。
<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-quartz</artifactId> <version>1.5.4.1</version> </dependency>
实现org.quartz.Job
接口;使用注解CronExp
添加任务的调度策略;使用注解Component
将任务注入容器中。
启动项目,定时任务便处于监听与运行中。
@Component @DisallowConcurrentExecution @CronExp(cron = "0/5 * * * * ?") public class DemoJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("任务1:" + LocalDateTime.now()); } }
定时任务除了以既有频率周期性运行外,还有通过接口手动被触发的能力。
调用如下接口,可手动触发任务ID编号为jobId
的任务。
http://localhost:8080/cms-api/quartz/job/{jobId}
如果有手动触发定时任务的需求,则需要任务ID唯一并
且已知
,因此需要在编写定时任务时手动指定。
@CronExp(id = 1, cron = "0/5 * * * * ?")
通过注解CronExp
的id属性可指定任务ID,不显示指定则使用随机ID,不满足已知的条件,因此无法手动触发。
尽管大多数任务不需要注入参数,但仍有少量的场景需要向定时任务注入参数。
public void execute(JobExecutionContext context) { /* 如果在调用任务时传入了参数,则能够从Map中获取 */ Map<String, Object> dataMap = context.getMergedJobDataMap(); /* 比如从Map中获取一个键值对,一般来说参数均为基本数据类型 */ Object key = dataMap.get("key"); System.out.println("任务2:" + LocalDateTime.now() + ": " + key); }
在编写定时任务时,可从JobExecutionContext
对象中解析一个Map,从而完成参数的注入。
http://localhost:8080/cms-api/quartz/job/1?key=a
上述http调用的含义是手动触发任务ID为【1】的任务,并且向其传递参数为【key】值为【a】的参数。
本框架不支持任务并发,换句话说并发对定时任务不利,因此需要手动禁止。
需要注意的是Quartz
的并发是指当任务执行耗时超过任务调度周期时,上一个任务未执行完,新任务是否执行。
一般来说需要显示禁止并发,在任务类上添加注解DisallowConcurrentExecution
spring: quartz: properties: org.quartz.jobStore.isClustered: true org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource: qzDS org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo org.quartz.dataSource.qzDS.user: root org.quartz.dataSource.qzDS.password: 1234562. Schnell loslegenImplementieren Sie die
org.quartz.Job
-Schnittstelle; Verwenden Sie die Annotation Component
, um Aufgaben in den Container einzufügen. Starten Sie das Projekt und die geplanten Aufgaben werden überwacht und ausgeführt. rrreeeGeplante Aufgaben können nicht nur regelmäßig mit der vorhandenen Häufigkeit ausgeführt werden, sondern auch manuell über die Schnittstelle ausgelöst werden. 🎜🎜Rufen Sie die folgende Schnittstelle auf, um die Aufgabe manuell mit der Aufgaben-ID-Nummer3. Geplante Aufgaben manuell auslösen
jobId
auszulösen. 🎜🎜http://localhost:8080/cms-api/quartz/job/{jobId}
🎜🎜Wenn eine geplante Aufgabe manuell ausgelöst werden muss, muss die Aufgaben-ID unique and
code> und ist bekannt
, daher muss er beim Schreiben einer geplanten Aufgabe manuell angegeben werden. 🎜rrreee🎜Sie können die Aufgaben-ID angeben, indem Sie das id-Attribut von CronExp
mit Anmerkungen versehen. Wenn Sie sie nicht explizit angeben, wird eine zufällige ID verwendet. Sie erfüllt die bekannten Bedingungen nicht manuell ausgelöst werden. 🎜🎜4. Aufgaben mit Parametern🎜🎜Obwohl die meisten Aufgaben keine Parameter einfügen müssen, gibt es dennoch eine kleine Anzahl von Szenarien, die das Einfügen von Parametern in geplante Aufgaben erfordern. 🎜rrreee🎜Wenn Sie eine geplante Aufgabe schreiben, können Sie eine Map aus dem JobExecutionContext
-Objekt analysieren, um die Injektion von Parametern abzuschließen. 🎜rrreee🎜Die Bedeutung des obigen http-Aufrufs besteht darin, die Aufgabe manuell mit der Aufgaben-ID [1] auszulösen und ihr den Parameter [Schlüssel] mit dem Wert [a] zu übergeben. 🎜🎜5. Task-Parallelität🎜🎜Dieses Framework unterstützt keine Task-Parallelität. Mit anderen Worten: Parallelität ist für geplante Aufgaben nicht geeignet und muss daher manuell deaktiviert werden. 🎜🎜Es ist zu beachten, dass sich die Parallelität von Quartz
darauf bezieht, ob die neue Aufgabe ausgeführt wird, wenn die Aufgabenausführungszeit den Aufgabenplanungszyklus überschreitet und die vorherige Aufgabe nicht ausgeführt wurde. 🎜🎜 Im Allgemeinen ist es notwendig, das Verbot der Parallelität anzuzeigen. Fügen Sie der Task-Klasse die Anmerkung DisallowConcurrentExecution
hinzu, um die Task-Parallelität zu deaktivieren. 🎜🎜6. Persistenz🎜🎜Wenn für die geplante Aufgabe hohe Verfügbarkeitsanforderungen gelten, muss die Aufgabe beibehalten werden. Nachdem die Daten der geplanten Aufgabe in der Datenbank gespeichert wurden, können mehrere Anwendungen geöffnet werden. Nach der dauerhaften Bereitstellung geplanter Aufgaben auf mehreren Knoten hat ein Ausfall eines einzelnen Knotens im Cluster keine Auswirkungen auf die Ausführung geplanter Aufgaben. 🎜🎜Zeitgesteuerte Aufgabenpersistenz: Sie müssen nur die YML-Dateikonfiguration ändern, um das Ziel zu erreichen, ohne den Code zu ändern. Im Allgemeinen wird MySQL als persistenter Container verwendet. 🎜rrreee🎜Mit Ausnahme der Änderung der fünf Parameter Host, Port, Datenbankname, Benutzername und Passwort verwenden Sie für die anderen Parameter die Standardwerte. 🎜🎜🎜Verwenden Sie nach der Konfiguration der Datenbankverbindung das SQL-Skript und achten Sie auf die Initialisierung der Datenbank🎜🎜Das obige ist der detaillierte Inhalt vonWie verwende ich Quartz, um geplante Java-Aufgaben mit hoher Verfügbarkeit zu implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!