如何控制方法的调用Timeout超时,并主动中断调用请求

前言

在我们实际开发过程中,我们经常遇到一些场景:

1、如果调用方法超过1秒,就应该停止调用,不要一直阻塞下去,防止把本身的服务资源搞挂。

2、在不可预知可能出现死锁/死循环的代码,要加上时间的阀值,避免阻塞。

很多开源框架都会有超时响应的设置;如果是我们自己开发的服务,怎么能做到这点呢?

JDK的Future

在jdk中有个future类,里面有获取等待超时的方法。

主要方法:
cancel():取消任务
get():等待任务执行完成,并获取执行结果
get(long timeout, TimeUnit unit):在指定的时间内会等待任务执行,超时则抛异常。

本文不重点介绍future方法,可自行网补。

Guava中的超时

Google开源的Guava工具包,还是比较强大的;里面即包含了超时的控制。里面有个。

TimeLimiter 是个接口,下面有两个子类。

FakeTimeLimiter, 常用于debug时,限制时间超时调试。

SimpleTimeLimiter 常用于正式方法中,调用方法超时,即抛出异常。

SimpleTimeLimiter

这个类有2种方式实现超时的控制,代理模式和回调模式。

一、基于代理模式

Guava采用的是JDK动态代理实现的AOP拦截,所以代理类必须实现一个接口。可以达到对类中所有的方法进行超时控制。

pom依赖

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>29.0-jre</version>
</dependency>

定义接口

定义了一个学生服务接口;

public interface StudentService {
    /**
     * 根据学生id 获取 学生姓名
     * @param studentId
     * @return
     */
    String getStudentNameById(Integer studentId);
  
    /**
     * 根据学生id 获取 学生爱好
     * @param studentId
     * @return
     */
    List<String> getStudentHobbyById(Integer studentId);
}

接口实现

实现了根据id获取姓名,以及获取爱好;

@Service
public class StudentServiceImpl implements StudentService {

    private static Logger logger = LoggerFactory.getLogger(StudentServiceImpl.class);

    @Override
    public String getStudentNameById(Integer studentId) {
        try{
            TimeUnit.SECONDS.sleep(3);
        }catch (Exception e){

        }
        return "张三";
    }

    @Override
    public List<String> getStudentHobbyById(Integer studentId) {
        try{
            TimeUnit.SECONDS.sleep(10);
        }catch (
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值