zoukankan      html  css  js  c++  java
  • CountDownLatch在SpringBoot中配合@Async使用

    需求

    项目使用springboot,有一个场景需要先从本地查询所有数据,然后再调用第三方接口填充其他字段,每次调用第三方接口都需要本地数据的字段作为查询条件。厂商提供的接口只能单个查询,所以只能遍历从本地查询的数据然后挨个调用接口,这样响应时间实在慢且效率太低。

    那就想办法优化呗,第一想法肯定是启用多线程,让每一条从本地数据库查询的记录可以并行调用第三方接口。

    首先新建一个线程任务类来调用第三方接口并填充数据,用spring的@Async注解实现异步调用,伪代码如下:

    1. @Component
    2. public class AsyncTask {
    3. /**
    4. * 异步调用第三方接口查询
    5. */
    6. @Async
    7. public void queryTask(Entity entity){
    8. Data data = doPost();
    9. entity.setData(data);
    10. }
    11. }

    Service层循环调用

    1. public class Service {
    2. @Autowired
    3. private AsyncTask asyncTask;
    4. @Autowired
    5. private EntityMapper mapper;
    6. public List<Entity> queryData(){
    7. List<Entity> list = mapper.selectAll();
    8. for(Entity entity:list){
    9. asyncTask.queryTask(entity);
    10. }
    11. return list;
    12. }
    13. }

    这样就实现了异步请求接口,效率上提升了很多。但是,由于异步调用的原因,数据还没填充完就会返回,这显然不是我们想要的效果。我们必须等待AsyncTask中的所有线程结束后,再返回当前调用线程任务的方法。于是就想到了JDK1.5版本后提供的计数器CountDownLatch(至于CountDownLatch的用法本文不阐述,只是第一次使用记录一下,有错误的地方还希望大家给建议)。

    思路:

    在Service层的方法中实例化CountDownLatch并且制定线程个数,线程个数就是从本地数据库查询的list的长度,并且传入线程任务中,每个线程执行完毕就调用countDown()方法。最后在Service层中调用await()方法。这样在线程计数为零之前,Service的线程就会一直等待。

    Service:

    1. public class Service {
    2. @Autowired
    3. private AsyncTask asyncTask;
    4. @Autowired
    5. private EntityMapper mapper;
    6. public List<Entity> queryData(){
    7. List<Entity> list = mapper.selectAll();
    8. CountDownLatch latch = new CountDownLatch(list.size());
    9. for(Entity entity:list){
    10. asyncTask.queryTask(entity,latch);
    11. }
    12. latch.await();
    13. return list;
    14. }
    15. }

    AsyncTask:

    1. @Component
    2. public class AsyncTask {
    3. /**
    4. * 异步调用第三方接口查询
    5. */
    6. @Async
    7. public void queryTask(Entity entity,CountDownLatch latch){
    8. Data data = doPost();
    9. entity.setData(data);
    10. latch.countDown();
    11. }
    12. }

    至此问题解决。

  • 相关阅读:
    项目管理【44】 | 项目干系人管理-识别干系人
    移动端开发基础【15】H5和小程序开发注意事项
    召回率recall,IoU, mPA理解,针对video detection领域
    转:batch normalization, instance normalization, layer normalization, group normalization
    自监督(对比学习)资料
    转:非极大值抑制(Non-Maximum Suppression,NMS)
    转:Zero-shot Learning / One-shot Learning / Few-shot Learning
    转:top1错误率、top5正确率
    转:如何理解Inductive bias?
    台式机更新后没有声音了怎么办,Realtek音频管理器
  • 原文地址:https://www.cnblogs.com/LoveShare/p/14142831.html
Copyright © 2011-2022 走看看