原文: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());
}
}

java实现网络请求超时自动熔断的更多相关文章

  1. [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式

    两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...

  2. 微信内置安卓x5浏览器请求超时自动重发问题处理小记

    X5内核  请求超时后会自动阻止请求返回并由代理服务器将原参数重新发送请求到服务层代码.但由于第一次请求已经请求到服务器,会导致出现重复下单.支付等重大问题. 该问题由于腾讯x5浏览器会自动阻止第一次 ...

  3. Android 网络请求超时处理方案

    以用户登录为例介绍用户访问网络时的请求超时处理的两种方法: 1)使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, un ...

  4. nginx android app 慢网络请求超时

    最近遇到了android 在慢网络下面请求服务器报 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by ...

  5. Java之网络请求工具类(依赖:org.apache.http;注:HttpClient 4.4,HttpCore 4.4)

    到此处可以去下载依赖包:http://hc.apache.org/downloads.cgi import java.util.List; import org.apache.http.HttpSta ...

  6. java HttpClicent网络请求与解析

    HttpClicent是Apache下的一个子项目,文档齐全,详见官网:http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html ...

  7. Java/Android 网络请求框架/库

    Android 图片缓存框架  最上面的最优先 com.facebook.fresco:fresco:0.12.0                7.26.2016最新 Universal-Image ...

  8. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  9. Flutter之网络请求

    Flutter之网络请求 一,介绍与需求 1.1,介绍 1,http一个可组合的,基于Future的库,用于发出HTTP请求.包含一组高级功能和类,可轻松使用HTTP资源.它与平台无关,可以在命令行和 ...

随机推荐

  1. 第五章 编码/加密——《跟我学Shiro》

    转发地址:https://www.iteye.com/blog/jinnianshilongnian-2021439 目录贴:跟我学Shiro目录贴 在涉及到密码存储问题上,应该加密/生成密码摘要存储 ...

  2. Tesnsorflow命名空间与变量管理参数reuse

    一.TensorFlow中变量管理reuse参数的使用 1.TensorFlow用于变量管理的函数主要有两个:  (1)tf.get_variable:用于创建或获取变量的值  (2)tf.varia ...

  3. 当微信小程序遇到AR(一)

    当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习. 本课程需要一定的基础:微信开发者工具,JavaS ...

  4. 【miscellaneous】理解Gstreamer架构

    本文给出了Gstreamer的总体设计.通过阅读本文可以了解Gstreamer的内部工作原理.本文编译自gstreamer源码中的文档,原文在源码中的位置是/gstreamer/docs/design ...

  5. 基于Jquery ui 可复用的酒店 web页面选择入住日期插件

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  6. vue-cli2和vue-cli3同时存在

    https://blog.csdn.net/Jioho_chen/article/details/90455778 win下 vue-cli2 和 vue-cli3 并存,一起使用开局一张图,内容慢慢 ...

  7. sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 的解决办法

    Linux新建用户 ,sudo报错: sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 解决办法:重置一下s ...

  8. 去掉右键Open Folderas Intellij IDEA Project

    解决: WIN+R键打开运行,输入regedit 打开注册表 在地址栏输入: 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell 然 ...

  9. 2.ASP.NET Core Docker学习-镜像容器与仓库

    Docker下载 https://www.docker.com/community-edition 社区版 (CE) 下载完后安装,运行 docker --version 可查看版本 基本命令: 下面 ...

  10. 安装v2ra y

    说明 全文中所有的‘删掉我’,都请忽略,如果不这么做,那么您将看不到这篇文章 ssr已经不行了,现在大家都以v2ra y为主 安装服务端 运行一键安装脚本,之后进入脚本界面,选“1”安装: bash ...