Heim  >  Artikel  >  Java  >  Wie verwende ich Quartz, um geplante Java-Aufgaben mit hoher Verfügbarkeit zu implementieren?

Wie verwende ich Quartz, um geplante Java-Aufgaben mit hoher Verfügbarkeit zu implementieren?

WBOY
WBOYnach vorne
2023-05-07 12:55:071285Durchsuche

Anleitung zur Verwendung geplanter Aufgaben

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框架进一步封装,使用更加简洁。

1、引入依赖

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-quartz</artifactId>
    <version>1.5.4.1</version>
</dependency>

2、快速上手

实现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());
    }
}

3、手动触发定时任务

定时任务除了以既有频率周期性运行外,还有通过接口手动被触发的能力。

调用如下接口,可手动触发任务ID编号为jobId的任务。

http://localhost:8080/cms-api/quartz/job/{jobId}

如果有手动触发定时任务的需求,则需要任务ID唯一并已知,因此需要在编写定时任务时手动指定。

@CronExp(id = 1, cron = "0/5 * * * * ?")

通过注解CronExp的id属性可指定任务ID,不显示指定则使用随机ID,不满足已知的条件,因此无法手动触发。

4、带参数任务

尽管大多数任务不需要注入参数,但仍有少量的场景需要向定时任务注入参数。

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】的参数。

5、任务并发

本框架不支持任务并发,换句话说并发对定时任务不利,因此需要手动禁止。

需要注意的是Quartz的并发是指当任务执行耗时超过任务调度周期时,上一个任务未执行完,新任务是否执行。

一般来说需要显示禁止并发,在任务类上添加注解DisallowConcurrentExecution

Das Modul für geplante Aufgaben kapselt das Quartz-Framework weiter und vereinfacht die Verwendung.

1. Abhängigkeiten einführen

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: 123456

2. Schnell loslegen

Implementieren 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.
rrreee

3. Geplante Aufgaben manuell auslösen

Geplante 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-Nummer 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen