@Async 异步http请求,汇总数据处理

项目需求:

请求第三方接口获取数据,一个小时大概有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条数据是对的,返回速度快,也就是想让异步获取提高效率吧.

知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。
原文地址:https://www.cnblogs.com/SamNicole1809/p/13563283.html