美文网首页商通贷技术分享
Java - Quartz 定时任务

Java - Quartz 定时任务

作者: 33d31a1032df | 来源:发表于2017-06-01 21:53 被阅读3060次

    Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。

    基础概念

    Job

    具体需要处理的业务逻辑。

    JobDetail

    详细的任务描述,包括名称,关联的JobJob运行时所需要的参数等。

    Trigger

    任务调度器,描述什么时候执行Job,多久执行一次。

    • SimpleTrigger 设置重复次数,重复执行间隔时长
    • CronTrigger 设置Cron表达式

    Scheduler

    调度容器,JobTrigger都需要在容器中注册,被容器统一管理。

    Cron表达式

    范式

    表达式 说明
    */5 * * * * ? 每隔5秒执行一次
    0 */1 * * * ? 每隔1分钟执行一次
    0 0 23 * * ? 每天23点执行一次
    0 0 23 ? * * 每天23点执行一次
    0 0 23 * * ? * 每天23点执行一次
    0 0 23 * * ? 2016 2016年每天23点执行一次
    0 0 1 * * ? 每天1点执行一次
    0 0 1 1 * ? 每月1号1点执行一次
    0 * 14 * * ? 每天14:00点到14:59期间,每隔1分钟执行一次
    0 0-5 14 * * ? 每天14:00点到14:05期间,每隔1分钟执行一次
    0 0 23 L * ? 每月最后一天23点执行一次
    0 0 1 ? * L 每周星期六1点执行一次
    0 26,29,33 * * * ? 在26分、29分、33分执行一次
    0 0 0,13,18,21 * * ? 每天的0点、13点、18点、21点都执行一次
    0 0 0 ? * 6#3 每月第3个星期六

    表达式

    字段 可选值 特殊字符
    0 - 59 , - * /
    0 - 59 , - * /
    0 - 23 , - * /
    1 - 31 , - * / ? L W
    1 - 12 , - * /
    1(Sun) - 7(Sat) , - * / ? L #
    年(可选) 1970 - 2099 , - * /

    特殊字符

    字符 说明
    , 指定多个数值
    - 指定一个范围
    * 代表整个时间段
    / 多长时间执行一次
    ? 不确定的值
    L 每月最后一天(日)/每月最后一个星期六(周)
    W 最近的工作日
    # 每月第N个工作日

    示例

    QuartzManager

    QuartzManager中我封装了很多方法,包括JobTrigger的添加,删除,修改等,这里只列举了其中一个。

    public class QuartzManager {
        /**
         * 添加任务
         *
         * @param jobName      任务名
         * @param jobGroup     任务组
         * @param jobClass     任务实现类
         * @param jobData      任务数据
         * @param triggerName  触发器名
         * @param triggerGroup 触发器组
         * @param triggerCron  触发器Cron表示式
         * @return
         */
        public Boolean addJob(String jobName, String jobGroup, Class<? extends Job> jobClass, Map<String, Object> jobData, 
                                String triggerName, String triggerGroup, String triggerCron) {
            try {
                // 任务名,任务组,任务执行类
                JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
                if (jobData != null && jobData.size() > 0)
                    jobDetail.getJobDataMap().putAll(jobData);
    
                // 触发器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 触发器名,触发器组
                triggerBuilder.withIdentity(triggerName, triggerGroup);
                // 触发器时间设定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(triggerCron));
                // 创建Trigger对象
                CronTrigger trigger = (CronTrigger) triggerBuilder.build();
    
                // 调度容器设置JobDetail和Trigger
                scheduler.scheduleJob(jobDetail, trigger);
                return true;
            } catch (SchedulerException e) {
                e.printStackTrace();
                return false;
            }
        }
        ...
    }
    

    MyJob

    public class MyJob implements Job {
        private final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            JobDetail jobDetail = jobExecutionContext.getJobDetail();
            JobDataMap jobDataMap = jobDetail.getJobDataMap();
            String x = jobDataMap.getString("x");
            String y = jobDataMap.getString("y");
            System.out.println(String.format("%s x=%s, y=%s", df.format(new Date()), x, y));
        }
    }
    

    QuartzTest

    public class QuartzTest {
        @Test
        public void test() throws Exception {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            QuartzManager quartzManager = new QuartzManager(scheduler);
    
            // 每1000毫秒执行一次,重复执行3次,共执行4次
            quartzManager.addJob("myJob", "test", MyJob.class, Collections.singletonMap("x", "1"), 1000L, 3);
            quartzManager.startScheduler();
    
            while (Thread.activeCount() > 0)
                Thread.yield();
        }
    }
    

    完整示例:GitHub
    PS:本文使用的是quartz-2.2.3

    相关阅读:Spring - 整合Quartz

    相关文章

      网友评论

        本文标题:Java - Quartz 定时任务

        本文链接:https://www.haomeiwen.com/subject/ofqyfxtx.html