优雅实现单接口超时限制

有些时候为了防止某些热点功能出现问题,区别于令牌桶等限流情况,需要对单个接口或者代码块进行超时限制;
例如在2秒内你要是不给我返回结果,我就不要了。
实现代码如下:

1.引入jar包

<dependency>  
  <groupId>com.google.guava</groupId>  
  <artifactId>guava</artifactId>  
  <version>19.0</version>  
</dependency> 

2.引用相关代码实现功能:

public static void main(String[] args){
   //一定要自己创建线程池,否则它采用默认线程池可能你没有设置线程池上限造成线程问题
   ExecutorService executor=Executors.newFixedThreadPool(1);
   TimeLimiter tl=new SimpleTimeLimiter(executor);
   long timeout=2;//超时时间为2秒
   String result;//返回值
   try{
     result=tl.CallWithTimeout(new Callable<String>(){
       @override
       public string call() throws Exception{
            Thread.sleep(3000);//代替实际代码逻辑
            return "正常返回";
        }
     },timeout,TimeUnit.SECONDS,true);
   }catch(Exception e){
     System.out.println("超时了");
     result=null;
   }
}
  • TimeLimiter接口带有@Beta注解,所以可能还存在一定的风险,慎用
  • 该接口还提供了newProxy()的方式,但是需要改造自己的业务接口,用起来麻烦一点
  • 可以进入SimpleTimeLimiter看下实现方式,是采用Future实现,可以对这个东西做下了解,有空尝试自己写一下
  • 代码部分引入的创建线程池方式比较简单,设计到线程就尽可能的谨慎处理,详细创建方式可在本站搜索“如何创建Java线程池

发表回复

您的电子邮箱地址不会被公开。

18 − 16 =