diff --git a/common/src/main/java/stirling/software/common/aop/AutoJobAspect.java b/common/src/main/java/stirling/software/common/aop/AutoJobAspect.java index 4e9007c27..9f01c4558 100644 --- a/common/src/main/java/stirling/software/common/aop/AutoJobAspect.java +++ b/common/src/main/java/stirling/software/common/aop/AutoJobAspect.java @@ -10,8 +10,6 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletRequest; @@ -35,6 +33,7 @@ public class AutoJobAspect { private static final Duration RETRY_BASE_DELAY = Duration.ofMillis(100); private final JobExecutorService jobExecutorService; + private final HttpServletRequest request; private final FileOrUploadService fileOrUploadService; private final FileStorage fileStorage; @@ -43,17 +42,8 @@ public class AutoJobAspect { ProceedingJoinPoint joinPoint, AutoJobPostMapping autoJobPostMapping) { // This aspect will run before any audit aspects due to @Order(0) // Extract parameters from the request and annotation - boolean async = false; - try { - ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attrs != null) { - HttpServletRequest request = attrs.getRequest(); - async = Boolean.parseBoolean(request.getParameter("async")); - log.debug("AutoJobAspect: Processing {} {} with async={}", request.getMethod(), request.getRequestURI(), async); - } - } catch (Exception e) { - log.debug("Could not retrieve async parameter from request: {}", e.getMessage()); - } + boolean async = Boolean.parseBoolean(request.getParameter("async")); + log.debug("AutoJobAspect: Processing {} {} with async={}", request.getMethod(), request.getRequestURI(), async); long timeout = autoJobPostMapping.timeout(); int retryCount = autoJobPostMapping.retryCount(); boolean trackProgress = autoJobPostMapping.trackProgress(); @@ -287,14 +277,10 @@ public class AutoJobAspect { private String getJobIdFromContext() { try { - ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attrs != null) { - HttpServletRequest request = attrs.getRequest(); - return (String) request.getAttribute("jobId"); - } + return (String) request.getAttribute("jobId"); } catch (Exception e) { log.debug("Could not retrieve job ID from context: {}", e.getMessage()); + return null; } - return null; } } diff --git a/common/src/main/java/stirling/software/common/service/JobExecutorService.java b/common/src/main/java/stirling/software/common/service/JobExecutorService.java index b95eedeaf..73afa22a0 100644 --- a/common/src/main/java/stirling/software/common/service/JobExecutorService.java +++ b/common/src/main/java/stirling/software/common/service/JobExecutorService.java @@ -14,8 +14,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletRequest; @@ -32,6 +30,7 @@ public class JobExecutorService { private final TaskManager taskManager; private final FileStorage fileStorage; + private final HttpServletRequest request; private final ResourceMonitor resourceMonitor; private final JobQueue jobQueue; private final ExecutorService executor = ExecutorFactory.newVirtualOrCachedThreadExecutor(); @@ -40,12 +39,14 @@ public class JobExecutorService { public JobExecutorService( TaskManager taskManager, FileStorage fileStorage, + HttpServletRequest request, ResourceMonitor resourceMonitor, JobQueue jobQueue, @Value("${spring.mvc.async.request-timeout:1200000}") long asyncRequestTimeoutMs, @Value("${server.servlet.session.timeout:30m}") String sessionTimeout) { this.taskManager = taskManager; this.fileStorage = fileStorage; + this.request = request; this.resourceMonitor = resourceMonitor; this.jobQueue = jobQueue; @@ -99,30 +100,24 @@ public class JobExecutorService { String jobId = UUID.randomUUID().toString(); // Store the job ID in the request for potential use by other components - try { - ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attrs != null) { - HttpServletRequest request = attrs.getRequest(); - request.setAttribute("jobId", jobId); + if (request != null) { + request.setAttribute("jobId", jobId); - // Also track this job ID in the user's session for authorization purposes - // This ensures users can only cancel their own jobs - if (request.getSession() != null) { - @SuppressWarnings("unchecked") - java.util.Set userJobIds = - (java.util.Set) request.getSession().getAttribute("userJobIds"); + // Also track this job ID in the user's session for authorization purposes + // This ensures users can only cancel their own jobs + if (request.getSession() != null) { + @SuppressWarnings("unchecked") + java.util.Set userJobIds = + (java.util.Set) request.getSession().getAttribute("userJobIds"); - if (userJobIds == null) { - userJobIds = new java.util.concurrent.ConcurrentSkipListSet<>(); - request.getSession().setAttribute("userJobIds", userJobIds); - } - - userJobIds.add(jobId); - log.debug("Added job ID {} to user session", jobId); + if (userJobIds == null) { + userJobIds = new java.util.concurrent.ConcurrentSkipListSet<>(); + request.getSession().setAttribute("userJobIds", userJobIds); } + + userJobIds.add(jobId); + log.debug("Added job ID {} to user session", jobId); } - } catch (Exception e) { - log.debug("Could not store job ID in request context: {}", e.getMessage()); } // Determine which timeout to use