springboot项目统一接口超时机制设计

这篇具有很好参考价值的文章主要介绍了springboot项目统一接口超时机制设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

springboot项目统一接口超时机制以及异常捕获设计

因为不同的业务接口所需超时时间不同,例如上传或者下载,但是大多数接口都基本可以统一一个超时时间,同时捕获异常,方便上下游子系统设置超时时间能够包住,以及业务可以根据错误码更好地判断做对应的补偿措施,前端展示失败原因
主要设计:编写BaseController,提供请求统一入口,线程池提交请求并设置超时时间,超时时间可以自定义,定义一个函数式接口TemplateInterface,请求对象需要继承BaseRequestDTO,响应对象需要继承BaseResponseDTO

BaseController

public class BaseController {

    private static final Logger logger = LoggerFactory.getLogger(BaseController.class);
    protected static final JsonMapper JSON_MAPPER = JsonMapper.nonEmptyMapper();

    @Autowired
    @Qualifier("threadPoolTaskExecutor")
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @Autowired
    private BizSeqUtil bizSeqUtil;
    protected static long timeout = 7000;//默认超时时间


    public <T extends BaseResponseDTO, E extends BaseRequestDTO> T doExecute(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse, long timeout, E request, TemplateInterface<T, E> templateInterface, T timoutResponse, T exceptionResponse) {
        //执行逻辑
        setBizSeq(request);
        try {
            Future<T> future = threadPoolTaskExecutor.submit(() -> {
                return templateInterface.apply(request);
            });
            T baseResponseDTO = future.get(timeout, TimeUnit.MILLISECONDS);
            baseResponseDTO.setBizSeqNo(request.getBizSeqNo());
            return baseResponseDTO;
        } catch (TimeoutException e) {
            logger.error("{}|submit request timeout exception:{}",request.getBizSeqNo(),e.getMessage());
            timoutResponse.setBizSeqNo(request.getBizSeqNo());
            return timoutResponse;
        } catch (Exception e) {
            logger.error("{}|submit request error:",request.getBizSeqNo(),e);
            exceptionResponse.setBizSeqNo(request.getBizSeqNo());
            return exceptionResponse;
        }
    }

	//设置流水号
    private <E extends BaseRequestDTO> void setBizSeq(E req) {
        if (req.getBizSeqNo() != null && req.getBizSeqNo().length() > 0) {
            return;
        }
        String bizSeqNo = bizSeqUtil.newBizSeq();
        req.setBizSeqNo(bizSeqNo);
    }
}

PlayerController继承BaseController

@RestController
@RequestMapping("/player")
@Slf4j
public class PlayerController extends BaseController {

    @Autowired
    private PlayerService playerService;

    //@RequestCheck
    @RequestMapping("/list")
    public PlayerResponseDTO getPlayerList(HttpServletRequest httpServletRequest,
                                           HttpServletResponse httpServletResponse,
                                           @RequestBody PlayerRequestDTO requestDTO) {

        log.info("getPlayerList requestDTO:{}", JSON_MAPPER.toJson(requestDTO));
        PlayerResponseDTO timeoutResponse = new PlayerResponseDTO(ErrorStatus.TIMEOUT_EXCEPTION);//超时返回
        PlayerResponseDTO errorResponse = new PlayerResponseDTO(ErrorStatus.SYSTEM_ERROR);//异常返回

        return doExecute(httpServletRequest, httpServletResponse, timeout, requestDTO, (request -> {
            PlayerResponseDTO responseDTO = playerService.getPlayerList(request);
            log.info("getPlayerList responseDTO:{}", JSON_MAPPER.toJson(responseDTO));
            return responseDTO;
        }), timeoutResponse, errorResponse);
    }
}

请求父类BaseRequestDTO和响应父类BaseResponseDTO

/**
 * 请求父类
 */
public class BaseRequestDTO {

    private String bizSeqNo;
	//get set方法忽略
}

/**
 * 响应父类
 */
public class BaseResponseDTO {

    private String code = "0";
    private String msg = "success";
    private String bizSeqNo;
    private Object data;


    public BaseResponseDTO() {
    }

    public BaseResponseDTO(Object object) {
        this.code = "0";
        this.msg = "success";
        this.data = object;
    }

    public BaseResponseDTO(ErrorStatus errorStatus) {
        this.code = errorStatus.getErrCode();
        this.msg = errorStatus.getErrMsg();
    }

    public BaseResponseDTO(String code,String msg) {
        this.code = code;
        this.msg = msg;
    }
	//get set方法忽略
}

定义一个函数式接口TemplateInterface,请求对象需要继承BaseRequestDTO,相应对象需要继承BaseResponseDTO

//<T extends BaseResponseDTO, E extends BaseRequestDTO>
@FunctionalInterface
public interface TemplateInterface<T , E> {
    T apply(E r);
}

创建线程池

@Bean("threadPoolTaskExecutor")
public ThreadPoolTaskExecutor threadPoolExecutor(@Value("${threadPool.corePoolSize}") int corePoolSize,
                                   @Value("${threadPool.maxPoolSize}") int maxPoolSize,
                                   @Value("${threadPool.keepAliveSeconds}") int keepAliveSeconds,
                                   @Value("${threadPool.queueCapacity}") int queueCapacity,
                                   @Value("${threadPool.threadNamePrefix}") String threadNamePrefix
                                             ) {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(corePoolSize);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setKeepAliveSeconds(keepAliveSeconds);
    executor.setQueueCapacity(queueCapacity);
    executor.setThreadNamePrefix(threadNamePrefix);
    executor.initialize();
    return executor;
}

接口方法添加耗时逻辑,查看效果

public PlayerResponseDTO getPlayerList(PlayerRequestDTO requestDTO) {
		//添加耗时逻辑,接口超时时间是7
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        TPlayer player = new TPlayer();
        BeanUtils.copyProperties(requestDTO,player);
        PageInfo page = requestDTO.getPage() == null ? new PageInfo() : requestDTO.getPage();
        player.setPage(page);
        List<TPlayer> list = playerDAO.selectPlayerList(player);
        PlayerResponseDTO responseDTO = new PlayerResponseDTO();
        responseDTO.setPlayerList(list);
        return responseDTO;
    }

达到预期效果

spring配置请求超时时间,spring boot,后端,java文章来源地址https://www.toymoban.com/news/detail-769211.html

到了这里,关于springboot项目统一接口超时机制设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot第11讲:SpringBoot 如何统一接口封装

    本文是SpringBoot第11讲,在以SpringBoot开发Restful接口时统一返回,方便前端进行开发和封装,以及出现问题时给出响应编码和信息。 什么是 REST ?

    2024年02月09日
    浏览(44)
  • springboot统一拦截包装接口返回值

    1、作用 代替手动封装每个接口的返回值,否则每个有返回值的controller接口,都需要手动使用Resonse类包装返回结果 2、实现 方法返回值handler,需要实现接口HandlerMethodReturnValueHandler,并重写supportsReturnType和handleReturnValue方法。只有在supportsReturnType方法返回值为true的情况下才会

    2024年02月13日
    浏览(57)
  • 【java】Spring Cloud --Feign Client超时时间配置以及单独给某接口设置超时时间方法

    FeignClient面对服务级有三种超时时间配置 feign配置是在ribbon配置的基础上做了扩展,可以支持服务级超时时间配置,所以,feign配置和ribbon配置的效果应该是一样的。 SpringCloud对这两种配置的优先级顺序如下: Feign局部配置 Feign全局配置 Ribbon局部配置 Ribbon全局配置 在feign-co

    2024年02月12日
    浏览(47)
  • spring cloud gateway单独设置某几个接口超时时间

    在使用Spring cloud Gateway (scg)时,通过service name 全局匹配,路由到相应的服务。但是请求/响应超时怎么设置呢? Spring cloud Gateway 可以为所有路由配置 Http 超时(响应和连接),并为每个特定路由覆盖。 connect-timeout 连接超时必须以毫秒为单位指定。 response-timeout 响应超时必须指

    2024年01月16日
    浏览(47)
  • 【Spring】SpringBoot 统一功能处理

    在日常使用 Spring 框架进行开发的时候,对于一些板块来说,可能需要实现一个相同的功能,这个功能可以是验证你的登录信息,也可以是其他的,但是由于各个板块实现这个功能的代码逻辑都是相同的,如果一个板块一个板块进行添加的话,开发效率就会很低,所以 Spring

    2024年01月18日
    浏览(41)
  • 接口返回响应,统一封装(ResponseBodyAdvice + Result)(SpringBoot)

    接口的返回响应,封装成统一的数据格式,再返回给前端。 对于SpringBoot项目,接口层基于 SpringWeb ,也就是 SpringMVC 。 为了使接口的返回结果数据更加规范化,便于接口测试和前端处理,需要以统一的格式来返回数据; 为了不在每一个接口里面,都写一段返回数据封装的代

    2024年02月08日
    浏览(59)
  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

    博友的需求就是我最大的动力 博友一说话,本狗笑哈哈。 博友要我写啥,我就写啥 。 特来一篇关于 SpringBoot接口返回结果及异常统一处理 ,虽说封不封装都能用,但咱后端也得给前端小姐姐留个好印象不是。项目前后端分离, 规范的数据传输格式,让REST风格的API具有简单

    2024年02月08日
    浏览(43)
  • 如何设计 API 接口,实现统一格式返回?

    在移动互联网,分布式,微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前分离分离方式,(题外话:前重新的工作分配越来越明确,现在的前端都称为大前端,技术栈以及生态圈都已经非常成熟;以前官员人员瞧不起前端人员,那现在高层人员要重新认识一下

    2024年02月12日
    浏览(42)
  • Spring Cloud Gateway集成Swagger实现微服务接口文档统一管理及登录访问

    本文将介绍如何在 Spring Cloud 微服务中使用 Swagger 网关来统一管理所有微服务的接口文档,并通过 Spring Security 实现登录后才能访问 Swagger 文档,以确保接口数据的安全访问。 在开始之前,需要假设你已经完成了 Spring Cloud Gateway 的相关配置,并且已经了解了基本的网关配置知

    2024年02月05日
    浏览(44)
  • 基于Springboot整合Socket仿微信实现群聊、私聊功能。实现客户端client,服务端server心跳维护、超时机制【一文通】

    博主介绍: ✌java资深开发工程师、Java领域优质创作者,博客之星、专注于Java技术领域和学生毕业项目实战,面试讲解跟进,高校老师/讲师/同行交流合作✌ 胡广愿景: \\\"比特星球\\\",致力于帮助底层人员找到工作, 让每个底层人员都能找到属于自己的星球。 拓展学习领域,获

    2024年02月19日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包