美文网首页
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实现网络请求超时自动熔断

    使用场景 之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级功能时,在平台上设置了一...

  • 高可用最佳实践

    熔断 rpc调用开始时,熔断器关闭 rpc发生超时(拒绝服务),超时次数超过阈值,熔断器打开,不发送rpc请求,直...

  • axios 设置超时时间 timeout

    全局设置网络超时 单独对某个请求设置网络超时

  • 请求超时

    请求超时分两种:前端超时,服务端超时1.服务端超时:当请求到服务端默认超时时间还是无响应,服务端会自动断开请求2....

  • Java网络编程设置请求超时

    一、引言 随着企业系统的发展,应用多采用分布式结构,严重依赖于网络的稳定性。但由于网络天生的不稳定性,系统开发过程...

  • Spring Cloud Hyxtrix 初探

    1. Hyxtrix 作用 熔断 降级 限流 超时 2. Hyxtrix 实现模式 1) 线程池 模式采用这种实现...

  • ios小知识

    1,常用网络框架默认网络请求超时时长 默认的网络请求超时时长 ASI 是10秒 苹果官方是60秒 SDWebIma...

  • Java实现超时机制

    Java实现超时机制

  • AFNetWorking 取消网络请求&网络超时

    取消网络请求 网络超时 timeoutInterval 是AFNetworking本身自带的一个设置超时的键。 设...

  • Hystrix使用分析

    Hystrix使用 使用Hystrix实现熔断 要实现熔断,首先需要在请求调用方pom文件中加入 在启动类上加入@...

网友评论

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

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