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支持延迟调用,
延迟周期调用,具体时间调用,集体时间周期调用
缺点:
- timer定时器不是很方便,timer只能制定具体时间和时间间隔,无法完成逻辑条件,例如美俄州的最后一天,每个月的工作日。。。
- 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基本使用
- quartz的初体验
步骤一:导入依赖 quartz
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>
执行流程
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/