QuartZ

声音感觉小的可以设置windows响度均衡:https://jingyan.baidu.com/article/ed15cb1ba197551be2698171.html
cron表达式生成工具,可调试cron:http://www.bejson.com/othertools/cron/

 

 官网:www.quartz-scheduler.org

 

 组件模式:最终要的三部分:日任务job,触发器trigger,调度器schedule

所有的任务调度都要通过execute完成

 

 

 入门案例:

public class HelloJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 输出当前时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dataString = sdf.format(date);
        // 工作内容
        System.out.println("正在进行数据库的备份工作,备份数据库的时间是:" + dataString);
    }

}
public class HelloScheduleDemo {

    public static void main(String[] args) throws Exception {
        // 1.调度器(Scheduler) ,从工厂中获取调度的实例(默认:实例化)
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        // 2.任务实例
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 参数1:任务的名称;参数2:任务组的名称
                .build();
        // 3.触发器
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")// 参数1:触发器名称;参数2:触发器组的名称
                .startNow()// 马上启动触发器
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)).build();

        // 让调度器关联任务和触发器,保证按照触发器定义的条件执行任务
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }

}

public class HelloScheduleDemo {

    public static void main(String[] args) throws Exception {
        // 1.调度器(Scheduler) ,从工厂中获取调度的实例(默认:实例化)
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        // 2.任务实例
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 参数1:任务的名称;参数2:任务组的名称
                .build();
        System.out.println("名称:" + jobDetail.getKey().getName());
        System.out.println("组的名称:" + jobDetail.getKey().getGroup());
        System.out.println("任务类" + jobDetail.getJobClass().getName());
        // 3.触发器
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")// 参数1:触发器名称;参数2:触发器组的名称
                .startNow()// 马上启动触发器
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)).build();

        // 让调度器关联任务和触发器,保证按照触发器定义的条件执行任务
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }

}

输出:

名称:job1
组的名称:group1
任务类com.quartz.HelloJob
 INFO [main] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:06:49
正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:06:54
正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:06:59
正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:07:04
正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:07:09
正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:07:14

 

HelloSchedulerDemo.java

 

HelloJob.java

 

JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        // 从JobDetail中获取JobDataMap的数据
        String jobDataMessage = jobDataMap.getString("message");
        System.out.println("任务数据的参数值:" + jobDataMessage);
        // 获取Trigger对象中获取JobDataMap的数据
        JobDataMap jobDataMap2 = context.getTrigger().getJobDataMap();
        String triggerDataMessage = jobDataMap2.getString("message");
        System.out.println("触发器数据的参数值:" + triggerDataMessage);
        //获取trigger的内容
        TriggerKey triggerKey=context.getTrigger().getKey();
        System.out.println("触发器名称:"+triggerKey.getName()+";触发器组:"+triggerKey.getGroup());
        
        System.out.println("****************");
        
        //获取其他内容
        System.out.println("当前任务执行时间:"+sdf.format(context.getFireTime()));
        System.out.println("下一次任务执行时间:"+sdf.format(context.getNextFireTime()));

 

 

 

 如果想要获取job的数据,key不能设置和trigger一样

 

public class HelloSchedulerDemoTrigger {
    public static void main(String[] args) throws Exception {
        //设置任务的开始时间
        Date startDate = new Date();
        startDate.setTime(startDate.getTime()+3000);
        //设置任务的结束时间
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+10000);


        //1.调度器(Scheduler),从工厂中获取调度的实例(默认:实例化new StdSchedulerFactory())
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();

        //2.任务实例(JobDetail)
        JobDetail jobDetail = JobBuilder.newJob(HelloJobTrigger.class)
                .withIdentity("job1", "group1")//
                .usingJobData("message", "打印日志")//传递参数,名称message
                .build();
        //3.触发器(Trigger)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger", "group1")
//                .startNow()//马上启动触发器
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))
                .startAt(startDate)//设置任务开始时间
                .endAt(endDate)//设置任务结束时间
                .build();

        //让调度器关联任务和触发器,保证按照触发器定义的条件执行任务
        defaultScheduler.scheduleJob(jobDetail, trigger);
        //启动
        defaultScheduler.start();
    }
}
public class HelloJobTrigger implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //输出当前日期
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = sdf.format(date);

        //工作內容
        System.out.println("正在进行数据库的备份工作" + dateString);

        //获取jobKey、startTime、endTime
        Trigger trigger = context.getTrigger();
        System.out.println("jobKey的名称:" + trigger.getJobKey().getName());
        System.out.println("jobKey组的名称:" + trigger.getJobKey().getGroup());

        System.out.println("任务的开始时间:" + sdf.format(trigger.getStartTime()));
        System.out.println("任务的结束时间:" + sdf.format(trigger.getEndTime()));
    }
}

 

 

 

 

 

 

 

 

  cron表达式生成工具:http://www.bejson.com/othertools/cron/

 

 

 

 

 

 

 

 

本教程重点讲解StdSchedulerFactory,DirectSchedulerFactory自行了解

 

 quartz.properties

 

 

 

 

 

 

 

 

 

 

 

 

 

public class MyJobListener implements JobListener {

    @Override
    public String getName() {
        // 监听器名称
        String name = this.getClass().getName();
        name = "监听器的名称是:" + name;
        return name;
    }

    @Override
    public void jobToBeExecuted(JobExecutionContext context) {
        System.out.println("Scheduler在JobDetail将要执行时调用的方法");
    }

    @Override
    public void jobExecutionVetoed(JobExecutionContext context) {
        System.out.println("否决");

    }

    @Override
    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
        System.out.println("scheduler在job执行之后的监听");

    }

}
public class HelloSchedulerDemoJobListener {
    public static void main(String[] args) throws SchedulerException, Exception {
        // 任务实例:
        JobDetail jobDetail = JobBuilder.newJob(HelloJobScheduler.class)
                .withIdentity("job1", "group1")
                .build();

        // 触发器:
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")// 参数1:设置触发器名称,参数2:设置触发器组的名称
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")).build();

        // 让调度器关联任务和触发器,保证按照触发器定义的添加执行任务
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        Date scheduleJob = scheduler.scheduleJob(jobDetail, trigger);
        System.out.println("调度器的开始时间是:" + new SimpleDateFormat("yyyy-MM-dd HH:dd:ss").format(scheduleJob));
        
        
        //创建并注册一个全局的job listener
//        scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());
        
        
        //创建并注册一个局部的job listener
        scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));
        
        scheduler.start();
        
    }
}

 

 

public class MyTriggerListener implements TriggerListener {

    @Override
    public String getName() {
        String name = this.getClass().getSimpleName();
        System.out.println("触发器的名称:" + name);
        return name;
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        String triggerName = trigger.getKey().getName();
        System.out.println("触发器的名称:" + triggerName + "被触发了");
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        String triggerName = trigger.getKey().getName();
        System.out.println("触发器的名称:" + triggerName + "没有触发");
        return false;// true表示不会执行job的方法
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        String triggerName = trigger.getKey().getName();
        System.out.println("触发器的名称:" + triggerName + "错过触发");
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context,
            CompletedExecutionInstruction triggerInstructionCode) {
        String triggerName = trigger.getKey().getName();
        System.out.println("触发器的名称:" + triggerName + "完成之后触发");
    }

}
// 创建并注册一个全局的trigger listener
//        scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), EverythingMatcher.allTriggers());

        // 创建并注册一个局部的trigger listener
        scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(),
                KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1", "group1")));

 

 

原文地址:https://www.cnblogs.com/hk-zsg/p/11462623.html