관리되는 예약 실행기 구성
태스크가 스케줄되는 스레드의 스레드 컨텍스트로 실행하는 비동기 태스크를 스케줄하도록 ManagedScheduledExecutorService 인스턴스를 구성할 수 있습니다. Java™ EE 애플리케이션을 위한 우수 사례는 자체 스레드를 직접 관리하지 못하게 하는 것이므로 ManagedScheduledExecutorService는 JSE ExecutorService를 확장하여 애플리케이션 서버 환경에서 비동기 태스크를 스케줄하는 방법을 제공합니다. 또한 Java EE 애플리케이션과 관련된 스레드 컨텍스트를 캡처하여 스케줄된 태스크의 스레드에 전파하도록 ManagedScheduledExecutorService를 구성할 수 있습니다.
이 태스크 정보
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
스레드 컨텍스트 캡처 및 전파는 컨텍스트 서비스에 의해 관리됩니다. 컨텍스트 서비스의 기본 인스턴스(DefaultContextService)는 서버에 의해 작성되고 최소한 classloaderContext, jeeMetadataContext 및 securityContext를 전파하도록 구성됩니다. 특정 컨텍스트 서비스 인스턴스를 참조하지 않거나 컨텍스트 서비스 인스턴스를 직접 내부에서 구성하지 않고 ManagedScheduledExecutorService가 작성되는 경우 이 기본 컨텍스트 서비스 인스턴스가 사용됩니다. 컨텍스트 서비스 인스턴스에 대한 자세한 정보는 스레드 컨텍스트 서비스 인스턴스 구성 주제를 참조하십시오.
기본 관리되는 예약 실행기 인스턴스(DefaultManagedScheduledExecutorService)는 java:comp/DefaultManagedScheduledExecutorService로 사용할 수 있으며 스레드 컨텍스트 캡처 및 전파를 위해 기본 컨텍스트 서비스 인스턴스를 사용합니다.
동시 정책은 최대 동시 및 최대 큐 크기와 같이 관리 스케줄된 실행기에 적용되는 동시 관련 동작 및 제한조건을 구성합니다.
기본적으로 관리 스케줄된 실행기는 바인드되지 않은 제한조건이 있는 concurrencyPolicy 구성 요소 기본 인스턴스
defaultConcurrencyPolicy를 사용합니다. 특정 concurrencyPolicy 요소를 중첩된 요소로 직접 구성하거나 이를 참조하지 않고 관리 스케줄된 실행기를 구성하는 경우 이 기본 동시 정책이 사용됩니다. 여러 관리 실행기 또는 기타 구성 요소가 동일한
concurrencyPolicy 요소를 참조하는 경우 해당 정책의 제한조건이 이러한 모든 관리 스케줄된 실행기 인스턴스와 기타 구성된 자원에 적용됩니다.
또한 LONGRUNNING_HINT 실행 특성 세트가 true로 설정된 태스크에 적용되는 장기 실행 태스크에 대한 동시 정책을 사용하여 관리 스케줄된 실행기를 구성할 수도 있습니다.
concurrencyPolicy 요소 및 장기 실행
concurrencyPolicy 요소에 지정된 구성은 제출된 태스크에 적용되어 가능한 한 빨리 실행되도록 합니다.
구성은 스케줄된 태스크에 적용되지 않습니다.
프로시저
server.xml 파일의 구성 예제:
예
@Resource를 사용하여 관리되는 예약 실행기를 애플리케이션 컴포넌트에 삽입하거나 자원 환경 참조(resource-env-ref)를 사용하여 검색하십시오. 인스턴스를 얻는 방법에 관계없이 인스턴스를 javax.enterprise.concurrent.ManagedScheduledExecutorService 또는 수퍼클래스 java.util.concurrent.ScheduledExecutorSerivce, java.util.concurrent.ExecutorService, javax.enterprise.concurrent.ManagedExecutorService로 교환하여 사용할 수 있습니다.
- 기본 관리되는 예약 실행기를 검색하는 예:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup( "java:comp/DefaultManagedScheduledExecutorService"); executor.schedule(beginSalePrices, 12, TimeUnit.HOURS); executor.schedule(restoreNormalPrices, 60, TimeUnit.HOURS);
- @Resource를 사용하여 java.util.concurrent.ScheduledExecutorService로 삽입하는 예제:
@Resource(lookup="concurrent/scheduledExecutor2") ScheduledExecutorService executor; ... // schedule a task to run every half hour from now Runnable updateSalesReport = new Runnable() { public void run() throws Exception { // java:comp lookup is possible because <jeeMetadataContext> is configured DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... query and update various database tables } }; ScheduledFuture<?> future = executor.scheduleAtFixedRate(updateSalesReport, 0, 30, TimeUnit.MINUTES);
- @Resource를 사용하여 javax.enterprise.concurrent.ManagedScheduledExecutorService로 삽입하는 예제:
@Resource(lookup="concurrent/scheduledExecutor2") ManagedScheduledExecutorService executor; ... usage is same as previous example
- web.xml 파일에서 java.util.concurrent.ScheduledExecutorService의
예제 <resource-env-ref>:
<resource-env-ref> <resource-env-ref-name>concurrent/scheduledExecutor1</resource-env-ref-name> <resource-env-ref-type>java.util.concurrent.ScheduledExecutorService</resource-env-ref-type> </resource-env-ref>
- web.xml 파일에서 javax.enterprise.concurrent.ManagedScheduledExecutorService의
예제 <resource-env-ref>:
<resource-env-ref> <resource-env-ref-name>concurrent/scheduledExecutor2</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ManagedScheduledExecutorService</resource-env-ref-type> </resource-env-ref>
- 자원 환경 참조를 사용하는 예제 검색:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup("java:comp/env/concurrent/scheduledExecutor2"); executor.schedule(payrollTask, fridaysAtMidnightTrigger);