java实现网络请求超时自动熔断

原文:https://www.jianshu.com/p/326465500d1c?utm_campaign

使用场景

之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果在请求进入熔断器开始计时,并且接口在超时时间内没有响应,则需要提早中断该请求并返回。
比如正常下游接口的超时时间为800ms,但是因为自身业务的特殊需求,最多只能等200ms,如果200ms之内没有数据返回,则返回降级数据。这里处理请求的线程可以看成是tomcat线程池中的一个线程,如果通过线程池返回的Future,可以很轻松的实现超时返回。
超过自己的预设值,直接返回失败,并且记录一下失败日志,可以自己决定是否需要重试。

主要方法

因为需要有返回值,但是实现 Runable ,重写 run 方法没有返回值,
所以我们采用实现Callable的方式,重写 call 方法就行
如何得到返回值呢?
task.get()
注意的是,默认不设置时间,这个是无限等待堵塞在那里的。
所以还提供了另外的方法

task.get(2500, TimeUnit.MILLISECONDS); 

加个参数表示超时时间。



作者:lucode
链接:https://www.jianshu.com/p/326465500d1c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

public class CallableDemo {

    public static String fun() {
        // 成员内部类
        class CallableThread implements Callable {
            @Override
            public String call() {
                try {
                    // 假设这个是一个耗时的网络 请求
                    Thread.sleep(6000);
                    return "请求返回值";
                } catch (InterruptedException e) {
                    // 假装记录一下日志 
                    return null;
                }
            }
        }
        // 开始事件
        long beginTime = System.currentTimeMillis();
        Callable callableThread=new CallableThread();
        FutureTask task= new FutureTask<>(callableThread);
        // 开启线程
        new Thread(task).start();
        String result;
        try {
            // 如果2.5秒没有返回值就 抛出异常
            result = task.get(2500, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            result=null;
        }
        // 结束事件
        long endTime = System.currentTimeMillis();
        System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!");
        
        if (result!=null){
            return result;
        }else {
            return null;
        }
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(fun());
    }
}

 

转载于:https://www.cnblogs.com/shihaiming/p/10889335.html

你可能感兴趣的:(java)