스레드 컨텍스트 서비스 인스턴스 구성
관리 스레드 컨텍스트를 캡처하여 스레드에서 지정된 인터페이스 메소드의 호출에 적용하도록 ContextService 인스턴스를 구성할 수 있습니다.
이 태스크 정보
기본 스레드 컨텍스트 서비스 인스턴스(DefaultContextService)가 서버에 의해 작성되어 최소한 classloaderContext, jeeMetadataContext 및 securityContext 요소를 캡처하고 전파하도록 구성됩니다. 다음과 같은 유형의 스레드 컨텍스트를 포함하도록 스레드 컨텍스트 전파를 구성할 수 있습니다.
- classloaderContext
- 태스크 제출자의 클래스 로더가 태스크에 사용 가능하도록 만듭니다. 컨텍스트 클래스 로더가 직렬화된 경우 이 클래스 로더는 애플리케이션의 스레드 컨텍스트 클래스 로더여야 합니다. OSGi 웹 애플리케이션 번들(WAB)에 대한 클래스 로더 직렬화는 현재 지원되지 않습니다.
- jeeMetadataContext
- 태스크를 제출한 애플리케이션 컴포넌트의 네임스페이스를 태스크에 사용 가능하도록 만듭니다.
- securityContext
- 이 유형의 스레드 컨텍스트를 사용하려면 server.xml 파일에서 appSecurity-2.0 기능을 사용으로 설정해야 합니다. 태스크 제출자의 호출자 주제 및 호출 주제를 태스크에 사용 가능하도록 만듭니다. 이것은 JAAS 로그인 모듈을 사용하여 제출자의 WSPrincipal 신임 정보로 로그인하여 수행됩니다. 제출자의 주제에 있는 정보 중 보안 컨텍스트에 없는 정보에 대한 세부사항은 concurrent-1.0 기능 제한사항을 참조하십시오.

- syncToOSThreadContext
- 작업 단위에 대한 runAs 주제의 ID를 운영 체제 ID와 동기화합니다.

- zosWLMContext
- 작업을 분류하는 데 사용됩니다.
프로시저
server.xml 파일에서 스레드 컨텍스트 서비스를 사용으로 설정하십시오.
스레드 컨텍스트 서비스는 <concurrent-1.0> 기능 아래에서 사용할 수 있습니다.
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
예
server.xml 파일에서 스레드 컨텍스트 서비스 인스턴스 구성:
- jeeMetadataContext만 캡처하여 전파하는
concurrent/threadContextSvc1이라는 이름으로 JNDI에서
등록되는 스레드 컨텍스트 서비스:
<contextService id="threadContextSvc1" jndiName="concurrent/${id}"> <jeeMetadataContext/> </contextService>
- classloaderContext 및 securityContext가 포함된 스레드 컨텍스트 서비스:
<contextService jndiName="concurrent/threadContextSvc2"> <classloaderContext/> <securityContext/> </securityContext/>
- threadContextSvc1에서 jeeMetadataContext를 상속하고
securityContext를 추가하는 스레드 컨텍스트 서비스:
<contextService jndiName="concurrent/threadContextSvc3" baseContextRef="threadContextSvc1"> <securityContext> </contextService>
기본 컨텍스트 서비스를 검색하는 예:
ContextService threadContextSvc =
(ContextService) new InitialContext().lookup(
"java:comp/DefaultContextService");
myContextualAsyncCallback = threadContextSvc.createContextualProxy(
myAsyncCallback, MyAsyncCallback.class);
doSomethingAsync(arg1, arg2, myContextualAsyncCallback);
@Resource를 사용하여 스레드 컨텍스트 서비스 인스턴스를 애플리케이션 컴포넌트에 삽입하거나 자원 환경 참조(resource-env-ref)를 사용하여 검색하는 예제
- @Resource를 사용하는 예제:
@Resource(lookup="concurrent/threadContextSvc1") ContextService threadContextSvc1; ... Callable<Integer> processSalesOrderCompletion = new Callable<Integer>() { public Integer call() throws Exception { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ...update various database tables return isSuccessful; } }; // capture thread context of current application component execProps = Collections.singletonMap(ManagedTask.TRANSACTION, ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD); processSalesOrderCompletion = (Callable<Boolean>) threadContextSvc1.createContextualProxy(processSaleCompletion, execProps, Callable.class); //later from a different application component tran.begin(); ... successful = processSalesOrderCompletion.call(); if (successful) tran.commit();else tran.rollback();
- web.xml 파일에서 resource-env-ref를 지정하는 예:
<resource-env-ref> <resource-env-ref-name>concurrent/threadContextSvc3</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ContextService</resource- env-ref-type> </resource-env-ref>
- 자원 환경 참조를 사용하는 예제 검색:
ContextService threadContextSvc3 = (ContextService) new InitialContext().lookup("java:comp/env/concurrent/threadContextSvc3"); Runnable updateAndGetNextFromDatabase = threadContextSvc3.createContextualProxy (new Runnable() { public void run() { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... update the database and get next item to process } }, Runnable.class); barrier = new CyclicBarrier(3, updateAndGetNextFromDatabase); ...