首页 > 其他分享 >SpringBoot手动取消接口执行方案

SpringBoot手动取消接口执行方案

时间:2024-03-26 15:45:53浏览次数:21  
标签:SpringBoot Thread 手动 接口 result userModel authService annotation

实际开发中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,所以进行研究测试后总结了一套主动取消接口调用的解决方案

自定义注解用于标记耗时接口

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Inherited
public @interface HandleCancel {
}

自定义切面对注解的接口调用线程进行记录

@Aspect
@Component
public class HandleCacelAspect {

    @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping) " +
            "|| @within(org.springframework.web.bind.annotation.PostMapping)"+
            "@annotation(org.springframework.web.bind.annotation.GetMapping) " +
            "|| @within(org.springframework.web.bind.annotation.GetMapping)")
    public void handleCacelAspect() {

    }

    @Around("handleCacelAspect()")
    public Object around(ProceedingJoinPoint point) throws Throwable {

        boolean handleCacel = false;
        Object result = null;
        try{
            HandleCancel handleCancelAnnotation = method.getAnnotation(HandleCancel.class);
            if (handleCancelAnnotation != null) {
                handleCacel = true;
            }
            if(handleCacel){
                //这里将对应的耗时接口请求线程名称和token关联存储到redis中,请安实际情况编写
                TokenModel userModel = authService.getTokenModel();
                userModel.addThread(Thread.currentThread().getName());
                authService.updateToken(authService.getTokenString(),userModel);
            }
             result = point.proceed();
        }finally {
            if(handleCacel){
                //这里在耗时接口执行完毕后删除对应存储的线程名称,请安实际情况编写
                TokenModel userModel = authService.getTokenModel();
                userModel.removeThread(Thread.currentThread().getName());
                authService.updateToken(authService.getTokenString(),userModel);
            }
        }

        return result;
    }
}

提供统一取消调用的接口

    @PostMapping("/killUserHandleThread")
    @ResponseBody
    public Object killUserHandleThread(@RequestBody Map<String, Object> params) {
        Result result = Result.okResult();
        TokenModel userModel = authService.getTokenModel();
        List<String> threadNameList = userModel.getThreadList();

        ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
        int noThreads = currentGroup.activeCount();
        Thread[] lstThreads = new Thread[noThreads];
        currentGroup.enumerate(lstThreads);

        for (int i = 0; i < noThreads; i++) {
            String threadName = lstThreads[i].getName();
            if (threadNameList.contains(threadName)) {
                System.out.println("中断线程:" + threadName);
                lstThreads[i].interrupt();
                userModel.removeThread(threadName);
                authService.updateToken(authService.getTokenString(),userModel);
            }
        }
        return result;
    }

标签:SpringBoot,Thread,手动,接口,result,userModel,authService,annotation
From: https://www.cnblogs.com/yanpeng19940119/p/18096810

相关文章

  • ISBN信息查询api接口
     基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77伽薇 809137232请求参数说明:名......
  • 接口注意的点
    参考:http://mp.weixin.qq.com/s?__biz=Mzk0ODYyNjE4NA==&mid=2247486325&idx=1&sn=eadb10489f62167bb628f3f89828c613&chksm=c365fd12f4127404b3351138ddfd38934644046777942dccd4d3742de7e2d0198214fa364df8&mpshare=1&scene=24&srcid=03262a33of......
  • 分析回调接口的记录
    分析回调接口的一个重要指标就是:方向性。WhycanextendsainterfacegetacallbackinJava?BurpSuite提供了一个标准的API接口,插件开发者需要实现其中的某些接口和方法,并通过BurpSuite提供的扩展性框架注册和加载插件。BurpSuite在运行时会自动发现并调用插件中实现的特......
  • SpringBoot基础24_SpringBoot简介1
    一、原有Spring优缺点分析1、Spring的优点分析Spring是Java企业版(JavaEnterpriseEdition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的EnterpriseJavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(PlainOldJava......
  • springboot学习
    SpringBoot1SpringBoot2SpringBoot3SpringBoot4SpringBoot5SpringBoot6SpringBoot7shiro简介:入门:整合shiro导包写Controller报错点击查看代码org.thymeleaf.exceptions.TemplateInputException:Errorresolvingtemplate[index],templatemightnotexistor......
  • JAVA接口详解
    一,抽象类抽象类为用abstract修饰的类1,定义的成员变量与普通的类没有区别2,抽象类不可以被实例化3,当一个类不具体描述某个对象时,可以定义为抽象类4,如果一个类包含抽象方法,则这个类必须是抽象类,没有抽象方法,也可以被称为抽象类5,一个方法可以被修饰为abstract,这个方法可以不......
  • 淘宝item_sku-获取sku详细信息AIP接口(taobao.item_sku)布局技巧:3个技巧教你凸显商品sku
    淘宝的taobao.item_sku API接口是用于获取淘宝商品中SKU(StockKeepingUnit,库存量单位)的详细信息的。SKU通常代表一个商品的不同属性组合,比如颜色、尺码等。对于商家和消费者来说,了解SKU的详细信息是非常重要的,因为它可以帮助他们更准确地了解商品的具体属性和库存情况。通......
  • 【linux】Centos7 手动编译安装 cmake-3.28.4
    简介1、移除原来的cmake版本yumremovecmake-y2、下载cmake-3.28.4.tar.gz安装包并解压wgethttps://cmake.org/files/v31、移除老版本cmake版本并安装依赖包yumremovecmake-y;yuminstall-ygccgcc-c++makeautomakeopensslopenssl-devel2、下载cmake-3.7.2.tar.gz......
  • Springboot项目的main函数入口,如何像jar包一样接受参数
    一般来说,springboot项目是提供服务的,但是也可以用到导出jar来启动,那么如何介绍参数呢:packagecom.example.TestDemo;importcom.example.jmeter.bean.TestCaseResult;importcom.example.jmeter.controller.JmeterController;importlombok.extern.slf4j.Slf4j;importorg.......
  • Springboot3基于SpringDoc实现接口分组功能
    问题最近在接触SpringBoot3,整合Swagger文档组件的过程中发现一个问题,通过springdoc.group-configs[0].display-name=示例接口配置分组名称在界面上面还是显示OpenAPIdefinition,如下图所示:查询了下官方文档,可以通过注入GroupedOpenApi对象实现接口分组描述信息展示,同时找到了一......