>  기사  >  Java  >  비동기 작업 실행에서 요청 범위를 활성화하는 방법은 무엇입니까?

비동기 작업 실행에서 요청 범위를 활성화하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-31 02:31:02554검색

How to Enable Request Scope in Asynchronous Task Execution?

비동기 작업 실행에서 요청 범위 활성화

문제:

비동기 웹 서비스는 다음을 수행해야 합니다. 비동기 처리 내에서 요청 범위 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.