参考文档:# Scheduling Tasks
在上一篇中,我们已经自己亲自实践体验了怎么做定时任务,无外乎就是@EnableScheduling
和@Scheduled
,但是存在一个问题:把application.run和我们的任务内容混入同一个类中运行,完全不够优雅清晰。
写完之后发现,springboot官方还特意做了一个scheduling task的快速教程,那么我们这一篇中就跟随教程步骤,也建一个官方版本的定时任务来体验一下~
2.1 添加awaitility
依赖
看到awaitility
突然的懵逼😳,我们上一篇代码中压根没有这货啊~
果断飞速开始搜索这是啥:
来自其他大佬blog:
在编写自动化测试用例过程中,往往会遇见被测代码有异步或者队列处理的中间过程;如果需要校验这部分结果,必须等待异步操作结束或队列消费完,而这个中间等待的时间是不确定的,常常是根据经验值设定,通过 Thread.sleep(经验值) ,而这个时间通常会设置成最长的那次时间,但是可能99%次这个异步操作都低于这个最长的时间,这就造成了每次执行这个测试用例都花费了异步任务最长的那次时间。
现介绍一款开源工具awaitility: github.com/awaitility/… ,该工具提供轮询的方式,判断操作是否完成,以最短的时间获取异步任务结果。
————————————————
版权声明:本文为CSDN博主「Joker_Ye」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
来自官方github:
Testing asynchronous systems is hard. Not only does it require handling threads, timeouts and concurrency issues, but the intent of the test code can be obscured by all these details. Awaitility is a DSL that allows you to express expectations of an asynchronous system in a concise and easy to read manner. For example:
1
2
3
4
5
6
7
8
9
10 > java复制代码@Test
> public void updatesCustomerStatus() {
> // Publish an asynchronous message to a broker (e.g. RabbitMQ):
> messageBroker.publishMessage(updateCustomerStatusMessage);
> // Awaitility lets you wait until the asynchronous operation completes:
> await().atMost(5, SECONDS).until(customerStatusIsUpdated());
> ...
> }
>
>
简单粗暴的理解一下,大致就是这是一个用来测试异步系统的DSL库,因为异步系统里面存在着各种线程、延时等问题,比如我们即将要写的定时器就是一个单线程的延时操作。
那么要对这种进行测试的话,那么我们的测试程序也应该有一定的延时才能对定时任务执行结果进行检测。
如果再重复写一个定时器来执行这个测试程序,是不是就不够优雅呢~
更何况那样设置的话,一般就会把测试的程序的任务循环时间设置成最大值,才能保证测试能够执行
so~ 这个Awaitility就诞生了
正如官方文档的example里面所说,它自带的await()这些方法,可以在检测到目标程序执行成功后,再测试!还可以设置这个测试程序的最大等待时长
那么,既然我们要写的定时器任务,是一个典型的异步程序,那么我们就按照官方说法,给maven添加Awaitility的依赖(pom.xml文件中添加):
1 | maven复制代码<dependency> |
2.2 创建定时器任务java
如图所示,和前几篇文一样,创建一个SchedulingTask的package,然后创建一个ScheduledTask的类(java文件),一些特殊注意点我标注在了下面代码的注释中了:
1 | java复制代码package com.example.springbootDemos.SchedulingTask; |
上面代码就可以看出,我们要做一个定时任务,就是要在需要定时循环的方法前面,添加Scheduled注解
,并指定循环周期,循环周期可以用fixedRate,也可以用cron。
但要注意,这个注解只能用于无参method
2.3 创建启动定时器的application类
要启动定时器,那么就要在class前面使用@EnableScheduling
:
1 | java复制代码package com.example.springbootDemos.SchedulingTask; |
2.4 运行结果
看下面红框显示的时间戳部分,就可以清楚的看到,这是一个定时5秒执行的任务了!
官方文档到跑完定时任务,就那么突然地结束了!!!!!!!
所以,awaitility去哪里了?????
介于这么虎头蛇尾的官方操作,那么我们就自行尝试拓展一把!!!!!
由于常规的输出当前时间戳,一般是没有什么异常可以抛出的,所以这里决定调整一下要测试的内容:检测自动自增数据是否为偶数
首先,我们创建一个私有变量:
1 | java复制代码private int count = 0; |
然后,给它写一个定时的自增方法,让count每隔3秒加1:
1 | java复制代码@Scheduled(fixedRate = 3000) |
同时,我们准备一个public方法获取当前最新的count值:
1 | java复制代码public int getCount() { |
最后,我们就需要写一段awaitility的方法,去检测异常:
1 | java复制代码@Test |
放上完整的代码:
1 | java复制代码package com.example.springbootDemos.SchedulingTask; |
运行结果:
当然,很多都不会和我这样,这么简单粗糙的给test写个定时器来定时测试。关于await,本身就有很多非常边界的方法。具体可以参考这篇大佬的文:
异步校验工具awaitility快速入门
本文转载自: 掘金