博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java定时任务调度工具Timer Quartz
阅读量:4329 次
发布时间:2019-06-06

本文共 19790 字,大约阅读时间需要 65 分钟。

 

 

-----------------------------------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();    }}

 

转载于:https://www.cnblogs.com/bee-home/p/9154848.html

你可能感兴趣的文章
阻塞、非阻塞、同步、异步之个人理解
查看>>
多线程NSThread
查看>>
监控mysql主从同步状态脚本
查看>>
Servlet原理
查看>>
eureka高可用注册中心
查看>>
【python调用windows CLI】调用adb统计Android app的流量消耗
查看>>
stderr,stdout,a.txt缓冲区别
查看>>
实现reentrantlock和读写锁
查看>>
Html页中使用OCX控件
查看>>
递归实例分析
查看>>
Cocos2d-js异步图片加载
查看>>
JS(javascript)正则表达式整理文章(总结)
查看>>
VIM For Windows 1
查看>>
mvc3.0 中dropdownlist的使用
查看>>
ranch 源码分析(三)
查看>>
Ip获取请求ip
查看>>
面试题 字符串去除空格
查看>>
SQL Server 性能优化3 该指数(Index)保养
查看>>
Bombing HDU, 4022(QQ糖的消法)
查看>>
玩转Web之servlet(三)---一张图看懂B/S架构
查看>>