美文网首页
java实现网络请求超时自动熔断

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

作者: lucode | 来源:发表于2017-09-11 20:25 被阅读105次

    使用场景

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

    主要方法

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

    task.get(2500, TimeUnit.MILLISECONDS);
    

    加个参数表示超时时间。

    public class CallableDemo {
    
        public static String fun() {
            // 成员内部类
            class CallableThread implements Callable<String> {
                @Override
                public String call() {
                    try {
                        // 假设这个是一个耗时的网络 请求
                        Thread.sleep(6000);
                        return "请求返回值";
                    } catch (InterruptedException e) {
                        // 假装记录一下日志 
                        return null;
                    }
                }
            }
            // 开始事件
            long beginTime = System.currentTimeMillis();
            Callable<String> callableThread=new CallableThread();
            FutureTask<String> 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());
        }
    }
    

    相关文章

      网友评论

          本文标题:java实现网络请求超时自动熔断

          本文链接:https://www.haomeiwen.com/subject/leofsxtx.html