文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot 配置 Quartz 定时任务的方法

2024-04-02 19:55

关注

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";
    
   // 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();
    }
    
    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);
 
    }
 
    
    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());
    }
 
    
    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;
    }
 
    
    public void pauseAllJob()throws SchedulerException{
        scheduler.pauseAll();
    }
 
    
    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);
    }
 
    
    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);
    }
 
    
    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 定时任务内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯