Rumah  >  Artikel  >  Java  >  Bagaimana untuk mengintegrasikan Kuarza dengan SpringBoot

Bagaimana untuk mengintegrasikan Kuarza dengan SpringBoot

PHPz
PHPzke hadapan
2023-05-10 18:46:06902semak imbas

Kebergantungan asas

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.5.2</version>
</dependency>

Kuarza ialah rangka kerja tugas berjadual yang kerap digunakan dalam projek aplikasi tunggal. Tugas yang dijadualkan boleh dibahagikan terutamanya kepada:

  • Tugasan dalam ingatan : Secara umumnya ditakrifkan dan disimpan di dalam projek, jika projek dimulakan semula, jika tugas itu tidak dilaksanakan secara automatik, ia tidak akan dihidupkan lagi.

  • Tugas yang berterusan: Simpan ciri tugasan dalam pangkalan data Selepas projek dimulakan semula, tugasan yang asalnya dilaksanakan boleh dibaca semula dan pelaksanaan diteruskan.

ungkapan cron

corn digunakan untuk mengawal masa apabila tugasan dicetuskan.

Saya menyenaraikan beberapa yang biasa digunakan:

  • Cetus setiap saat

"* * * * * *":
  • Setiap 5 Laksanakan sekali setiap saat

*/5 * * * * ?
  • Cetus setiap minit

"0 * * * * ?"
  • Cetus setiap jam

"0 * * * * ?"
  • Dicetuskan sekali sehari pada pukul 10

"0 0 10 * * ?"
  • Dicetuskan sekali sehari pada 0 pukul

"0 0 0 * * ?"

Umum

perlu dianotasi dengan @EnableScheduling pada kelas permulaan.

Tugas ingatan

Tugas yang dilaksanakan apabila projek bermula

Tentukan secara langsung tugas pelaksanaan, contohnya:

Output setiap saat测试

@Service
public class ScheduleTest {

    @Scheduled(cron = "0/1 * * * * *")
    public void test() {
        System.out.println("测试");
    }
}

Kelas permulaan:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Selepas permulaan, kandungan yang sepadan akan dikeluarkan dalam konsol.

Kawal tugasan secara manual

Di sini kita perlu menentukan tugas itu sendiri.

Tentukan tugasan

Dengan melaksanakan antara muka Job, anda boleh menentukan tugasan dan kami boleh mengawal pembukaan tugasan ini secara manual.

public class SimpleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("自定义任务");
    }
}

Gunakan Pengawal Web untuk memulakan tugas ini

Import kebergantungan:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.6.RELEASE</version>
</dependency>

Pengawal Penulisan, ini ialah cara penulisan yang tetap.

  • Nyatakan tugas: JobBuilder.newJob(任务.class) .withIdentity(任务名, 任务组).build();

  • Nyatakan ungkapan cron dan buat Pencetus:

    • CronScheduleBuilder.cronSchedule(cron表达式);

    • TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();

  • Tugas panggilan: scheduler.scheduleJob(任务类型对象, 启动器对象)

/**
 * @ClassName
 * @Description
 * @Author:chengyunlai
 * @Date
 * @Version 1.0
 **/
@RestController
public class DynamicScheduleController {

    @Autowired
    private Scheduler scheduler;

    @GetMapping("/addSchedule")
    public String addSchedule() throws SchedulerException {
        int random = ThreadLocalRandom.current().nextInt(1000);
        // 1. 创建JobDetail,指定定时任务实现类的类型
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("test-schedule" + random, "test-group").build();
        // 2. 创建Trigger,并指定每3秒执行一次
        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group")
                .withSchedule(cron).build();

        // 3. 调度任务
        scheduler.scheduleJob(jobDetail, trigger);
        return "success";
    }

Masukkan alamat projek melalui penyemak imbas Lazimnya localhost:8080/addSchedule Selepas masuk, anda boleh melihat konsol mengeluarkan kandungan output pelaksanaan tugas.

Kegigihan

Jika projek dimulakan semula, tugas berjadual SimpleJob di atas tidak akan dimulakan semula. Penyelesaiannya adalah untuk meneruskan tugas Quartz menyediakan penyelesaian yang memudahkan operasi ini. Kami hanya perlu mengkonfigurasi: pangkalan data, sumber data dan JDBC untuk mengendalikan pangkalan data.

Pergantungan:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>
  • Gunakan pangkalan data mysql: import pemacunya, mysql-connector-java.

  • Menggunakan Druid sebagai sumber data kami: druid.

  • Gunakan spring-jdbc untuk membantu kami menyimpan maklumat tugas secara automatik ke dalam pangkalan data.

Konfigurasi

# 设置将定时任务的信息保存到数据库
spring.quartz.job-store-type=jdbc

# 每次应用启动的时候都初始化数据库表结构
# 如果 spring.quartz.jdbc.initialize-schema 设置为 always 的话有个问题:每次重启应用的时候,跟 Quartz 相关的表会被删除重建!
# 所以为了避免表被重复创建,我们可以提前创建表,然后将其指定为never
spring.quartz.jdbc.initialize-schema=never

# 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/scheduled?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root

Kuarza telah menyediakan jadual data sql untuk kami

Tapak web rasmi: Muat Turun (quartz-scheduler.org)

Ambil saya: quartz-2.3.0-SNAPSHOT sebagai contoh:

Selepas memuat turun kod sumber, cari direktori jdbcjobstore:

quartz-2.3.0-SNAPSHOTsrcorgquartzimpljdbcjobstore

Kemudian akan ada satu siri fail sql, cuma cari fail sql yang sepadan dengan pangkalan data anda saya menggunakan mysql.

Bagaimana untuk mengintegrasikan Kuarza dengan SpringBoot

Laksanakan fail SQL untuk mencipta jadual nama pangkalan data saya ialah: scheduled Anda sepatutnya dapat melihatnya dari URL saya.

Selepas penciptaan jadual selesai dan semua kerja konfigurasi selesai, mulakan atur cara dan masukkan semula: localhost:8080/addSchedule dalam penyemak imbas, kemudian muat semula pangkalan data dan anda akan mendapati bahawa tugas itu berterusan selepas dimulakan semula projek , tugasan masih akan dilaksanakan secara automatik.

Jeda tugasan dan padamkan tugasan

Apabila kami memulakan tugasan secara manual, kami akan menentukan:

  • Nama dan kumpulan tugasan

JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();

Apabila menjeda dan menyambung semula tugas, anda perlu menggunakan JobKey.jobKey(任务名,任务组) untuk mendapatkan JobKey, dan kemudian gunakan scheduler.pauseJob(jobkey) untuk menjeda tugasan itu; scheduler.resumeJob(jobKey)

  • Apabila memadamkan tugasan, anda perlu memadamkan kedua-dua tugasan dan pencetus. Di atas kita boleh mendapatkan ini untuk mewakili tugasan , kami juga menentukan Lulus nama pelancar dan kumpulan.

    jobkey

    `TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();`
Anda juga boleh mendapatkan

untuk menunjukkan pelancar. TriggerKey.triggerKey((启动器的名字, 启动器的分组);

  • 通过以下顺序完整删除任务

    • scheduler.deleteJob(jobKey);

    • scheduler.unscheduleJob(triggerKey);

    • scheduler.pauseTrigger(triggerKey);

    • // 停止触发器

    • // 移除触发器

    • // 删除任务

// 暂停
@GetMapping("/pauseSchedule")
public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 获取定时任务
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.pauseJob(jobKey);
    return "success";
}

// 恢复
@GetMapping("/remuseSchedule")
public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 获取定时任务
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.resumeJob(jobKey);
    return "success";
}

// 删除定时任务
@GetMapping("/removeSchedule")
public String removeSchedule(String jobName, String jobGroup, String triggerName, String triggerGroup) throws SchedulerException {
    TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

    Trigger trigger = scheduler.getTrigger(triggerKey);
    if (trigger == null) {
        return "error";
    }
    // 停止触发器
    scheduler.pauseTrigger(triggerKey);
    // 移除触发器
    scheduler.unscheduleJob(triggerKey);
    // 删除任务
    scheduler.deleteJob(jobKey);
    return "success";
}

Atas ialah kandungan terperinci Bagaimana untuk mengintegrasikan Kuarza dengan SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam