비동기 작업 실행에서 요청 범위를 유지하는 방법
웹 애플리케이션에서는 Bean을 사용해야 하는 비동기 작업을 수행하는 것이 일반적입니다. 요청 범위가 있습니다. 비동기 작업 실행에서 요청 범위를 활성화하려면 사용자 지정 작업 실행기를 구현하면 됩니다.
문제:
AsyncTaskExecutor에서 처리를 시작하는 비동기 웹 서비스가 있습니다. 그러나 이 처리 내에서 @Scope(value = WebApplicationContext.SCOPE_REQUEST, ProxyMode = ScopedProxyMode.TARGET_CLASS)로 주석이 달린 클래스에 액세스해야 합니다. 그러나 요청 범위가 SimpleAsyncTaskExecutor에서 활성화되어 있지 않기 때문에 예외가 발생합니다.
해결책:
비동기 작업 실행에서 요청 범위를 활성화하려면 다음을 구현합니다. 다음 단계:
사용자 정의 TaskExecutor 만들기:
<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; public ContextAwareCallable(Callable<T> task, RequestAttributes context) { this.task = task; this.context = context; } @Override public T call() throws Exception { if (context != null) { RequestContextHolder.setRequestAttributes(context); } try { return task.call(); } finally { RequestContextHolder.resetRequestAttributes(); } } }</code>
Custom TaskExecutor 구성:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
설명 :
ContextAwarePoolExecutor는 제출된 작업을 가로채서 ContextAwareCallable 인스턴스에 래핑합니다. 이러한 콜러블은 실제 작업을 실행하기 전에 현재 요청 컨텍스트를 설정하고 나중에 재설정합니다. 이렇게 하면 비동기 실행 중에 요청 범위 Bean에 액세스할 수 있습니다.
참고:
위 내용은 비동기 작업 실행 내에서 요청 범위 Bean에 액세스하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!