平常开发过程中,如果涉及到RPC调用,对于服务调用方和服务提供方,都是可以设置接口超时时间的。以调用方为例,调用方需要调用远程的一个接口,为了保证服务的质量,一般会设置调用接口的超时时间,比如将调用接口的超时时间设置为1秒,当调用远程接口后,经过1秒还未拿到结果,那么就认为是超时了,调用方就不会继续等待服务提供方返回结果,而是直接抛出一个SocketTimeOutException。

其实不仅仅是RPC接口调用需要设置超时时间,数据库、缓存这些一样的,一般都会设置超时时间,不能让程序无休止的等待下去。

那么问题来了!!应用或者说框架,是如何设置超时时间的呢?我们设置超时时间为1秒,那么程序是怎么保证1秒后就停止调用了呢?这也就是本文要介绍的,接口调用设置超时时间的原理。

本文将以设置调用数据库超时为例,介绍设置超时时间是怎么实现的,明白这个原理后,其他比如RPC调用、缓存调用的超时原理也就明白。

CallUtils-带有超时的执行工具类

下面是一个CallUtils,包含一个线程池和execute方法,execute方法中默认超时时间为1秒。

package cn.ganlixin.util;

import java.util.concurrent.*;

/**

* 带有超时的任务执行器

*/

public class CallUtils {

/**

* 用于执行任务的线程池

*/

private static ExecutorService executorService = Executors.newFixedThreadPool(5);

/**

* 执行任务,并且超时时间为1秒

*

* @param callable 需要执行的任务

* @param 任务执行完毕后返回值类型

* @return 任务结果

*/

public static T execute(Callable callable) {

// 提交任务

Future future = executorService.submit(callable);

try {

return future.get(1, TimeUnit.SECONDS);

} catch (InterruptedException | ExecutionException | TimeoutException e) {

e.printStackTrace();

}

return null;

}

}

UserService-将调用数据库

UserService使用CallUtils来执行数据库操作,因为CallUtils设置有调用超时:

package cn.ganlixin.service;

import cn.ganlixin.dao.UserDAO;

import cn.ganlixin.model.User;

import cn.ganlixin.util.CallUtils;

import java.util.List;

public class UserService {

private UserDAO userDAO = new UserDAO();

public List getAllUser() {

return CallUtils.execute(() -> userDAO.getAllUserFromDB());

}

}

UserDAO-耗时的数据库操作

userDAO中,作为测试,只提供了一个getAllUserFromDB方法,休眠2秒来模拟数据库操作,因为UserService使用CallUtils来调用该方法,CallUtils的超时时间为1秒,所以该数据库操作必定会超时:

package cn.ganlixin.dao;

import cn.ganlixin.model.User;

import java.util.List;

import java.util.concurrent.TimeUnit;

public class UserDAO {

/**

* 从DB获取全量user列表

*/

public List getAllUserFromDB() {

try {

// 模拟数据库操作,耗时2秒

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

e.printStackTrace();

}

return null;

}

}

进行测试

创建测试类,测试UserService的getAllUser方法,因为getAllUser方法中使用CallUtils来调用数据库操作,CallUtils的超时时间为1秒,而数据库操作需要2秒,所以getAllUser方法必然会超时。

package cn.ganlixin.test;

import cn.ganlixin.service.UserService;

import org.junit.Test;

public class TestUserService {

public UserService userService = new UserService();

@Test

public void testGetAllUser() {

userService.getAllUser();

}

}

执行测试,输出如下:

总结

本文演示了接口超时调用的原理,实现接口调用超时,无非是通过将任务提交到线程池后,使用future.get,设置超时时间即可。

上面的代码很多细节都不太规范,比如涉及到数据库的超时,应该是数据库连接池的超时配置,而我在演示时是直接使用CallUtils来替代了,但是明白这个原理就OK。

java 调接口 超时处理_接口调用超时的实现原理相关推荐

  1. api数据接口文档_接口文档示例(Taobao/jd/pinduoduo/开放接口调用)

    api数据接口文档_接口文档示例 本文主要是提供了一个接口文档的范文,内容修订历史.目录.时序图.接口要素描述.接口说明.使用示例.字典.FAQ.  使用MD格式文档(makedown),选择原因,容 ...

  2. 对接接口文档_接口自动化测试框架设计思路

    接口自动化测试--框架设计思路 1 前言 之前文章跟大家分享了一下自己在接口自动化测试中进行测试准备的一些相关知识点,接下来本篇文章详细分享一下接口自动化框架设计的思路总结,希望能对初次探索接口自动化 ...

  3. java调c 申请内存_JAVA简单调用C/C++语言(JNI学习三)

    JNI的目的是可以使用C/C++完成部分逻辑,一方面 代码复用,避免重复劳动.另外一方面有些东西还是C语言处理起来比较方便,比如和底层驱动程序打交道等等.JAVA调用C/C++方法,就要把参数传递给C ...

  4. java面向对象高级分层实例_接口类

    package bdqn.studentSys.Dao;import java.util.List;import bdqn.studentSys.entity.Student;/*** 学生表的接口* ...

  5. java 接口可以被继承_接口能被继承吗?

    1.接口可以继承接口 2.抽象类可以实现接口 3.抽象类可以继承实体类 注意:接口不能被实体类继承 扩展资料: 1.Java继承或实现接口时需要遵循的原则: (1)类优先于接口. 如果一个子类继承的父 ...

  6. java solid接口 计算表面积_接口实现椭圆面积的计算

    1.[文件] Cylinder.java ~ 1014B     下载(18) /** * Cylinder.java */ public class Cylinder implements Soli ...

  7. java 前后端解压缩字符串_接口实现后台GZIP压缩,pako.js 前端解压

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...

  8. java 超时中断_怎么在超时后中断任务的ExecutorService

    在超时后中断任务的ExecutorService 我在找一个行政服务可以提供超时的实现.提交给ExecutorService的任务如果花费的时间超过运行超时时间,就会中断.实现这样一个猛兽并不是那么困 ...

  9. 微信接口请求次数_接口签名验证常用方案

    前面的文章说了接口数据如何获取,今天就来聊聊接口数据的安全问题.说到接口加密验证,通常都称作"签名",类似于名人的个性签名,让其它人无法模仿.比如说请求接口删除自己写的文章,又或者 ...

最新文章

  1. c语言可视化_这些算法可视化网站助你轻松学算法
  2. 架构师技术文档:Redis+Nginx+Spring全家桶+Dubbo精选
  3. cpu meltdown 熔断 漏洞 突破内存独立性限制 简介
  4. 虚荣的程序员--恶心,真的想吐
  5. 最小公倍数 最大公约数
  6. Linux IPC实践(12) --System V信号量(2)
  7. commons-lang3-RandomUtils
  8. ERC721藏品合约详解,附代码实现
  9. router走差分_route
  10. windows10安装dll文件
  11. 高新技术企业认定中科技成果转化数量的认定
  12. Tomcat启动,提示 The JRE_HOME environment variable is not defined correctly 问题。
  13. php随机产生4乘4矩阵,matlab函数rand:产生均匀分布的随机数或矩阵的函数
  14. python外汇交易回测系统_StarQuant - 综合量化交易回测系统/平台
  15. 怎么获取apk的包名??
  16. python copy.deepcopy()深入解读
  17. 百微秒时延,腾讯云云硬盘CBS架构深度解密
  18. 转专业2017武汉大学计算机学,转专业申请计算机,武大学子圆梦伯克利
  19. 明星热图|辛芷蕾、郑希怡、王一博、李荣浩等出席品牌活动;刘雨昕、“戳爷”签约新品牌...
  20. 上海滩生鲜电商战鼓敲响,店宝宝:未来谁主沉浮?

热门文章

  1. 《C#设计模式》--03.代理设计模式(结构型设计模式)
  2. [BZOJ1567][JSOI2008]Blue Mary的战役地图(二分+矩阵hash)
  3. win10巨帧数据包在哪里设置_西城区附近索尼电脑维修哪里好-北京信维佳业科技有限公司...
  4. 三菱PLC的通讯协议
  5. 「 C++ 参数 」“(WPARAM wParam, LPARAM lParam)信息” 讲解
  6. cvCvtColor函数
  7. matlab 伽马分布函数,伽马分布(Γ分布的分布函数)
  8. Windows Server 2008 R2 64bit兼容Chrome浏览器
  9. 让早餐,更新鲜,只要一瓶零度果坊早橙好NFC果汁
  10. “浙”字“中”字席位博弈连豆市场