接口调用超时

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36710456/article/details/83379782

1.增加超时时间

假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的响应速度,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。

package cn.test;

import java.util.concurrent.*;

public class TimeOutTest {

    public static void main(String[] args) {
        final ExecutorService exec = Executors.newFixedThreadPool(1);

        Callable<Object> call = new Callable<Object>() {
            public Object call() throws Exception {
                //开始执行耗时操作
                //Thread.sleep(1000 * 9);
                
                //调用第三方接口
                // ......
                return "将调用接口的返回值 返回";
            }
        };

        try {
            Future<Object> future = exec.submit(call);
            // obj为 上面call 对象中的call()方法的返回值
            Object obj = future.get(1000 * 10, TimeUnit.MILLISECONDS); //任务处理超时时间设为 10 秒
            System.out.println("任务成功返回:" + obj);
            // 请求接口正常 , 执行后续操作 .....
            
        } catch (Exception e) {
            System.out.println("响应超时");
            // 响应超时,执行后续操作 ......
            
        }
        // 关闭线程池
        exec.shutdown();
    }

}

2.尝试多调用一次

如果第一次调用methodB超时了,那么你可以尝试多调用一次。当然前提是,methodA不追求超快的响应时间。

注意:调用多次不代表重复调用 制造脏数据

3.使用待处理队列

如果methodA需要很快的响应速度,那么当调用methodB接口超时时,可以使用一个队列存储本次失败的记录,然后使用一个job每隔一段时间去扫这个队列,看看是否有待处理的数据。 
备注:如果对方系统挂掉了,使用待处理队列的方式,比较合适。

4.回滚数据

catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚。让对方的系统重新调用。 
备注:宁愿没有数据,也不要存储脏数据。

5.使用异步机制

如果你的业务方法中,需要调用对方的http接口,如果这个http接口不影响主流程的,那么可以使用一个线程,异步调用对方的http接口,并把超时时间设置长一些。由于使用了异步,主流程会立刻继续走的。
 

猜你喜欢

转载自blog.csdn.net/sinat_36710456/article/details/83379782
今日推荐