Я последовал за этим и создал Executor, Callable и ExecutorConfig точно так, как описано в ответе. Теперь я начал получать объект HttpServletRequest в коде AOP, но объект ничего не содержит. например, request.getRequestURI () дает значение NULL.
В моем коде AOP мне просто нужно прочитать объекты Throwable и HttpServletRequest для хранения информации об ошибках и некоторых важных заголовков запросов вместе с URI в таблице.
Вот мой код AOP -
@Aspect
@Component
public class ErrorAspect {
private static final String EXCEPTION_EXECUTION_PATH = "execution(* com.myproject.*.service.impl.*.*(..))";
@Autowired
private ErrorHelper errorHelper;
@Pointcut( EXCEPTION_EXECUTION_PATH)
public void atExecutionExcpetion() {
}
@AfterThrowing( value = "atExecutionExcpetion()", throwing = "error")
public void storeErrorAfterThrowing( Throwable error) {
errorHelper.saveError(error);
}
}
И метод saveError () в ErrorHelper - -
public void saveError( Throwable error) {
HttpServletRequest request = null;
if (RequestContextHolder.getRequestAttributes() != null) {
request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
}
Error error = prepareError(request, error);
CompletableFuture.runAsync(() -> insertError(error));
}
private Error prepareError( HttpServletRequest request, Throwable error) {
Error error = new Error();
if (request == null) {
String process = Constants.AUTO_JOB + LocalDateTime.now(ZoneId.of(PST_ZONE_ID)).toString().replaceAll("-", "");
error.setProcessType(Constants.AUTO_JOB);
error.setApplicationId(process);
error.setSessionId(process);
error.setUri(NA);
} else {
error.setProcessType(request.getHeader(Constants.PROCESS_ID));
error.setApplicationId(request.getHeader(Constants.APPLICATION_ID));
error.setSessionId(request.getHeader(Constants.SESSION_ID));
error.setUri(request.getRequestURI());
}
error.setEventDateTime(Instant.now());
error.setErrorType(getErrorType(error));
error.setErrorMessage(getErrorMessage(error));
return error;
}
Это прекрасно работает с синхронными вызовами. Но для вызовов @Async в объекте запроса нет информации заголовка / uri.