• 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<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());
        }
    }
  • 相关阅读:
    PCB设计流程
    第一次PCB画板实战MiniDVPart1/3
    程序人生
    MCU死掉了
    一花一世界,一码一人生,谓之程序人生
    神船·神舟
    程序猿的选择
    android得到strings.xml文件中的内容
    Android特效 五种Toast详解
    Java字符串转换为日期和时间比较大小
  • 原文地址:https://www.cnblogs.com/shihaiming/p/10889335.html
Copyright © 2020-2023  润新知