java中的定时器

quartz定时器和云片

一:quartz定时任务

1. quartz是啥?

是一个Java环境下的定时任务工具库,可以间隔时间定时,例如一定时间给用户发送邮件,等

可以指定条件触发一段Java代码。

Java中的定时实现:

​ 坑定和线程有关系;timertask:

timer是Java原生的定时

 //创建对象
        Timer timer = new Timer();
        //todo  timer.schedule(timertask, delay);
        /*timer.schedule(new TimerTask() {
            @Override
            public void run() {
                long id = Thread.currentThread().getId();
                System.out.println("id = " + id);
                System.out.println("订单统计");
            }
        }, 1000*60);*/
        // todo scheduel(timerTask,date)
        /*Date date = new Date(2019,10,11);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                long id = Thread.currentThread().getId();
                System.out.println("id = " + id);
                System.out.println("hhahh");
            }
        }, date);*/
        // todo   scheduel(timerTask,delay,period)//周期
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                long id = Thread.currentThread().getId();
                System.out.println("id = " + id);
                System.out.println("订单");
            }
        }, 1000*30, 1000*10);
        timer.cancel();//关闭定时
如果关闭在前会有Timer already cancelled.错误警示
总结java原生定时器

不需要导入依赖,在Java.util下面,底层依赖的是多线程,timer支持延迟调用,

延迟周期调用,具体时间调用,集体时间周期调用

缺点:
  1. timer定时器不是很方便,timer只能制定具体时间和时间间隔,无法完成逻辑条件,例如美俄州的最后一天,每个月的工作日。。。
  2. timer无法集成到spring里面,不符合眼下开发模式

quartz的组成部分

job是一个接口,需要实现一个execute()方法;

jobDetail是一个装有job的Class信息的对象,Class,name,group 因为每次调用都用反射创建job实例,我们不能直接把job对象传递给scheduler内部,将信息传递给jobDetail,jobDetail再 传递给scheduler

问题:quartz定时任务框架每次都要实力job对象吗?

trigger触发器,触发job的条件是内部包含simpleTrigger 或cronTrigger

scheduler定时任务繁盛的容器,内部包含多对jobDetail和trigger

2. quartz基本使用

  1. quartz的初体验

步骤一:导入依赖 quartz

<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.3.0</version>
</dependency>
  1. 执行流程

    job(接口)------jobdetail(接口信息)-----trigger(触发条件) ----scheduler(执行容器)

job的实现类,具体的任务
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        long id = Thread.currentThread().getId();
        System.out.println("id = " + id);
        System.out.println("执行");
    }
}


//测试
@Test
    public void test1() throws SchedulerException, InterruptedException {
        //todo quartz的基本使用
        //第一步创建jobDetail
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)//创建对象 传入要执行的任务类信息对象
                .withIdentity("t1", "23")//jondetail的名称
                .build();//创建

        //第二步创建trigger
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder
                .simpleSchedule()//创建简单任务
                .withIntervalInSeconds(5).withRepeatCount(5)).build();//重复约束,规则

        //第三步创建啊scheduler
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        defaultScheduler.start();
        defaultScheduler.scheduleJob(jobDetail, simpleTrigger);//传入
        Thread.sleep(10000);//让线程在这个线程时间内执行,不然只会执行一次
    }

3.quartz的高级扩展

jobDataMap对象

他是一个数据传递的容器,键值对的形式。

案例:指定时间根据年龄删除用户

步骤一:放入jobdataMap里面

方法一:JobBuilder.newJob(MyJob.class).withIdentity(name,group).usingdatamap(key,value).useing…

 //第一创建jobDetail    usingjobdata方式
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("j1", "11")
                .usingJobData("age", 1)
                .build();

        //第二步   创建啊trigger
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder
                .simpleSchedule().withIntervalInSeconds(5)
                .withRepeatCount(5)).build();

        //第三步,创建scheduler
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        defaultScheduler.start();
        defaultScheduler.scheduleJob(jobDetail, simpleTrigger);

        Thread.sleep(1000*60*25);

//在job中
  //获取jobdataMap
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        Object age = jobDataMap.get("age");
        System.out.println("age = " + age);
拿到

方法二:创建jobdatamap对象.put()

//第一创建jobDetail    jobDataMap方式
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.putAsString("age", 12);
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).usingJobData(jobDataMap)
                .withIdentity("vv", "12")
                .build();

可以得到相同的结果

key

name和group 为jobdetail trigger起名字,

trigger

触发器,可分为simpleTrigger和cronTrigger

DateBuilder

创建时间

CronTriger:

专门复杂的定时任务

Cron表达式

表达式是一个字符串,内部有七个或者六个字符组成,每个直接按用空格分隔

秒 分 时 日 月 星期几 年(可选)

表达式 值范围 可先符号
0-59 , - / *
0-59 , - / *
0-23 , - / *
1-31 , - * ? / L W C
1-12 , - / *
星期几 1(日)-7 , - * ? / L C #
1970-2099 , - / *

特殊符号解释

符号 意思
和的意思,例如1,2,3放在第一位就是1 2 3 秒
- 到的意思,例如1-3《 ==》1,2,3的
* 每一的意思,每一秒,每一份。。。
/ /之前时什么时候开始,之后是时间间隔是多少
日和星期的冲突问题,写了?的听另外一个的
w 工作日 1-5工作日
L 最后
# 第几个的意思
C

4. quartz集成spring

待续

二:云片短信验证

​ ec25476854026e1867ea17123f335888

http://www.mobiletrain.org/

发布了38 篇原创文章 · 获赞 2 · 访问量 1404
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览