欧博亚洲注册:接口挪用超时的实现原理

2020-06-29 8 views 0

扫一扫用手机浏览

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

  实在不仅仅是RPC接口挪用需要设置超时时间,数据库、缓存这些一样的,一样平常都市设置超时时间,不能让程序无休止的守候下去。

  那么问题来了!!应用或者说框架,是若何设置超时时间的呢?我们设置超时时间为1秒,那么程序是怎么保证1秒后就住手挪用了呢?这也就是本文要先容的,接口挪用设置超时时间的原理。

  本文将以设置挪用数据库超时为例,先容设置超时时间是怎么实现的,明了这个原理后,其他好比RPC挪用、缓存挪用的超时原理也就明了。

&NBsp;

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 <T>      义务执行完毕后返回值类型
     * @return 义务效果
     */
    public static <T> T execute(Callable<T> callable) {

        // 提交义务
        Future<T> 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<User> 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<User> 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。

 

,

欧博开户网址

欢迎进入欧博开户网址(Allbet Gaming):www.aLLbetgame.us,欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

Sunbet网站内容转载自互联网,如有侵权,联系Sunbet删除。

本文链接地址:http://www.caac-feixingjia.com/post/963.html

相关文章

发表评论