• spring+quartz 实现定时任务二


    在上一篇文章里面,已经可以启动定时器完成预期任务了.

    这个时候,客户提了个新的需求,需要在界面可以修改任务的启动间隔,这要怎么处理呢?

    其实是很简单的,quartz天生自带这个功能.

    为什么这么说呢,回想第一篇里面的,我是图省事才把所有需要的bean都配置在spring里面,有spring来注入和管理的

    现在这个要求,把spring的工作拿出来自己做就是了.

    1. 把上篇的所有配置全部删掉,只保留quartz的工厂bean

    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" /> 

    2.把所有的任务信息保存进数据库,其中class文件是真正要执行的task

    3. 配置一个开机启动的task,启动quartz

    <!-- quartz初始化任务,随着web项目的启动而启动 -->
    <bean id="loadTask" class="com.aw.task.LoadTask" init-method="initTask" />

    4. 实现LoadTask类

     1 public class LoadTask
     2 {
     3     private final Logger log = LoggerFactory.getLogger(this.getClass());     
     4     
     5     @Autowired
     6     private JobMapper jobMapper;  
     7     
     8     @Autowired
     9     private SchedulerFactoryBean schedulerFactoryBean;
    10     
    11     
    12     
    13     public Class<? extends Job> getJobClass(String className)
    14     {
    15         try
    16         {
    17             return (Class<? extends Job>) Class.forName(className);
    18         } catch (ClassNotFoundException e)
    19         {
    20             log.error(className + "*********" + e.toString());
    21             e.printStackTrace();
    22         }
    23         
    24         return null;
    25     }
    26     
    27     
    28     public void initTask() throws SchedulerException {             
    29         
    30         log.info("task manager start...");
    31         
    32         Scheduler scheduler = schedulerFactoryBean.getScheduler();
    33         
    34         List<ScheduleJob> jobList = jobMapper.getAllJob();
    35         
    36         for(ScheduleJob job: jobList)
    37         {
    38             //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
    39             TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
    40             
    41             //不存在,创建一个
    42             CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
    43             
    44             if (null == trigger) {
    45                 JobDetail jobDetail = JobBuilder.newJob(getJobClass(job.getClassName()))
    46                     .withIdentity(job.getJobName(), job.getJobGroup()).build();
    47                 jobDetail.getJobDataMap().put("scheduleJob", job);
    48                 //表达式调度构建器
    49                 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
    50                 //按新的cronExpression表达式构建一个新的trigger
    51                 trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
    52                 scheduler.scheduleJob(jobDetail, trigger);
    53             } else {
    54                 // Trigger已存在,那么更新相应的定时设置
    55                 //表达式调度构建器
    56                 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job
    57                     .getCronExpression());
    58                 //按新的cronExpression表达式重新构建trigger
    59                 trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
    60                     .withSchedule(scheduleBuilder).build();
    61                 //按新的trigger重新设置job执行
    62                 scheduler.rescheduleJob(triggerKey, trigger);
    63             }
    64             
    65         }
    66         
    67     }         
    68 }

    这样,上面的操作就可以把数据库里面定义的task保存起来了.

    那怎么更新task的时间间隔呢?

    5. 提供一个界面,让用户修改表里面的jobInterval字段,然后在修改成功后,执行下面的代码.

    //自动注入task加载类
    @Autowired
        private LoadTask loadTask;
    
    //保存完成以后
    loadTask.initTask();

    就可以重新调度了

  • 相关阅读:
    继承映射
    一对多,多对一,自关联的配置
    Spring 配置自动扫描spring bean配置
    Dao 处理
    2019暑假集训 括号匹配
    2019暑假集训 BLO
    2019暑假集训 Intervals
    2019暑假集训 平板涂色
    2019暑假集训 走廊泼水节
    0002-五层小山
  • 原文地址:https://www.cnblogs.com/raspberry/p/5534714.html
Copyright © 2020-2023  润新知