实际开发中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,所以进行研究测试后总结了一套主动取消接口调用的解决方案
自定义注解用于标记耗时接口
@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 params) {
Result result = Result.okResult();
TokenModel userModel = authService.getTokenModel();
List 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
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
© 版权声明
本平台(www.cooy.cn)的一切软件、教程及内容信息仅限用于学习和研究,付费仅为收集整理归类费用;
不得将上述内容用于商业或者非法用途,否则一切后果用户自行承担负责。本平台资源、内容、信息均来自来自用户上传,版权争议及其他问题与本平台无关。
您必须在下载后的24个小时之内从您的电脑或手机中彻底删除上述下载内容,如果您喜欢该程序或内容,请支持正版以获取更好的服务。我们非常重视版权问题,如有侵权请发送邮件至下方邮件(655465@qq.com),敬请谅解!
如发现违法违规内容,请联系下方邮箱举报,我们收到后将会第一时间处理。
THE END
暂无评论内容