작업 관리자는 Java™
EE(Java Platform, Enterprise Edition) 애플리케이션에 스레딩을 제공합니다.
관리 콘솔을 사용하여 관리자는 여러 작업 관리자를
구성할 수 있습니다. 관리자는 작업 관리자에 제출된 태스크에 대한
Java EE
컨텍스트 상속 정책을 포함하는 작업 관리자의 특성을 지정합니다. 관리자는 각각의 작업 관리자를 JNDI(Java
Naming and Directory Interface)의 고유 위치에 바인드합니다.다음 인터페이스 중 하나에서 작업 관리자 오브젝트를 사용할 수 있습니다.
- 관리 대상 실행자
- javax.enterprise.concurrent.ManagedExecutorService
- javax.enterprise.concurrent.ManagedScheduledExecutorService
- java.util.concurrent.ExecutorService
- java.util.concurrent.ScheduledExecutorService
- 스레드 팩토리
- javax.enterprise.concurrent.ManagedThreadFactory
- java.util.concurrent.ThreadFactory
- 스레드 컨텍스트 서비스
- javax.enterprise.concurrent.ContextService
- 비동기 Bean
- com.ibm.websphere.asynchbeans.WorkManager
- CommonJ 작업 관리자
선택된 인터페이스 유형은 자원 환경 참조에 지정하는 값을 기반으로 JNDI 검색 시간 동안 해결됩니다.
작업 관리자는 Java
EE 애플리케이션에 프로그래밍 모델을 제공합니다. 자세한 정보는 프로그래밍 모델 섹션을 참조하십시오.
문제점 방지: javax.resource.spi.work.WorkManager
클래스는 JCA(Java EE Connector Architecture) 자원 어댑터에서 사용하는
Java 인터페이스입니다. WorkManager의 실제 구현이 아니며, Java EE 애플리케이션에 의해 사용됩니다.
gotcha
Java EE 또는 비동기 Bean에 대해 동시성 유틸리티를 사용하는 EJB(Enterprise JavaBeans) 컴포넌트 또는 웹을 작성 중일 때,
개발자는 관리 대상 실행기, 스레드 팩토리, 컨텍스트 서비스 또는 작업 관리자에 대한 액세스 권한이 필요한
각 컴포넌트에 자원 환경 참조를 포함해야 합니다.
자원 참조에 대한 자세한 정보는 참조 주제를 참조하십시오. 컴포넌트는
데이터 소스, 엔터프라이즈 Bean 또는 연결 팩토리를 찾는 것과
같이 컴포넌트 java: comp 네임스페이스에서 로컬 이름을 사용하는 관리 대상 실행기, 스레드 팩토리, 컨텍스트 서비스 또는 작업 관리자를
검색합니다.
배치자는 애플리케이션이 배치될 때 실제 작업 관리자를 논리 자원 환경 참조(관리 대상 실행기, 스레드 팩토리,
컨텍스트 서비스 또는 작업 관리자)에 바인드합니다.
예를 들어 개발자가 금, 은, 동 레벨 사이의 작업을 파티션하기 위해
세 가지의 스레드 풀을 필요로 하는 경우 개발자는 클라이언트 애플리케이션의
프로파일에 있는 속성에 준한 논리 풀을 선택하기 위한 컴포넌트를 씁니다.
배치자는 세 스레드 풀에 대해 이러한 요청을 맵핑하는 방법을 결정하는 데
유연성을 가지고 있습니다. 배치자는 작은 시스템에 단일 스레드 풀을 사용할 것을
결정할 수도 있습니다. 이러한 경우 개발자는 모든 세 자원 참조를 동일한 작업
관리자 인터페이스(즉, 동일한 JDNI 이름)에 바인드합니다. 대형 시스템은 세 가지
스레드 풀을 지원할 수도 있으므로 배치자는 각각의 자원 참조를 다른
작업 관리자에 바인드합니다. 작업 관리자는 동일한 서버에 설치되어 있는 여러 Java EE 애플리케이션 사이에서 공유될 수 있습니다.
애플리케이션 개발자는 필요한 경우 여러 논리 자원 환경 참조로서 사용할 수 있습니다.
배치자는 하나의 실제 작업 관리자 또는 여러 작업 관리자를 애플리케이션에 정의된
논리 관리 대상 실행기, 스레드 팩토리, 컨텍스트 서비스 또는 작업 관리자에 맵핑할 것인지를 선택합니다.
비동기 범위 오브젝트를 공유해야 하는 모든 Java EE
컴포넌트는 동일한 작업 관리자를 사용해야 합니다. 이러한 범위 오브젝트는 단일 작업 관리자와 친화력이 있습니다.
비동기 범위를 사용하는 애플리케이션은 범위 오브젝트를 사용하는
모든 컴포넌트가 동일한 작업 관리자를 사용하는지 확인해야 합니다.
여러 작업 관리자가 정의되어 있는 경우, 해당
JVM(Java Virtual Machine)
내에서 애플리케이션이 작업 관리자를 찾아볼 때만 JVM에 기본 스레드 풀이 작성됩니다. 예를 들어,
10개의 스레드 풀(작업 관리자)이 정의되어 있지만, 애플리케이션이 이러한
풀을 찾을 때까지는 실제로 작성되는 스레드 풀은 없습니다.
중요사항: 작업 관리자는 원격 JVM에 대한 작업 제출을 지원하지 않습니다.
CommonJ 작업 관리자
CommonJ 작업 관리자에는 비동기 Bean 작업 관리자 메소드의 서브세트를 포함합니다.
CommonJ 작업 관리자가 Java EE 환경에서 기능하더라도, 이 스펙이 Java EE 스펙에 포함되지 않으므로
인터페이스는 각 JNDI 네이밍 검색에 대해 새 인스턴스를 리턴하지 않습니다.
원격으로 실행 중인 작업의 CommonJ 작업 스펙 선택적 기능은 지원되지 않습니다. 작업 단위가
java.io.Serializable 인터페이스를 구현하는 경우에도, 작업 단위는 원격으로
실행하지 않습니다.
관리 대상 실행기를 검색하는 방법
애플리케이션은 다음과 같이
관리 대상 실행기를 검색할 수 있습니다. 다음은 컴포넌트가 전개될 때
실제 작업 관리자에 바인드된
concurrent/myExecutor라는 이름의 자원 환경 참조를 포함합니다.
InitialContext ic = new InitialContext();
ManagedExecutorService executor = (ManagedExecutorService) ic.lookup("java:comp/env/concurrent/myExecutor");
상속 Java EE
컨텍스트
관리 대상 실행기와 작업 관리자에 제출된 태스크는 제출 스레드로부터 다음 Java
EE 컨텍스트를 상속받을 수 있습니다. 컨텍스트상 프록시는 컨텍스트상 프록시를 작성하기 위해 컨텍스트 서비스를 호출하는 스레드로부터 이런 종류의 컨텍스트를 상속받을 수
있습니다. 관리된 스레드 팩토리 스레드는 관리된 스레드 팩토리를 검색하거나 삽입하는 스레드로부터 이런 유형의 컨텍스트를 상속받을 수 있습니다.
- 글로벌 컨텍스트
- 이 옵션이 선택되고 국제화 서비스가 사용 가능으로 설정되면
스케줄링 스레드에 존재하는 국제화 컨텍스트를 대상 스레드에서 사용 가능합니다.
- 작업 영역
- 이 업션이 선택되면 스케줄링 스레드에 존재하는 모든 작업 영역 파티션의
작업 영역 컨텍스트를 대상 스레드에서 사용 가능합니다.
- 애플리케이션 프로파일 (제공되지 않음)
- 애플리케이션 프로파일 컨텍스트는 지원되지 않고 대부분의 애플리케이션에 사용 가능하지 않습니다. Java EE
1.3 애플리케이션의 경우, 이 옵션을 선택하면 애플리케이션 프로파일 서비스가 사용 가능해지고
애플리케이션 프로파일 서비스 특성인 5.x 호환성 모드가 선택됩니다. 스케줄링 스레드와 연관된
애플리케이션 프로파일 태스크는 Java EE 1.3
애플리케이션에 대한 대상 스레드에서 사용 가능합니다. Java
EE 1.4 이상 애플리케이션의 경우, 애플리케이션 프로파일 태스크는 스레드보다 작업의 해당 연관된 장치의
특성입니다. 이 옵션은 Java
EE 1.4 이상 애플리케이션에서 태스크의 동작에는 영향을 미치지 않습니다. Java
EE 1.4 애플리케이션에서 실행되는 스케줄링된 작업은 스케줄링 스레드의 프로파일링 태스크를 수신하지 않습니다.
- 보안
- 태스크는 익명으로 실행될 수 있거나 이를 작성하고 제출한 스레드에 인증된 클라이언트로서 실행될 수 있습니다. 이 작동은 태스크가 호출자가 수행할 수 있는 것만 수행할 수 있으므로 유용합니다. 예를 들면, 이 조치는 RUN_AS 메커니즘 보다 더 유용하며, 이런 종류의 동작을 방지합니다. 보안 옵션이 선택되면 스케줄링 스레드에 존재하는
JAAS 주제를 대상 스레드에서 사용 가능합니다.
선택하지 않은 경우, 스레드는 익명으로 실행합니다.
- 컴포넌트 메타데이터
- 태스크가 단순한 Java
오브젝트일 때만 컴포넌트 메타데이터가 적절합니다. 태스크가 엔터프라이즈 Bean과 같은 Java
EE 컴포넌트인 경우, 컴포넌트 메타데이터가 활성화됩니다.
상속될 수 있는 컨텍스트는 작업 관리자에 따라 다르고, 태스크를 작성하고 제출하는 애플리케이션에 의해 사용됩니다. 관리 콘솔을 사용하여 관리자는 작업 관리자를 사용 가능하게 만드는 서비스를 선택하여 작업 관리자의 sticky 컨텍스트를
정의합니다.
동시성 예
표 1. 관리 대상 실행기 또는 작업 관리자 검색관리 대상 실행기 |
비동기 Bean |
CommonJ |
InitialContext ctx = new InitialContext();
ManagedExecutorService executor =
(ManagedExecutorService)
ctx.lookup("java:comp/env/wm/myWorkMgr");
|
InitialContext ctx = new InitialContext();
com.ibm.websphere.asynchbeans.WorkManager wm =
(com.ibm.websphere.asynchbeans.WorkManager)
ctx.lookup(“java:comp/env/wm/MyWorkMgr”);
|
InitialContext ctx = new InitialContext();
commonj.work.WorkManager wm =
(commonj.work.WorkManager)
ctx.lookup(“java:comp/env/wm/MyWorkMgr”);
|
표 2. 사용자 태스크 작성관리 대상 실행기 |
비동기 Bean |
CommonJ |
public class MyWork implements Callable<Integer> {
public Integer call() {
System.out.println(“Running.....”);
return 1;
}
}
|
public class MyWork implements
com.ibm.websphere.asynchbeans.Work {
public void release() {
......
}
public void run() {
System.out.println(“Running.....”);
}
|
public class MyWork implements
commonj.work.Work{
public boolean isDaemon() {
return false;
}
public void release () {
.....
}
public void run () {
System.out.println(“Running.....”);
}
|
표 3. 태스크 제출관리 대상 실행기 |
비동기 Bean |
CommonJ |
MyWork work1 = new MyWork();
MyWork work2 = new MyWork();
// case 1: block until all items are done
Collection<MyWork> tasks =
Arrays.asList(work1, work2);
List<Future<Integer>> futures =
executor.invokeAll(tasks);
for (Future<Integer> future : futures)
System.out.println("work data=" + future.get());
//case 2: wait up to 1000 milliseconds for any of the items to complete.
Integer result = executor.invokeAny(
tasks, 1, TimeUnit.SECONDS);
System.out.println("work data=" + result);
|
MyWork work1 = new MyWork();
MyWork work2 = new MyWork();
WorkItem item1;
WorkItem item2;
Item1=wm.startWork(work1);
Item2=wm.startWork(work2);
// case 1: block until all items are done
ArrayList col1 = new ArrayList();
Col1.add(item1);
Col1.add(item2);
wm.join(col1, WorkManager.JOIN_AND, WorkManager.INDEFINITE);
// when the works are done
System.out.println(“work1 data=”+work1.getData());
System.out.println(“work2 data=”+work2.getData());
// you should complete case 1 before case 2
//case 2: wait up to 1000 milliseconds for any of the items to complete.
Boolean ret = wm.join(col1, WorkManager.JOIN_OR, 1000);
|
MyWork work1 = new MyWork();
MyWork work2 = new MyWork();
WorkItem item1;
WorkItem item2;
Item1=wm.schedule(work1 );
Item2=wm.schedule(work2);
// case 1: block until all items are done
Collection col1 = new ArrayList();
col1.add(item1);
col1.add(item2);
wm.waitForAll(col1, WorkManager.INDEFINITE);
// when the works are done
System.out.println(“work1 data=”+work1.getData());
System.out.println(“work2 data=”+work2.getData());
// you should complete case 1 before case 2
//case 2: wait up to 1000 milliseconds for any of the items to complete.
Collection finished = wm.waitForAny(col1,1000);
// check the workItems status
if (finished != null) {
Iterator I = finished.iterator();
if (i.hasNext()) {
WorkItem wi = (WorkItem) i.next();
if (wi.equals(item1)) {
System.out.println(“work1 =
“+ work1.getData());
} else if (wi.equals(item2)) {
System.out.println(“work1 =
“+ work1.getData());
}
}
}
|
표 4. 관리 대상 스케줄된 실행기, 알람 관리자 또는 타이머 관리자 작성관리 대상 스케줄된 실행기 |
비동기 Bean |
CommonJ |
InitialContext ctx = new InitialContext();
ManagedScheduledExecutorService executor =
(ManagedScheduledExecutorService)
ctx.lookup("java:comp/env/wm/MyWorkMgr");
|
InitialContext ctx = new InitialContext();
com.ibm.websphere.asynchbeans.WorkManager wm =
(com.ibm.websphere.asynchbeans.WorkManager)
ctx.lookup(“java:comp/env/wm/MyWorkMgr”);
AsynchScope ascope;
Try {
Ascope = wm.createAsynchScope(“ABScope”);
} Catch (DuplicateKeyException ex)
{
Ascope = wm.findAsynchScope(“ABScope”);
ex.printStackTrace();
}
// get an AlarmManager
AlarmManager aMgr= ascope.getAlarmManager();
|
InitialContext ctx = new InitialContext();
Commonj.timers.TimerManager tm =
(commonj.timers.TimerManager)
ctx.lookup(“java:comp/env/tm/MyTimerManager”);
|
표 5. 태스크, 알람 또는 타이머 스케줄링관리되는 스케줄된 실행자 |
비동기 Bean |
CommonJ |
// create task
Runnable task = new StockQuoteTask(
“qqq”, “johndoe@example.com”);
ScheduledFuture<?> future =
executor.schedule(task, 1, TimeUnit.MINUTES);
// Fixed-delay: schedule task to run
// 1 minute from now and repeat every
// hour thereafter.
ScheduledFuture<?> future =
executor.scheduleWithFixedDelay(
task, 1, 60, TimeUnit.MINUTES);
// Fixed-rate: schedule timer to expire
// 1 minute from now and repeat every
// hour thereafter
ScheduledFuture<?> future =
executor.scheduleAtFixedRate(
task, 1, 60, TimeUnit.MINUTES);
|
// create alarm
ABAlarmListener listener = new ABAlarmListener();
Alarm am =
aMgr.create(listener, “SomeContext”, 1000*60);
|
// create timer
TimerListener listener =
new StockQuoteTimerListener(“qqq”,
“johndoe@example.com”);
Timer timer = tm.schedule(listener, 1000*60);
// Fixed-delay: schedule timer to expire in
// 60 seconds from now and repeat every
// hour thereafter.
Timer timer = tm.schedule(listener, 1000*60, 1000*30);
// Fixed-rate: schedule timer to expire in
// 60 seconds from now and repeat every
// hour thereafter
Timer timer = tm.scheduleAtFixedRate(listener, 1000*60, 1000*30);
|