實(shí)際開發(fā)中經(jīng)常會(huì)遇到比較耗時(shí)的接口操作,但頁面強(qiáng)制刷新或主動(dòng)取消接口調(diào)用后后臺(tái)還是會(huì)繼續(xù)運(yùn)行,特別是有大量數(shù)據(jù)庫(kù)操作時(shí)會(huì)增加服務(wù)器壓力,所以進(jìn)行研究測(cè)試后總結(jié)了一套主動(dòng)取消接口調(diào)用的解決方案
自定義注解用于標(biāo)記耗時(shí)接口
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Inherited
public @interface HandleCancel {
}
自定義切面對(duì)注解的接口調(diào)用線程進(jìn)行記錄文章來源:http://www.zghlxwxcb.cn/news/detail-843529.html
@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){
//這里將對(duì)應(yīng)的耗時(shí)接口請(qǐng)求線程名稱和token關(guān)聯(lián)存儲(chǔ)到redis中,請(qǐng)安實(shí)際情況編寫
TokenModel userModel = authService.getTokenModel();
userModel.addThread(Thread.currentThread().getName());
authService.updateToken(authService.getTokenString(),userModel);
}
result = point.proceed();
}finally {
if(handleCacel){
//這里在耗時(shí)接口執(zhí)行完畢后刪除對(duì)應(yīng)存儲(chǔ)的線程名稱,請(qǐng)安實(shí)際情況編寫
TokenModel userModel = authService.getTokenModel();
userModel.removeThread(Thread.currentThread().getName());
authService.updateToken(authService.getTokenString(),userModel);
}
}
return result;
}
}
提供統(tǒng)一取消調(diào)用的接口文章來源地址http://www.zghlxwxcb.cn/news/detail-843529.html
@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;
}
到了這里,關(guān)于SpringBoot手動(dòng)取消接口執(zhí)行方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!