java调度任务在项目中的应用
前言
任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。项目中有很独特的应用的场景,比如每天凌晨同步数据,定时操作业务等等。
武穴网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司从2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
- Timer
- scheduler
- quartz
1 Timer
java.util.Timer,可以实现一些简单的定时任务,使用 Timer 实现任务调度的核心类是 Timer 和 TimerTask。其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。
Timer 将接收到的任务丢到自己的 TaskList 中,TaskList 按照 Task 的最初执行时间进行排序。TimerThread 在创建 Timer 时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread 被唤醒并执行该任务。之后 TimerThread 更新最近一个要执行的任务,继续休眠如下。
Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务:
public class TimerTest extends TimerTask {
private String jobName = "";
public TimerTest(String jobName) {
super();
this.jobName = jobName;
}
@Override
public void run() {
System.out.println("execute " + jobName);
}
public static void main(String[] args) {
Timer timer = new Timer();
long delay1 = 1 * 1000;
long period1 = 1000;
// 从现在开始 1 秒钟之后,每隔 1 秒钟执行一次 job1
timer.schedule(new TimerTest("job1"), delay1, period1);
long delay2 = 2 * 1000;
long period2 = 2000;
// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 job2
timer.schedule(new TimerTest("job2"), delay2, period2);
}
}
scheduler 单机服务常用的调度任务策略。
2.xml配置
2.corn 表达式时间设定,可参考corn表达式——用于设置定时任务
@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
log.info("test1, 5秒执行一次,每次执行sleep 8s");
}
3.注意事项:
- 3.1 同一定时任务,第二次触发时间到了,第一次还没有执行完成时会执行吗?不会,会等前一次执行完成才执行下一次
- 3.2 不同的定时任务,相互之间是否有影响?取决于可用的定时任务线程数,如果线程数足够则不会影响;如果可用定时任务线程数少于要执行定时任务数量,未能获取到线程的自然要等到有空闲线程时才能执行。
quartz 集群发布web服务器任务策略
可以解决如果是集群发布web服务器,就会导致每个服务器都跑一遍这个定时器,会出现定时器被多次执行方法。quartz可以解决这个问题,quartz是用javaweb服务器和数据库等配合完成的一个定时器选择服务器执行的机制实现的,这样每次到执行的时候只选择一个合适的web服务器去执行定时任务。
1.配置maven依赖
org.quartz-scheduler
quartz
2.Scheduler 调度程序配置
Quartz的定时集群任务配置
true
true
3.Trigger 触发器的配置
0 0/30 * * * ?
4.Job 调度任务配置
5 Job类,用于处理相关业务逻辑
public class QuartzSyncFacJob extends QuartzJobBean {
private static Logger logger = LoggerFactory.getLogger(QuartzJobBean.class);
@Override
public void executeInternal(JobExecutionContext context) throws JobExecutionException {
syncData(context);
}
public void syncData(JobExecutionContext context) {
//通过bean注入到jobDataAsMap中,再获取
IDupMgrOrgReviseDoService dupMgrOrgReviseDoService = (IDupMgrOrgReviseDoService) context.getJobDetail().getJobDataMap().get("dupMgrOrgReviseDoService");
//处理相关逻辑
dupMgrOrgReviseDoService.syncSaveOrUpMdcFactory();
}
}
以上是日常用到任务调度,当然spring提供了多种方式的调度注入方式,除了bean,还有各种@注入方式,有兴趣的可以自己研究。
网站标题:java调度任务在项目中的应用
网页网址:http://scyanting.com/article/jgpehd.html