diff --git a/mallinkAdmin/src/main/java/com/iformall/annotation/RequestTimeout.java b/mallinkAdmin/src/main/java/com/iformall/annotation/RequestTimeout.java new file mode 100644 index 000000000..cf107382a --- /dev/null +++ b/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; +} diff --git a/mallinkAdmin/src/main/java/com/iformall/aop/TimeoutAspect.java b/mallinkAdmin/src/main/java/com/iformall/aop/TimeoutAspect.java new file mode 100644 index 000000000..13b2b452d --- /dev/null +++ b/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 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); + } + } +} diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxVtwoPrizeDrawActivityController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxVtwoPrizeDrawActivityController.java index 29eb43d8d..e022714d1 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxVtwoPrizeDrawActivityController.java +++ b/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 为空"); }