Java定时任务调度工具Timer Quartz

 

 

-----------------------------------Timer

PS:Timer是 jdk中的;Quartz是第三方的

 

 

 

PS:也即是返回执行任务时候的时间

 

 

---------------------------------------------------一个综合的例子

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class DancingRobot extends TimerTask{

    @Override
    public void run() {
        // 获取最近一次任务执行的时间,将其格式化
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("最近执行任务的时间:"+sdf.format(scheduledExecutionTime()));//获取最近一次任务执行的时间,将其格式化
        System.out.println("开心的跳舞");
    }

}
import java.util.Timer;
import java.util.TimerTask;

public class WaterRobot extends TimerTask{
    private Timer timer;
    
    
    
    public WaterRobot(Timer timer) {
        this.timer = timer;
    }
    //最大容量为5L
    private Integer bucketCapacity = 0;
    @Override
    public void run() {
        // 灌水直到桶水满为止
        if(bucketCapacity<5){
            System.out.println("机器人加1L水");
            bucketCapacity++;
        }else{
            System.out.println("返回取消的任务数  before:"+timer.purge());
            cancel();//停止当前的机器人的执行
            System.out.println("机器人停止加水");
            System.out.println("返回取消的任务数   after:"+timer.purge());
            System.out.println("当前水容量:"+bucketCapacity+"L");
            try {
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            timer.cancel();//停止所有的机器人操作
        }
    
    }

}
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;

public class Main {
    
    public static void main(String[] args) {
        
        Timer timer = new Timer();
        //获取当前时间
        Calendar calendar =  Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间:"+sdf.format(calendar.getTime()));
        
        DancingRobot dr = new DancingRobot();
        WaterRobot wr = new WaterRobot(timer);
        
        timer.schedule(dr, calendar.getTime(), 2000);
        timer.scheduleAtFixedRate(wr, calendar.getTime(), 1000);
    }

/*    当前时间:2018-06-08 18:11:24
    最近执行任务的时间:2018-06-08 18:11:25
    开心的跳舞
    机器人加1L水
    机器人加1L水
    机器人加1L水
    最近执行任务的时间:2018-06-08 18:11:27
    开心的跳舞
    机器人加1L水
    机器人加1L水
    最近执行任务的时间:2018-06-08 18:11:29
    开心的跳舞
    返回取消的任务数  before:0
    机器人停止加水
    返回取消的任务数   after:1
    当前水容量:5L*/


}

 

------------------------------------Quartz 

 -------------------------------------Hello world-----------------------

package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前execution时间为:"+sdf.format(date));        
        // 编写具体的业务逻辑
        System.out.println("hello world");        
    }

}
package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
        //创建schedule实例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        
        scheduler.scheduleJob(jobDetail, trigger);
    }

}

当前时间为:2018-06-14 09:57:36
当前execution时间为:2018-06-14 09:57:36
hello world
当前execution时间为:2018-06-14 09:57:38
hello world
当前execution时间为:2018-06-14 09:57:40
hello world
当前execution时间为:2018-06-14 09:57:42
hello world
当前execution时间为:2018-06-14 09:57:44

 

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
        System.out.println("jobDetail的名字:"+jobDetail.getKey().getName());        
        System.out.println("jobDetail的group:"+jobDetail.getKey().getGroup());        
        System.out.println("jobDetail的jobclass:"+jobDetail.getJobClass().getName());        
        
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
        //创建schedule实例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        
        scheduler.scheduleJob(jobDetail, trigger);
        
        /*jobDetail的名字:myJob
        jobDetail的group:group1
        jobDetail的jobclass:com.beet.test.HelloQuartz.HelloJob
         
        当前时间为:2018-06-14 10:10:25
        当前execution时间为:2018-06-14 10:10:26
        hello world*/
    }

}

---------------------------------------------------------使用JobDataMap传参数

package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        // 编写具体的业务逻辑
        //System.out.println("hello world");        
         JobKey key = context.getJobDetail().getKey();
         TriggerKey trKey = context.getTrigger().getKey();
            JobDataMap dataMap = context.getJobDetail().getJobDataMap();
            JobDataMap tDataMap = context.getTrigger().getJobDataMap();     //从中获取Map
            //String JobMsg = dataMap.getString("message");
            // Float jobFloatValue = dataMap.getFloat("FloatJobValue");
            String triggerMsg = tDataMap.getString("message");
             Float triggerDoubleValue = tDataMap.getFloat("DoubleTriggerValue");
                System.out.println("当前execution时间为:"+sdf.format(date));        
         System.out.println("我的job name和group是:"+key.getName()+":"+key.getGroup());    
        
         System.out.println("我的trigger name和group是:"+trKey.getName()+":"+trKey.getGroup());    
        
        
    
         
        //System.out.println("job message是:"+JobMsg);    
         //System.out.println("FloatJobVAlue是:"+jobFloatValue);    
         System.out.println("trigger message:"+triggerMsg);    
         System.out.println("FloatJobVAlue是:"+triggerDoubleValue);    
    }

}
package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").usingJobData("message", "hello myJob1").usingJobData("FloatJobValue", 3.14f).build();
        System.out.println("jobDetail的名字:"+jobDetail.getKey().getName());        
        System.out.println("jobDetail的group:"+jobDetail.getKey().getGroup());        
        System.out.println("jobDetail的jobclass:"+jobDetail.getJobClass().getName());        
        
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").usingJobData("message", "hello myTrigger").usingJobData("DoubleTriggerValue", 2.0D).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
        //创建schedule实例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        
        scheduler.scheduleJob(jobDetail, trigger);
        
        /*jobDetail的名字:myJob
        jobDetail的group:group1
        jobDetail的jobclass:com.beet.test.HelloQuartz.HelloJob
         
        当前时间为:2018-06-14 10:10:25
        当前execution时间为:2018-06-14 10:10:26
        hello world*/
    }

}

 

 

 

package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
    /*    System.out.println("jobDetail的名字:"+jobDetail.getKey().getName());        
        System.out.println("jobDetail的group:"+jobDetail.getKey().getGroup());        
        System.out.println("jobDetail的jobclass:"+jobDetail.getJobClass().getName());        */
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        date.setTime(date.getTime()+3000);//开始3s后执行
        
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+6000);
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startAt(date).endAt(endDate).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
        //创建schedule实例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        
        
        
        scheduler.scheduleJob(jobDetail, trigger);
        
        /*jobDetail的名字:myJob
        jobDetail的group:group1
        jobDetail的jobclass:com.beet.test.HelloQuartz.HelloJob
         
        当前时间为:2018-06-14 10:10:25
        当前execution时间为:2018-06-14 10:10:26
        hello world*/
    }

}
package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前execution时间为:"+sdf.format(date));        
        // 编写具体的业务逻辑
    //    System.out.println("hello world");        
        
        Trigger trigger = context.getTrigger();
        System.out.println("start time is "+trigger.getStartTime());        
        System.out.println("end time is "+trigger.getEndTime());        
        
    }

}

当前时间为:2018-06-14 14:14:32
 
当前execution时间为:2018-06-14 14:14:35
start time is Thu Jun 14 14:14:35 CST 2018
end time is Thu Jun 14 14:14:38 CST 2018
当前execution时间为:2018-06-14 14:14:37
start time is Thu Jun 14 14:14:35 CST 2018
end time is Thu Jun 14 14:14:38 CST 2018

 

 

package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
    /*    System.out.println("jobDetail的名字:"+jobDetail.getKey().getName());        
        System.out.println("jobDetail的group:"+jobDetail.getKey().getGroup());        
        System.out.println("jobDetail的jobclass:"+jobDetail.getJobClass().getName());        */
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        date.setTime(date.getTime()+3000);//开始3s后执行
        
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+6000);
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远                                                                   被endDate 覆盖掉了执行计划
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startAt(date).endAt(endDate).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
        //创建schedule实例                                                                                定时                                       定频率
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        
        
        
        scheduler.scheduleJob(jobDetail, trigger);
        
        /*jobDetail的名字:myJob
        jobDetail的group:group1
        jobDetail的jobclass:com.beet.test.HelloQuartz.HelloJob
         
        当前时间为:2018-06-14 10:10:25
        当前execution时间为:2018-06-14 10:10:26
        hello world*/
    }

}

PS:
,表示或的关系
-,至 5-7 五到七
*,每秒钟
/, 每分钟没小时 0/5 没隔5分钟(..)出发一次
?,不关心
#,代表第.. 6#3 每月第三周的周五(6代表周五)
L,代表最后

在线地址

package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
    /*    System.out.println("jobDetail的名字:"+jobDetail.getKey().getName());        
        System.out.println("jobDetail的group:"+jobDetail.getKey().getGroup());        
        System.out.println("jobDetail的jobclass:"+jobDetail.getJobClass().getName());        */
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        date.setTime(date.getTime()+3000);//开始3s后执行
        
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+6000);
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远
        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build();
        //创建schedule实例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    
    }

}
package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前execution时间为:"+sdf.format(date));        
        // 编写具体的业务逻辑
         System.out.println("hello world");        
        
        /*Trigger trigger = context.getTrigger();
        System.out.println("start time is "+trigger.getStartTime());        
        System.out.println("end time is "+trigger.getEndTime());        */
        
    }

}

PS: 这两种方式推荐使用std的方式。

 

 

package com.beet.test.HelloQuartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        //创建一个jobdetail实例,将该实例与hellojob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
    /*    System.out.println("jobDetail的名字:"+jobDetail.getKey().getName());        
        System.out.println("jobDetail的group:"+jobDetail.getKey().getGroup());        
        System.out.println("jobDetail的jobclass:"+jobDetail.getJobClass().getName());        */
        
        //打印当前的执行时间  
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sdf.format(date));        
        date.setTime(date.getTime()+3000);//开始3s后执行
        
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+6000);
        //创建一个Trigger的实例,定义改job立即执行,并且每隔2秒钟重复一次,直到永远
        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build();
        //创建schedule实例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        Date scheduleDate = scheduler.scheduleJob(jobDetail, trigger);
        System.out.println("开始执行时间为:"+sdf.format(scheduleDate));        
        //scheudle执行2s挂起
        Thread.sleep(2000);
        scheduler.standby();//挂起
        //挂起3s重新启动
        Thread.sleep(3000);
        scheduler.start();
    }

}

 

posted on 2018-06-08 11:48  biyangqiang  阅读(296)  评论(0编辑  收藏  举报

导航