winter 7 месяцев назад
Родитель
Сommit
c6dc5af722
3 измененных файлов: 53 добавлений и 1 удалений
  1. +11
    -0
      mallinkAdmin/src/main/java/com/iformall/annotation/RequestTimeout.java
  2. +39
    -0
      mallinkAdmin/src/main/java/com/iformall/aop/TimeoutAspect.java
  3. +3
    -1
      mallinkAdmin/src/main/java/com/iformall/controller/market/WxVtwoPrizeDrawActivityController.java

+ 11
- 0
mallinkAdmin/src/main/java/com/iformall/annotation/RequestTimeout.java Просмотреть файл

@@ -0,0 +1,11 @@
package com.iformall.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestTimeout {
long value() default 10L; // 默认超时时间30秒
TimeUnit unit() default TimeUnit.SECONDS;
}

+ 39
- 0
mallinkAdmin/src/main/java/com/iformall/aop/TimeoutAspect.java Просмотреть файл

@@ -0,0 +1,39 @@
package com.iformall.aop;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import com.iformall.annotation.RequestTimeout;

@Aspect
@Component
public class TimeoutAspect {
@Around("@annotation(timeoutAnnotation)")
public Object handleTimeout(ProceedingJoinPoint joinPoint, RequestTimeout timeoutAnnotation) throws Throwable {
long timeout = timeoutAnnotation.value();
TimeUnit unit = timeoutAnnotation.unit();
// 提交任务并设置超时
CompletableFuture<Object> future = CompletableFuture.supplyAsync(() -> {
try {
return joinPoint.proceed();
} catch (Throwable e) {
throw new RuntimeException(e);
}
});
try {
return future.get(timeout, unit);
} catch (TimeoutException e) {
future.cancel(true); // 重要:取消正在执行的任务
// 可以记录日志或抛出特定异常
throw new RuntimeException("请求处理超时", e);
}
}
}

+ 3
- 1
mallinkAdmin/src/main/java/com/iformall/controller/market/WxVtwoPrizeDrawActivityController.java Просмотреть файл

@@ -3,6 +3,7 @@ package com.iformall.controller.market;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.iformall.annotation.ApiVersion;
import com.iformall.annotation.RequestTimeout;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
@@ -34,6 +35,7 @@ import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
* @author alascor
@@ -320,8 +322,8 @@ public class WxVtwoPrizeDrawActivityController extends BaseController {
@ApiVersion(group = SwaggerConstant.V_A_2_0)
@ApiOperation("活动发奖明细导出")
@GetMapping("/grantExport")
@RequestTimeout(value = 3000, unit = TimeUnit.SECONDS)
public void grantExport(@ModelAttribute WxVtwoActivityGrant activityGrant, HttpServletRequest request, HttpServletResponse response) {

if(activityGrant.getActivityId() == null){
throw new MallinkException(Result.ERROR,"活动ID 为空");
}


Загрузка…
Отмена
Сохранить