<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.
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 * * ?"
perlu dianotasi dengan @EnableScheduling
pada kelas permulaan.
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.
Di sini kita perlu menentukan tugas itu sendiri.
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("自定义任务"); } }
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.
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.
# 设置将定时任务的信息保存到数据库 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
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.
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.
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)
jobkey
`TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();`
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!