根据之前章节的讲解,创建一个Spring Boot工程,命名为ElasticJobExample,接下来几节将在此工程中分别演示@Scheduled形式的定时任务和ElasticJob形式的分布式任务。
(1)单个任务
在工程中添加类TimedTask,在此类中实现如下内容:
运行服务结果如下:
pool-3-thread-1 task1:Wed May 2314:41:40 CST 2018
pool-3-thread-1 task1:Wed May 2314:41:50 CST 2018
pool-3-thread-1 task1:Wed May 2314:42:00 CST 2018
…
由输出可见,task1方法每隔10s打印一次线程和时间信息,@Scheduled注解标明此方法是一个定时任务,cron属性指定了定时任务执行的时间周期。cron属性不仅能够指定时间间隔,还能指定具体时间。cron的用法会在后面介绍。
(2)多个任务
在TimedTask类中,还可以定义一个由@Scheduled注解标注的方法,这样在此类中就有两个定时任务,例如在类中添加如下方法,指定每5s执行一次任务。
运行服务结果如下:
pool-3-thread-1 task2:Wed May 2314:47:55 CST 2018
pool-3-thread-1 task2:Wed May 2314:48:00 CST 2018
pool-3-thread-1 task1:Wed May 2314:48:00 CST 2018(www.xing528.com)
pool-3-thread-1 task2:Wed May 2314:48:05 CST 2018
pool-3-thread-1 task2:Wed May 2314:48:10 CST 2018
pool-3-thread-1 task1:Wed May 2314:48:10 CST 2018
由输出可见,task2每隔5s执行一次任务,task1每隔10s执行一次任务,但是你会发现这两个任务使用的是同一个线程,那么某一任务如果执行时间过长,会对另一任务造成什么影响呢?
(3)单线程多任务的相互影响
修改task1方法,在方法中添加一个sleep方法,模拟任务执行耗时,观察对两个定时任务的影响。
运行服务结果如下:
pool-3-thread-1 task1:Wed May 2315:01:20 CST 2018
pool-3-thread-1 task2:Wed May 2315:01:30 CST 2018
pool-3-thread-1 task2:Wed May 2315:01:35 CST 2018
pool-3-thread-1 task1:Wed May 2315:01:40 CST 2018
pool-3-thread-1 task2:Wed May 2315:01:50 CST 2018
pool-3-thread-1 task2:Wed May 2315:01:55 CST 2018
由输出可见,此种情况,由于task1执行耗时过长,会导致task2需要等待task1执行完之后,才能开始计时和执行任务,可见两个定时任务在单线程的情况下是相互阻塞的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。