定时任务
定时任务场景:
数据同步,交易信息,定时发送数据,活动推送
主题:分布式任务调度平台分布式领域中集群的话,保证定时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执行一次: