定时任务场景:
数据同步,交易信息,定时发送数据,活动推送
主题:分布式任务调度平台分布式领域中集群的话,保证定时Job幂等性
Java定时job方案:
Thread TimerTast 线程池 quartz SpringBoot 内置schedul
1、Thread:
package com.toov5.JobTest; public class Demo01 { static long count = 0; public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); count++; System.out.println(count); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); } }
TimerTask
package com.toov5.JobTest; import java.util.Timer; import java.util.TimerTask; public class Demo02 { private static int count = 0; public static void main(String[] args) { //属于JDK自带的 util包里的哦 TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println(++count); } }; //定义触发规则 Timer timer = new Timer(); //天数 long delay = 0; //0表示任意的 long period = 1000; timer.scheduleAtFixedRate(timerTask, delay, period); } }
线程池:
package com.toov5.JobTest; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Demo03 { private static int count = 0; public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { System.out.println(++count); } }; ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS); } }
Quartz: http://cron.qqe2.com/
package com.toov5.quartz; import java.util.Date; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class TestJob { public static void main(String[] args) throws SchedulerException { //1.创建Scheduler的工厂 SchedulerFactory sf = new StdSchedulerFactory(); //2.从工厂中获取调度器实例 Scheduler scheduler = sf.getScheduler(); //3.创建JobDetail Job的详细信息 制定哪个job的 JobDetail jb = JobBuilder.newJob(MyJob.class) .withDescription("this is a ram job") //job的描述 .withIdentity("ramJob", "ramGroup") //job 的name和group .build(); //任务运行的时间,SimpleSchedle类型触发器有效 long time= System.currentTimeMillis() + 3*1000L; //3秒后启动任务 Date statTime = new Date(time); //4.创建Trigger //使用SimpleScheduleBuilder或者CronScheduleBuilder Trigger t = TriggerBuilder.newTrigger() .withDescription("") .withIdentity("ramTrigger", "ramTriggerGroup") //.withSchedule(SimpleScheduleBuilder.simpleSchedule()) .startAt(statTime) //默认当前时间启动 .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次 .build(); //5.注册任务和定时器 scheduler.scheduleJob(jb, t); //6.启动 调度器 scheduler.start(); } }
要跑的业务:
package com.toov5.quartz; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { //定时任务的 业务 System.out.println("quartz MyJob date:" + new Date().getTime()); } }
每隔2s执行一次: