Java线程池与定时任务
前言
业务场景如:
- 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清算
- 电商整点抢购,商品价格8点整开始优惠
- 12306购票系统,超过30分钟没有成功支付订单的,进行回收处理
- 商品成功发货后,需要向客户发送短信提醒
需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景.
定时任务框架
单机
- timer:是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,缺点异常未检查会中止线程
- ScheduledExecutorService:相对延迟或者周期作为定时任务调度,缺点没有绝对的日期或者时间
- Spring定时框架:配置简单功能较多,如果系统使用单机的话可以优先考虑Spring定时器
介绍JDK与Spring中线程池实现
1.JDK普通线程池
public void testExecutorService() {
Runnable task = new Runnable() {
@Override
public void run() {
logger.debug("Hello ExecutorService");
}
};
for (int i = 0; i < 10; i++) {
executorService.submit(task);
}
}
2.JDK可定时执行任务的线程池
public void testScheduledExecutorService() {
Runnable task = new Runnable() {
@Override
public void run() {
logger.debug("Hello ScheduledExecutorService");
}
};
// scheduleAtFixedRate固定的频率执行。
scheduledExecutorService.scheduleAtFixedRate(task, 10000, 1000, TimeUnit.MILLISECONDS);
}
3.spring普通的线程池
@Test
public void testThreadPoolTaskScheduler() {
Runnable task = new Runnable() {
@Override
public void run() {
logger.debug("Hello ThreadPoolTaskExecutor");
}
};
for (int i = 0; i < 10; i++) {
taskExecutor.submit(task);
}
sleep(10000);
}
4.spring可定时执行任务的线程池
需要引入config配置类实现三个注解
@Configuration
@EnableScheduling
@EnableAsync
public void testThreadPoolTaskExecutor() {
Runnable task = new Runnable() {
@Override
public void run() {
logger.debug("Hello ThreadPoolTaskExecutor");
}
};
Date startTime = new Date(System.currentTimeMillis() + 10000);
taskScheduler.scheduleAtFixedRate(task, startTime, 1000);
sleep(20000);
}
5.spring注解实现普通线程池
@Async
public void execute1() {
logger.debug("execute1");
}
@Test
public void testAsyncThreadPoolTask() {
for (int i = 0; i < 10; i++) {
alphaService.execute1();
}
sleep(10000);
}
6.spring注解实现定时任务线程池
@Scheduled(initialDelay = 10000, fixedRate = 1000)
public void execute2() {
logger.debug("execute2");
}
分布式
- Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能
- TBSchedule:阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重
- elastic-job:当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片,并且可以支持云开发。
- Saturn:是唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上。
- xxl-job:是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。