SpringBoot手动取消接口执行方案

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

现实开辟中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,以是举行研究测试后总结了一套主动取消接口调用的办理方案
自定义注解用于标记耗时接口
  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD})
  3. @Inherited
  4. public @interface HandleCancel {
  5. }
复制代码
自定义切面对注解的接口调用线程举行记录
  1. @Aspect
  2. @Component
  3. public class HandleCacelAspect {
  4.     @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping) " +
  5.             "|| @within(org.springframework.web.bind.annotation.PostMapping)"+
  6.             "@annotation(org.springframework.web.bind.annotation.GetMapping) " +
  7.             "|| @within(org.springframework.web.bind.annotation.GetMapping)")
  8.     public void handleCacelAspect() {
  9.     }
  10.     @Around("handleCacelAspect()")
  11.     public Object around(ProceedingJoinPoint point) throws Throwable {
  12.         boolean handleCacel = false;
  13.         Object result = null;
  14.         try{
  15.             HandleCancel handleCancelAnnotation = method.getAnnotation(HandleCancel.class);
  16.             if (handleCancelAnnotation != null) {
  17.                 handleCacel = true;
  18.             }
  19.             if(handleCacel){
  20.                 //这里将对应的耗时接口请求线程名称和token关联存储到redis中,请安实际情况编写
  21.                 TokenModel userModel = authService.getTokenModel();
  22.                 userModel.addThread(Thread.currentThread().getName());
  23.                 authService.updateToken(authService.getTokenString(),userModel);
  24.             }
  25.              result = point.proceed();
  26.         }finally {
  27.             if(handleCacel){
  28.                 //这里在耗时接口执行完毕后删除对应存储的线程名称,请安实际情况编写
  29.                 TokenModel userModel = authService.getTokenModel();
  30.                 userModel.removeThread(Thread.currentThread().getName());
  31.                 authService.updateToken(authService.getTokenString(),userModel);
  32.             }
  33.         }
  34.         return result;
  35.     }
  36. }
复制代码
提供统一取消调用的接口
  1.     @PostMapping("/killUserHandleThread")
  2.     @ResponseBody
  3.     public Object killUserHandleThread(@RequestBody Map<String, Object> params) {
  4.         Result result = Result.okResult();
  5.         TokenModel userModel = authService.getTokenModel();
  6.         List<String> threadNameList = userModel.getThreadList();
  7.         ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
  8.         int noThreads = currentGroup.activeCount();
  9.         Thread[] lstThreads = new Thread[noThreads];
  10.         currentGroup.enumerate(lstThreads);
  11.         for (int i = 0; i < noThreads; i++) {
  12.             String threadName = lstThreads[i].getName();
  13.             if (threadNameList.contains(threadName)) {
  14.                 System.out.println("中断线程:" + threadName);
  15.                 lstThreads[i].interrupt();
  16.                 userModel.removeThread(threadName);
  17.                 authService.updateToken(authService.getTokenString(),userModel);
  18.             }
  19.         }
  20.         return result;
  21.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表