ManagedExecutorService 인스턴스 구성
지정된 스레드 컨텍스트로 비동기 태스크를 실행하도록 ManagedExecutorService 인스턴스를 구성할 수 있습니다. 자체 스레드를 직접 관리하는 것을 피하는 것이 Java™ EE 애플리케이션을 위한 우수 사례입니다. 그러므로 ManagedExecutorService는 JSE ExecutorService를 확장하여 애플리케이션 서버 환경 안에서 비동기 태스크를 시작하는 방법을 제공합니다. 또한 Java EE 애플리케이션과 연관된 다양한 스레드 컨텍스트를 비동기 태스크의 스레드로 전파하도록 ManagedExecutorService를 구성할 수도 있습니다.
이 태스크 정보
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
ManagedExecutorService에 의해 실행되는 태스크의 스레드로의 컨텍스트 전파는 컨텍스트 서비스에 의해 관리됩니다. 컨텍스트 서비스의 기본 인스턴스(DefaultContextService)는 서버에 의해 작성되고 최소한 classloaderContext, jeeMetadataContext 및 securityContext를 전파하도록 구성됩니다. 이 기본 컨텍스트 서비스 인스턴스는 특정 컨텍스트 서비스 인스턴스를 참조하지 않거나 컨텍스트 서비스 인스턴스를 그 안에서 직접 구성하지 않고 ManagedExecutorService가 작성되는 경우에 사용됩니다. 자세한 정보는 스레드 컨텍스트 인스턴스 구성 주제를 참조하십시오.
기본 관리 대상 실행기 인스턴스(DefaultManagedExecutorService)는 java:comp/DefaultManagedExecutorService로서 사용 가능하며 스레드 컨텍스트 캡처 및 전파를 위해 기본 컨텍스트 서비스 인스턴스를 사용합니다.
프로시저
server.xml 파일의 구성 예제:
예
관리 대상 실행기 서비스된 인스턴스는 애플리케이션 컴포넌트에 삽입되거나(@Resource 사용) 자원 환경 참조로 검색(resource-env-ref)할 수 있습니다. 인스턴스를 얻는 방법과 상관없이, 인스턴스를 javax.enterprise.concurrent.ManagedExecutorService 또는 그의 java.util.concurrent.ExecutorSerivce 수퍼클래스로서 교대로 사용할 수 있습니다.
- @Resource를 사용하여 java.util.concurrent.ExecutorService로서 삽입하는 예제:
@Resource(lookup="concurrent/execSvc1") ExecutorService execSvc1; ... // submit task to run Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // java:comp lookup is possible because <jeeMetadataContext> is configured DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... make updates to the database return updateCount; } }); Future<Integer> future2 = execSvc1.submit(anotherTaskThatUpdatesADatabase); numUpdatesCompleted = future1.get() + future2.get();
- @Resource를 사용하여 javax.enterprise.concurrent.ManagedExecutorService로서 삽입하는 예제:
@Resource(lookup="concurrent/execSvc1") ManagedExecutorService execSvc1; ... // submit task to run Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // java:comp lookup is possible because <jeeMetadataContext> is configured DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... make updates to the database return updateCount; } }); Future<Integer> future2 = execSvc1.submit(anotherTaskThatUpdatesADatabase); numUpdatesCompleted = future1.get() + future2.get();
- web.xml 파일에 있는 java.util.concurrent.ExecutorService에
대한 예제 <resource-env-ref>:
<resource-env-ref> <resource-env-ref-name>concurrent/execSvc2</resource-env-ref-name> <resource-env-ref-type>java.util.concurrent.ExecutorService</resource-env-ref-type> </resource-env-ref>
- web.xml 파일에 있는 javax.enterprise.concurrent.ManagedExecutorService에
대한 예제 <resource-env-ref>:
<resource-env-ref> <resource-env-ref-name>concurrent/execSvc2</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ManagedExecutorService</resource-env-ref-type> </resource-env-ref>
- 자원 환경 참조를 사용하는 예제 검색입니다.
ExecutorService execSvc2 = (ExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));
- 자원 환경 참조를 사용하고 ManagedExecutorService에
캐스트하는 검색 예제:
ManagedExecutorService execSvc2 = (ManagedExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));