十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。项目中有很独特的应用的场景,比如每天凌晨同步数据,定时操作业务等等。
创新互联建站-专业网站定制、快速模板网站建设、高性价比湄潭网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式湄潭网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖湄潭地区。费用合理售后完善,10年实体公司更值得信赖。
- Timer
- scheduler
- quartz
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);
}
}
@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
log.info("test1, 5秒执行一次,每次执行sleep 8s");
}
- 3.1 同一定时任务,第二次触发时间到了,第一次还没有执行完成时会执行吗?不会,会等前一次执行完成才执行下一次
- 3.2 不同的定时任务,相互之间是否有影响?取决于可用的定时任务线程数,如果线程数足够则不会影响;如果可用定时任务线程数少于要执行定时任务数量,未能获取到线程的自然要等到有空闲线程时才能执行。
可以解决如果是集群发布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,还有各种@注入方式,有兴趣的可以自己研究。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。