비동기 작업 실행에서 요청 범위 활성화
문제:
비동기 웹 서비스는 다음을 수행해야 합니다. 비동기 처리 내에서 요청 범위 Bean, 특히 @Scope(value = WebApplicationContext.SCOPE_REQUEST)로 주석이 달린 Bean에 액세스합니다. 그러나 SimpleAsyncTaskExecutor는 스레드 바인딩된 요청 속성을 유지하지 않으므로 예외가 발생합니다.
해결책:
비동기 작업 실행에서 요청 범위를 활성화하려면 사용자 지정 TaskPoolExecutor가 생성됩니다. 백그라운드 스레드에 대한 요청 컨텍스트를 저장하고 지우는 특수 Callable과 함께.
구현:
Custom 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; 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>
구성 재정의:
<code class="java">@Configuration public class ExecutorConfig extends AsyncConfigurerSupport { @Override @Bean public Executor getAsyncExecutor() { return new ContextAwarePoolExecutor(); } }</code>
사용:
<code class="java">taskExecutor.execute(new ContextAwareCallable(new Runnable() { @Override public void run() { asyncRequest(request); } }), RequestContextHolder.currentRequestAttributes());</code>
참고:
위 내용은 비동기 작업 실행에서 요청 범위를 활성화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!