<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>2.5.2</version> </dependency>
Quartz는 단일 애플리케이션 프로젝트에서 일반적으로 사용되는 예약된 작업 프레임워크입니다. 예약된 작업은 주로 다음과 같이 나눌 수 있습니다:
메모리의 작업: 일반적으로 프로젝트 내부에 정의되고 저장되며, 프로젝트가 다시 시작되면 작업이 자동으로 실행되지 않으면 다시 시작되지 않습니다.
지속적 작업: 작업의 특성을 데이터베이스에 저장한 후 원래 실행 중인 작업을 다시 읽고 계속 실행할 수 있습니다.
옥수수
는 작업이 트리거되는 시간을 제어하는 데 사용됩니다. corn
是用来控制任务触发的时刻。
我列举一些常用的:
每秒钟触发
"* * * * * *":
每隔5秒执行一次
*/5 * * * * ?
每分钟触发
"0 * * * * ?"
每一小时触发
"0 * * * * ?"
每天10点触发一次
"0 0 10 * * ?"
每天0点触发一次
"0 0 0 * * ?"
需要在启动类上加上@EnableScheduling
注解。
直接定义一个执行任务,例如:
每秒都输出测试
@Service public class ScheduleTest { @Scheduled(cron = "0/1 * * * * *") public void test() { System.out.println("测试"); } }
启动类:
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
启动后看控制台中就会输出相应的内容。
这里需要我们自己定义任务。
通过实现Job
接口,即可定义一个任务,并且我们可以手动去控制这个任务的开启。
public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("自定义任务"); } }
导入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.6.RELEASE</version> </dependency>
编写Controller,这是一个固定的写法。
指定任务: JobBuilder.newJob(任务.class) .withIdentity(任务名, 任务组).build();
指定cron表达式,创建Trigger:
CronScheduleBuilder.cronSchedule(cron表达式);
TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();
调用任务: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"; }
通过浏览器输入项目的地址,一般默认是localhost:8080/addSchedule
,输入后即可看到控制台输出了任务执行的输出内容。
如果工程重启了,上面的SimpleJob
这个定时任务并不会重新启动。解决的办法就是将任务持久化,Quartz
提供了解决方案,SpringBoot简化了这个操作。我们只需要配置好:数据库、数据源、操作数据库的JDBC即可。
依赖:
<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>
使用mysql数据库:导入它的驱动,mysql-connector-java。
使用Druid作为我们的数据源:druid。
使用spring-jdbc,帮助我们自动将任务信息存入到数据库中。
# 设置将定时任务的信息保存到数据库 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
官网:Downloads (quartz-scheduler.org)
以我:quartz-2.3.0-SNAPSHOT为例子:
下载源码后,找到jdbcjobstore
这个目录:
quartz-2.3.0-SNAPSHOTsrcorgquartzimpljdbcjobstore
然后会有一系列的sql
文件,找到和你数据库匹配的那个sql文件即可,我用的是mysql。
执行SQL文件建表,我的数据库名是:scheduled
,各位从我的url中应该也能看出来。
建表完成后,所有配置工作结束了,启动程序,重新在浏览器中输入:localhost:8080/addSchedule
,然后刷新一下数据库,就会发现任务被持久化了,此时重启工程后,该任务依旧会自动执行。
我们在手动开启该任务的时候会指定:
任务的名称和组
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();
在暂停和恢复任务时,就需要用JobKey.jobKey(任务名,任务组)
,得到一个JobKey
,然后使用scheduler.pauseJob(jobkey)
即可暂停任务;scheduler.resumeJob(jobKey)
恢复任务。
删除任务的时候需要将任务和Trigger都删除,而在上面我们可以拿到这个jobkey
表示任务,我们也需要拿到trigger,同样的我们也定义过启动器的名字和分组。
`TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();`
TriggerKey.triggerKey((启动器的名字, 启动器的分组);
也可以拿到trigger
// 暂停 @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"; }
@EnableScheduling</code을 추가해야 함 > 시작 클래스에 대한 주석입니다. 🎜🎜메모리 작업🎜<h4>프로젝트 시작 시 실행되는 작업</h4>🎜실행 작업을 직접 정의합니다. 예: 🎜🎜1초마다 <code>test
출력🎜rrreee🎜시작 클래스: 🎜 rrreee🎜시작하면 해당 콘텐츠가 콘솔에 출력됩니다. 🎜Job
인터페이스를 구현하여 작업을 정의하고 이 작업 열기를 수동으로 제어할 수 있습니다. 🎜rrreeeJobBuilder.newJob(task.class) .withIdentity(task name, task group).build();
🎜🎜🎜🎜cron 표현식을 지정하고 트리거를 생성합니다. 🎜🎜 CronScheduleBuilder.cronSchedule(cron 표현식);
🎜🎜🎜🎜TriggerBuilder.newTrigger().withIdentity( 런처, 스타터 그룹화) .withSchedule(cron).build();
🎜🎜🎜🎜🎜작업 호출: scheduler.scheduleJob(작업 유형 개체, 시작 개체)
🎜🎜🎜rrreee 🎜브라우저를 통해 프로젝트의 주소를 입력하세요. 기본값은 일반적으로 localhost:8080/addSchedule
입니다. 입력 후 콘솔에 작업 실행의 출력 내용을 볼 수 있습니다. 🎜🎜Persistence🎜🎜프로젝트가 다시 시작되면 위의 예약된 작업 SimpleJob
은 다시 시작되지 않습니다. 해결책은 작업을 유지하는 것입니다. Quartz
는 이 작업을 단순화합니다. 데이터베이스를 운영하려면 데이터베이스, 데이터 소스, JDBC만 구성하면 됩니다. 🎜🎜종속성: 🎜rrreee🎜🎜🎜mysql 데이터베이스 사용: 해당 드라이버 mysql-connector-java를 가져옵니다. 🎜🎜🎜🎜Druid를 데이터 소스로 사용: druid. 🎜🎜🎜🎜spring-jdbc를 사용하면 작업 정보를 데이터베이스에 자동으로 저장할 수 있습니다. 🎜🎜🎜jdbcjobstore
디렉터리를 찾으세요. 🎜🎜quartz-2.3.0-SNAPSHOTsrcorgquartzimpljdbcjobstore
🎜🎜 그런 다음 일련의 sql</ code> 파일에서 내가 사용하는 데이터베이스와 일치하는 sql 파일을 찾으세요. 🎜🎜<img src="https://img.php.cn/upload/article/000/000/164/168371556976615.png" alt="SpringBoot는 Quartz를 어떻게 통합합니까?" />🎜🎜SQL 파일을 실행하여 생성 테이블, I 데이터베이스 이름은 <code>scheduled
입니다. 내 URL에서 볼 수 있습니다. 🎜🎜테이블 생성이 완료되면 모든 구성 작업이 완료됩니다. 프로그램을 시작하고 브라우저에 localhost:8080/addSchedule
을 다시 입력한 다음 데이터베이스를 새로 고치면 작업이 표시됩니다. 이 시점에서 프로젝트를 다시 시작한 후에도 작업은 계속 자동으로 실행됩니다. 🎜🎜작업 일시 중지 및 작업 삭제🎜🎜작업을 수동으로 열 때 다음을 지정합니다: 🎜🎜🎜🎜작업의 이름과 그룹🎜🎜🎜rrreee🎜작업을 일시 중지하고 다시 시작할 때 를 사용해야 합니다. JobKey.jobKey(작업 이름, 작업 그룹)
, JobKey
를 가져온 다음 scheduler.pauseJob(jobkey)
를 사용하여 작업을 일시 중지합니다. Scheduler.resumeJob( jobKey)작업을 재개합니다. 🎜🎜🎜🎜작업을 삭제할 때 작업과 트리거를 모두 삭제해야 합니다. 위에서 작업을 나타내는 jobkey
도 얻을 수 있습니다. 런처 이름과 그룹도 정의했습니다. 🎜🎜🎜rrreee🎜TriggerKey.triggerKey((런처 이름, 런처 그룹);
런처를 나타내는 trigger
를 얻을 수도 있습니다.🎜通过以下顺序完整删除任务
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"; }
위 내용은 Quartz를 SpringBoot와 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!