需求背景:从excel导入一批数据,更新数据库里的数据,其中要调用其他系统的接口,接口调用成功才更新数据库,否则不更新
问题:调用接口那部分严重耗时(总共三个接口,其中一个耗时5s左右)
解决方方:调接口那部分使用多线程(CountDownLatch),但是现在获取不到调接口失败的那部分数据
请问下还有什么好的解决办法

解决方案 »

  1.   

    数据放缓存,多线程调用完之后返回数据完善缓存数据,三个接口都完成时,将数据索引存队列。定时pop队列更新db
      

  2.   

    你的问题有点歧义,大致理解是这样:调用三个接口都必须成功才能更新数据,否则不更新。你现在启动了三个线程,但不知道哪个线程调用的接口失败了,是这样吗?如果是这样给你如下方案:
    // 定义一个静态变量,volatile是为了将其他线程中的副本值及时更新至主内存
    public static volatile invokeScuccessCount = 0;
    // 然后启动三个线程,这个线程类自己定义
    Thread t1 = new MyThread(String invokeUrl);
    t1.start();
    Thread t2 = new MyThread(String invokeUrl);
    t2.start();
    Thread t3 = new MyThread(String invokeUrl);
    t3.start();
    // 主线程等待三个线程执行完成,也可以其他方式,怎么好用怎么来
    t1.join();
    t2.join();
    t3.join();
    // 此时三个接口都调用完毕,判断invokeScuccessCount是否等于3
    if (invokeScuccessCount  == 3){
        updateData();
    }
    这个例子比较简单,如果要获取更详细的信息,可以将invokeScuccessCount换作其他数据结构,JSON或者HashMap都可以
    另外注意的地方就是更新invokeScuccessCount时注意加锁
    纯手打的,没有实际操作了,见谅