Chinaunix首页 | 论坛 | 博客
  • 博客访问: 621115
  • 博文数量: 298
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3077
  • 用 户 组: 普通用户
  • 注册时间: 2019-06-17 10:57
文章分类

全部博文(298)

文章存档

2022年(96)

2021年(201)

2019年(1)

我的朋友

分类: Java

2021-09-07 13:31:19

 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依赖

点击(此处)折叠或打开

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>

2.开启定时任务

@EnableScheduling注解
 

点击(此处)折叠或打开

  1. //java fhadmin.cn
  2. @EnableScheduling
  3. @SpringBootApplication
  4. public class DemoApplication {
  5.  
  6.     public static void main(String[] args) {
  7.         SpringApplication.run(DemoApplication.class, args);
  8.     }
  9.  
  10. }
3.新建一个job

点击(此处)折叠或打开

  1. @Slf4j
  2. public class MyJob implements Job {
  3.  
  4.     @Override
  5.     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  6.         try {
  7.           
  8.             executeTask(jobExecutionContext);
  9.         } catch (Exception e) {
  10.             e.printStackTrace();
  11.         }
  12.     }
  13.     //java fhadmin.cn
  14.     private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException {
  15. //JobExecutionContext 类提供了调度应用的一些信息;
  16. //Job 运行时的信息保存在 JobDataMap 实例中。
  17.  
  18.         JobKey key = jobExecutionContext.getJobDetail().getKey();
  19.         System.out.println(new Date()+"->"+key.toString()+"定时任务正在执行");
  20.  
  21.  
  22.     }
  23.  
  24. }
4.构建JobDetail  rigger ,把Trigger 和 JobDetail 可以注册到 Scheduler 中

点击(此处)折叠或打开

  1. //fhrom fhadmin.cn
  2. @Configuration
  3. public class QuartzManager {
  4.  
  5.    // public static final String JOB1="job1";
  6.    // public static final String GROUP1="group1";
  7.     /**默认每个星期凌晨一点执行*/
  8.     //public static final String DEFAULT_CRON="0 0 1 ? * L";
  9.     /**默认5秒执行一次*/
  10.    // public static final String DEFAULT_CRON="*/5 * * * * ?";
  11.  
  12.     /**
  13.      * 任务调度
  14.      */
  15.  
  16.      private Scheduler scheduler;
  17.  
  18.      @Bean
  19.     public Scheduler scheduler() throws SchedulerException {
  20.         SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
  21.         this.scheduler = schedulerFactoryBean.getScheduler();
  22.         return schedulerFactoryBean.getScheduler();
  23.     }
  24.     /**
  25.      * 开始执行定时任务
  26.      */
  27.     public void startJob(String name,String group,String time) throws SchedulerException {
  28.         startJobTask(scheduler,name,group,time);
  29.         scheduler.start();
  30.     }
  31.     /**
  32.      * 启动定时任务
  33.      * @param scheduler
  34.      */
  35.     private void startJobTask(Scheduler scheduler,String name ,String group,String time) throws SchedulerException {
  36.                                                            //对于身份
  37.         JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(name,group).build();
  38.         System.out.println("jobDetail:-------------"+jobDetail);
  39.  
  40.         String DEFAULT_CRON="*/"+time+" * * * * ?";
  41.         // SimpleScheduleBuilder CronScheduleBuilder 用于构建Scheduler,定义任务调度的时间规则
  42.         CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON);
  43.         //触发器
  44.         CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group)
  45.                 .withSchedule(cronScheduleBuilder).build();
  46.         scheduler.scheduleJob(jobDetail,cronTrigger);
  47.  
  48.     }
  49.  
  50.     /**
  51.      * 获取Job信息
  52.      * @param name
  53.      * @param group
  54.      */
  55.     public String getjobInfo(String name,String group) throws SchedulerException {
  56.         TriggerKey triggerKey=new TriggerKey(name,group);
  57.         System.out.println("triggerKey:"+triggerKey);
  58.         CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
  59.         return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),
  60.                 scheduler.getTriggerState(triggerKey).name());
  61.     }
  62.  
  63.     /**
  64.      * 修改任务的执行时间
  65.      * @param name
  66.      * @param group
  67.      * @param cron cron表达式
  68.      * @return
  69.      * @throws SchedulerException
  70.      */
  71.     public boolean modifyJob(String name,String group,String cron) throws SchedulerException{
  72.         Date date=null;
  73.         TriggerKey triggerKey=new TriggerKey(name, group);
  74.         CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
  75.         String oldTime=cronTrigger.getCronExpression();
  76.         if (!oldTime.equalsIgnoreCase(cron)){
  77.             CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);
  78.             CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)
  79.                     .withSchedule(cronScheduleBuilder).build();
  80.             date=scheduler.rescheduleJob(triggerKey,trigger);
  81.         }
  82.         return date !=null;
  83.     }
  84.  
  85.     /**
  86.      * 暂停所有任务
  87.      * @throws SchedulerException
  88.      */
  89.     public void pauseAllJob()throws SchedulerException{
  90.         scheduler.pauseAll();
  91.     }
  92.  
  93.     /**
  94.      * 暂停某个任务
  95.      * @param name
  96.      * @param group
  97.      * @throws SchedulerException
  98.      */
  99.     public void pauseJob(String name,String group)throws SchedulerException{
  100.         JobKey jobKey=new JobKey(name,group);
  101.         JobDetail jobDetail=scheduler.getJobDetail(jobKey);
  102.         if (jobDetail==null) {
  103.             return;
  104.         }
  105.         scheduler.pauseJob(jobKey);
  106.     }
  107.  
  108.     /**
  109.      * 恢复所有任务
  110.      * @throws SchedulerException
  111.      */
  112.     public void resumeAllJob()throws SchedulerException{
  113.         scheduler.resumeAll();
  114.     }
  115.     /**
  116.      * 恢复某个任务
  117.      */
  118.     public void resumeJob(String name,String group)throws SchedulerException {
  119.         JobKey jobKey=new JobKey(name,group);
  120.         JobDetail jobDetail=scheduler.getJobDetail(jobKey);
  121.         if (jobDetail==null) {
  122.             return;
  123.         }
  124.         scheduler.resumeJob(jobKey);
  125.     }
  126.  
  127.     /**
  128.      * 删除某个任务
  129.      * @param name
  130.      * @param group
  131.      * @throws SchedulerException
  132.      */
  133.     public void deleteJob(String name,String group)throws SchedulerException{
  134.         JobKey jobKey=new JobKey(name, group);
  135.         JobDetail jobDetail=scheduler.getJobDetail(jobKey);
  136.         if (jobDetail==null) {
  137.             return;
  138.         }
  139.         scheduler.deleteJob(jobKey);
  140.     }
  141.  
  142. }
5.编写Controller 

通过调用接口  可以开始定时任务  结束定时任务  获取任务信息

点击(此处)折叠或打开

  1. //fhadmin.cn
  2. @RestController
  3. @RequestMapping("/quartz")
  4. public class ModifyCronController {
  5.  
  6.     @Autowired
  7.     private QuartzManager quartzManager;
  8.     @GetMapping("/modify")
  9.     public String modify(@RequestParam("job")String job, //job的名称
  10.                          @RequestParam("group")String group,//job的组
  11.                          @RequestParam("time")String time //执行定时任务的步长
  12.      ) throws SchedulerException {
  13.        
  14.        // quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1);
  15.         quartzManager.startJob(job,group,time);
  16.         String s = quartzManager.getjobInfo(job, group);
  17.         System.out.println("job:"+s);
  18.  
  19.         return "ok";
  20.     }
  21. }


阅读(638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~