AsyncTaskExecutor를 통해 비동기 처리를 시작하는 동안 서버가 승인으로 응답하는 비동기 웹 서비스를 활용하는 애플리케이션에서는 다음과 같이 됩니다. 요청 범위를 활성화하는 것이 중요합니다. 이는 @Scope(WebApplicationContext.SCOPE_REQUEST)로 주석이 달린 Bean 클래스에 액세스하는 데 필수적입니다.
일반적으로 이러한 시나리오에서는 DispatcherServlet 외부에서 작동하는 SimpleAsyncTaskExecutor 내에서 요청 범위가 활성화되지 않아 예외가 발생합니다. . 이 문제를 해결하려면 다음 솔루션을 고려하십시오.
참고: 이 접근 방식은 보안 컨텍스트(예: Spring Security)가 아닌 세션 및 요청 범위 Bean만 지원합니다. . 보안 컨텍스트 처리를 위해서는 별도의 조치를 구현해야 합니다.
구현 예:
Executor:
<code class="java">public class ContextAwarePoolExecutor extends ThreadPoolTaskExecutor { @Override public <T> Future<T> submit(Callable<T> task) { return super.submit(new ContextAwareCallable(task, RequestContextHolder.currentRequestAttributes())); } }</code>
호출 가능:
<code class="java">public class ContextAwareCallable<T> implements Callable<T> { private Callable<T> task; private RequestAttributes context; @Override public T call() throws Exception { if (context != null) { RequestContextHolder.setRequestAttributes(context); } try { return task.call(); } finally { RequestContextHolder.resetRequestAttributes(); } } }</code>
구성:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
위 내용은 비동기 작업 실행에서 요청 범위를 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!