项目需求:
请求第三方接口获取数据,一个小时大概有5000条左右的数据。
吐槽一下,第三方接口竟然分页返回,一次只给2000条,擦了,只能异步请求然后汇总了。
我需要每个小时获取数据,并对数据进行分析处理,将结果存到本地。
具体实现:
主要使用@Async注释,实现异步,用定时任务一个小时执行一次。
@Async注释如何添加请参考我的另一篇随笔:
https://www.cnblogs.com/SamNicole1809/p/12610398.html
上代码:(示例)
1 - 异步Http请求服务
@Service public class AsyncService {
// 注入HttpUtils
@Async public CompletableFuture<String> getData(String uri, int page) {
uri += "&page=" + page; return CompletableFuture.completedFuture(httpUtils.Get(uri)); } }
2 - 异步一下子请求10000条(再让你分页返回,哼)
// 注入AsyncService
// 注意:在同一类中一个异步调用另一个异步是不生效的
// 这点与@Transactional注解类似,可以查一下
@Async public void getOneHourData(String uri) throws InterruptedException, ExecutionException { // 一页2000条,异步搞他10000条又怎样
CompletableFuture<String> future1 = asyncSer.getData(uri, 1); CompletableFuture<String> future2 = asyncSer.getData(uri, 2); CompletableFuture<String> future3 = asyncSer.getData(uri, 3); CompletableFuture<String> future4 = asyncSer.getData(uri, 4); CompletableFuture<String> future5 = asyncSer.getData(uri, 5);
// 等待所有异步请求完成 CompletableFuture.allOf(future1, future2, future3, future4, future5).join(); String data1 = future1.get();
......
// 处理数据,保存到数据库 }
3 - 定时任务处理数据
// 注入service // cron表达式可以了解下,有在线生成工具,此处表示1个小时执行一次 @Scheduled(cron = "0 0 * * * ?") @Async public void s3() throws ExecutionException, InterruptedException { // 由于有很多设备需要进行数据获取,我得意的笑,全异步 List<Device> deviceList = ...; for (Device device : deviceList) { // 生成uri service.getOneHourData(uri); } }
关键代码已经给出,可参考使用
另外:第三方一次返回2000条数据是对的,返回速度快,也就是想让异步获取提高效率吧.