Spring Boot 配置 Quartz 定时任务的方法
作者:m17193095294
Quartz有四个核心概念:
Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所需要定时执行的 Job(任务)
Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());
JobDetail:Quartz 每次调度 Job 时,都重新创建一个 Job 实例,因此它不接受一个 Job 的实例,相反它接收一个 Job 实现类(JobDetail,描述 Job 的实现类及其他相关的静态信息,如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 Job。
rigger:是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的 15:00 ~ 16:00 执行调度等。
Scheduler:调度器就相当于一个容器,装载着任务和触发器,该类是一个接口,代表一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。
1.导入pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
2.开启定时任务
@EnableScheduling注解
//java fhadmin.cn @EnableScheduling @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
3.新建一个job
@Slf4j public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { executeTask(jobExecutionContext); } catch (Exception e) { e.printStackTrace(); } } //java fhadmin.cn private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException { //JobExecutionContext 类提供了调度应用的一些信息; //Job 运行时的信息保存在 JobDataMap 实例中。 JobKey key = jobExecutionContext.getJobDetail().getKey(); System.out.println(new Date()+"->"+key.toString()+"定时任务正在执行"); } }
4.构建JobDetailrigger
把Trigger 和 JobDetail 可以注册到 Scheduler 中
//fhrom fhadmin.cn @Configuration public class QuartzManager { // public static final String JOB1="job1"; // public static final String GROUP1="group1"; /**默认每个星期凌晨一点执行*/ //public static final String DEFAULT_CRON="0 0 1 ? * L"; /**默认5秒执行一次*/ // public static final String DEFAULT_CRON="*/5 * * * * ?"; /** * 任务调度 */ private Scheduler scheduler; @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory(); this.scheduler = schedulerFactoryBean.getScheduler(); return schedulerFactoryBean.getScheduler(); } /** * 开始执行定时任务 */ public void startJob(String name,String group,String time) throws SchedulerException { startJobTask(scheduler,name,group,time); scheduler.start(); } /** * 启动定时任务 * @param scheduler */ private void startJobTask(Scheduler scheduler,String name ,String group,String time) throws SchedulerException { //对于身份 JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(name,group).build(); System.out.println("jobDetail:-------------"+jobDetail); String DEFAULT_CRON="*/"+time+" * * * * ?"; // SimpleScheduleBuilder CronScheduleBuilder 用于构建Scheduler,定义任务调度的时间规则 CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON); //触发器 CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group) .withSchedule(cronScheduleBuilder).build(); scheduler.scheduleJob(jobDetail,cronTrigger); } /** * 获取Job信息 * @param name * @param group */ public String getjobInfo(String name,String group) throws SchedulerException { TriggerKey triggerKey=new TriggerKey(name,group); System.out.println("triggerKey:"+triggerKey); CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey); return String.format("time:%s,state:%s",cronTrigger.getCronExpression(), scheduler.getTriggerState(triggerKey).name()); } /** * 修改任务的执行时间 * @param name * @param group * @param cron cron表达式 * @return * @throws SchedulerException */ public boolean modifyJob(String name,String group,String cron) throws SchedulerException{ Date date=null; TriggerKey triggerKey=new TriggerKey(name, group); CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey); String oldTime=cronTrigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(cron)){ CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron); CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group) .withSchedule(cronScheduleBuilder).build(); date=scheduler.rescheduleJob(triggerKey,trigger); } return date !=null; } /** * 暂停所有任务 * @throws SchedulerException */ public void pauseAllJob()throws SchedulerException{ scheduler.pauseAll(); } /** * 暂停某个任务 * @param name * @param group * @throws SchedulerException */ public void pauseJob(String name,String group)throws SchedulerException{ JobKey jobKey=new JobKey(name,group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail==null) { return; } scheduler.pauseJob(jobKey); } /** * 恢复所有任务 * @throws SchedulerException */ public void resumeAllJob()throws SchedulerException{ scheduler.resumeAll(); } /** * 恢复某个任务 */ public void resumeJob(String name,String group)throws SchedulerException { JobKey jobKey=new JobKey(name,group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail==null) { return; } scheduler.resumeJob(jobKey); } /** * 删除某个任务 * @param name * @param group * @throws SchedulerException */ public void deleteJob(String name,String group)throws SchedulerException{ JobKey jobKey=new JobKey(name, group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail==null) { return; } scheduler.deleteJob(jobKey); } }
5.编写Controller
通过调用接口 可以开始定时任务 结束定时任务 获取任务信息
//fhadmin.cn @RestController @RequestMapping("/quartz") public class ModifyCronController { @Autowired private QuartzManager quartzManager; @GetMapping("/modify") public String modify(@RequestParam("job")String job, //job的名称 @RequestParam("group")String group,//job的组 @RequestParam("time")String time //执行定时任务的步长 ) throws SchedulerException { // quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1); quartzManager.startJob(job,group,time); String s = quartzManager.getjobInfo(job, group); System.out.println("job:"+s); return "ok"; } }
到此这篇关于Spring Boot 配置 Quartz 定时任务的文章就介绍到这了,更多相关Spring Boot Quartz 定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!