This commit is contained in:
Anthony Stirling 2025-07-11 23:01:18 +01:00
parent ae3ed72283
commit 8a375c5da4
2 changed files with 22 additions and 41 deletions

View File

@ -10,8 +10,6 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*; import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; 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 org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@ -35,6 +33,7 @@ public class AutoJobAspect {
private static final Duration RETRY_BASE_DELAY = Duration.ofMillis(100); private static final Duration RETRY_BASE_DELAY = Duration.ofMillis(100);
private final JobExecutorService jobExecutorService; private final JobExecutorService jobExecutorService;
private final HttpServletRequest request;
private final FileOrUploadService fileOrUploadService; private final FileOrUploadService fileOrUploadService;
private final FileStorage fileStorage; private final FileStorage fileStorage;
@ -43,17 +42,8 @@ public class AutoJobAspect {
ProceedingJoinPoint joinPoint, AutoJobPostMapping autoJobPostMapping) { ProceedingJoinPoint joinPoint, AutoJobPostMapping autoJobPostMapping) {
// This aspect will run before any audit aspects due to @Order(0) // This aspect will run before any audit aspects due to @Order(0)
// Extract parameters from the request and annotation // Extract parameters from the request and annotation
boolean async = false; boolean async = Boolean.parseBoolean(request.getParameter("async"));
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); 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());
}
long timeout = autoJobPostMapping.timeout(); long timeout = autoJobPostMapping.timeout();
int retryCount = autoJobPostMapping.retryCount(); int retryCount = autoJobPostMapping.retryCount();
boolean trackProgress = autoJobPostMapping.trackProgress(); boolean trackProgress = autoJobPostMapping.trackProgress();
@ -287,14 +277,10 @@ public class AutoJobAspect {
private String getJobIdFromContext() { private String getJobIdFromContext() {
try { 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) { } catch (Exception e) {
log.debug("Could not retrieve job ID from context: {}", e.getMessage()); log.debug("Could not retrieve job ID from context: {}", e.getMessage());
}
return null; return null;
} }
} }
}

View File

@ -14,8 +14,6 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; 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 org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@ -32,6 +30,7 @@ public class JobExecutorService {
private final TaskManager taskManager; private final TaskManager taskManager;
private final FileStorage fileStorage; private final FileStorage fileStorage;
private final HttpServletRequest request;
private final ResourceMonitor resourceMonitor; private final ResourceMonitor resourceMonitor;
private final JobQueue jobQueue; private final JobQueue jobQueue;
private final ExecutorService executor = ExecutorFactory.newVirtualOrCachedThreadExecutor(); private final ExecutorService executor = ExecutorFactory.newVirtualOrCachedThreadExecutor();
@ -40,12 +39,14 @@ public class JobExecutorService {
public JobExecutorService( public JobExecutorService(
TaskManager taskManager, TaskManager taskManager,
FileStorage fileStorage, FileStorage fileStorage,
HttpServletRequest request,
ResourceMonitor resourceMonitor, ResourceMonitor resourceMonitor,
JobQueue jobQueue, JobQueue jobQueue,
@Value("${spring.mvc.async.request-timeout:1200000}") long asyncRequestTimeoutMs, @Value("${spring.mvc.async.request-timeout:1200000}") long asyncRequestTimeoutMs,
@Value("${server.servlet.session.timeout:30m}") String sessionTimeout) { @Value("${server.servlet.session.timeout:30m}") String sessionTimeout) {
this.taskManager = taskManager; this.taskManager = taskManager;
this.fileStorage = fileStorage; this.fileStorage = fileStorage;
this.request = request;
this.resourceMonitor = resourceMonitor; this.resourceMonitor = resourceMonitor;
this.jobQueue = jobQueue; this.jobQueue = jobQueue;
@ -99,10 +100,7 @@ public class JobExecutorService {
String jobId = UUID.randomUUID().toString(); String jobId = UUID.randomUUID().toString();
// Store the job ID in the request for potential use by other components // Store the job ID in the request for potential use by other components
try { if (request != null) {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attrs != null) {
HttpServletRequest request = attrs.getRequest();
request.setAttribute("jobId", jobId); request.setAttribute("jobId", jobId);
// Also track this job ID in the user's session for authorization purposes // Also track this job ID in the user's session for authorization purposes
@ -121,9 +119,6 @@ public class JobExecutorService {
log.debug("Added job ID {} to user session", 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 // Determine which timeout to use
long timeoutToUse = customTimeoutMs > 0 ? customTimeoutMs : effectiveTimeoutMs; long timeoutToUse = customTimeoutMs > 0 ? customTimeoutMs : effectiveTimeoutMs;