동시성 및 비동기 프로그래밍 모델을 사용하는 애플리케이션을 Liberty로 마이그레이션

Concurrency Utilities for Java™ EE, 비동기 Bean 및 CommonJ 타이머와 작업 관리자를 사용하는 애플리케이션을 WebSphere® Application Server Traditional에서 WebSphere Application Server Liberty로 마이그레이션할 수 있습니다.

비동기 Bean, CommonJ 타이머 및 작업 관리자는 Liberty에서 사용할 수 없습니다. Liberty로 마이그레이션할 때, 애플리케이션은 Concurrency Utilities for Java EE 프로그래밍 모델로 전환해야 합니다. 자세한 정보는 Concurrency Utilities for Java EE를 구현하는 API 태스크 예의 내용을 참조하십시오.

구성 및 스레딩의 차이점

WebSphere Application Server Traditional은 스레드 풀링과 관련하여 Liberty에서는 사용할 수 없는 Concurrency Utilities for Java EE에 대한 많은 구성 옵션을 제공합니다. Liberty는 모든 관리 대상 실행기 및 Liberty 컴포넌트에 의해 공유되는 관리 대상 스케줄된 실행기 사이에 하나의 공통 스레드 풀을 갖고 있습니다. 이를 통해 Liberty에서 스레드 관리를 최적화합니다. WebSphere Application Server Traditional에서 각 작업 관리자는 두 개의 스레드 풀을 포함하여 구성될 수 있습니다. 한 스레드 풀은 가능한 빨리 실행하도록 제출되고(관리 대상 실행기의 submit/execute/invoke 메소드) 구성 가능한 작업 요청 큐와 큐 용량이 초과될 때 취할 조치를 갖는 태스크를 위한 것입니다. 다른 스레드 풀은 스케줄된 태스크(관리 대상 스케줄된 실행기의 schedule 메소드)를 위한 것입니다.

Liberty에서 별도의 스레드 풀과 함께 Concurrency Utilities for Java EE를 사용할 계획인 경우, WebSphere Application Server Traditional에서 사용할 수 있는 구성 옵션과 비슷한 작동을 달성하기 위한 다양한 접근 방식을 취할 수 있습니다.

관리 대상 스레드 팩토리 주위에 Java SE 생성기 구성

Java SE의 java.util.concurrent 패키지는 특정 스레드 팩토리 주위에 스레드 풀을 실행기 및 스케줄된 실행기로 구성하는 여러 가지 방법을 제공합니다. 관리 대상 스레드 팩토리는 관리되지 않은 스레드 팩토리 위치에 제공되어 관리 대상 스레드에 대해 태스크를 실행하는 스레드 풀을 생성할 수 있습니다. 관리 대상 실행기 및 관리 대상 스케줄 실행기와는 달리, 이들 실행기에 의해 풀링되는 관리 대상 스레드는 태스크가 제출 또는 스케줄되었을 때가 아니라 관리 대상 스레드 팩토리가 검색되었을 때의 스레드 컨텍스트와 함께 실행됩니다. 스레드 컨텍스트는 또한 스레드 수명 동안 관리 대상 스레드에 남아 있어서 스레드 컨텍스트 스위칭 오버헤드를 줄입니다.

최대 작업 스레드 및 작업 큐 구성의 대체 예

int minThreads = 1;
int maxThreads = 2;
int workRequestQueueSize = 3;
RejectedExecutionHandler workRequestQueueFullAction =
    new ThreadPoolExecutor.AbortPolicy(); 
ManagedThreadFactory threadFactory =
    (ManagedThreadFactory) new InitialContext().lookup(
        "java:comp/DefaultManagedThreadFactory");
ExecutorService executor = new ThreadPoolExecutor(
    minThreads, // similar, but not exact match for coreSize
    maxThreads, keepAliveTime, keepAliveTimeUnit,
    new ArrayBlockingQueue<Runnable>(workRequestQueueSize),
    threadFactory,
    workRequestQueueFullAction);
Callable<Integer> task = new MyTask();
Future<Integer> future = executor.submit(task);
int result = future.get();

최대 알람 스레드의 대체 예

int maxAlarms = 2;
ManagedThreadFactory threadFactory =
    (ManagedThreadFactory) new InitialContext().lookup(
        "java:comp/DefaultManagedThreadFactory");
ScheduledExecutorService executor =
    Executors.newScheduledThreadPool(maxAlarms, threadFactory);
Callable<Integer> task = new MyTask();
ScheduledFuture<Integer> future = executor.schedule(
    task, 50, TimeUnit.SECONDS);
int result = future.get();

작업 제한시간 적용

WebSphere Application Server Traditional에서는 가능한 빨리 실행하기 위해 제출되는 태스크에 적용되는 작업 제한시간을 구성할 수 있습니다(submit/execute/invoke 메소드). 태스크가 할당된 작업 제한시간보다 더 오래 실행 중인 경우 태스크를 인터럽트하여 태스크를 취소하려고 합니다. 그러나 Liberty에는 작업 제한시간을 구성 옵션으로 갖지 않지만 유사한 동작이 관리 대상 태스크 리스너와 함께 태스크를 제출하여 구현될 수 있는데, 이것은 taskStarting 알림에 대한 응답에서 태스크의 미래를 취소하도록 태스크를 스케줄합니다. 다른 방법으로는, 관리 대상 태스크 리스너가 사용 불가능한 이전 예에서와 같이 스레드 풀 실행기를 사용할 때 스레드 풀 실행기의 beforeExecute 메소드를 대체하여 태스크가 실행 스레드를 인터럽트하도록 스케줄할 수 있습니다.

작업 제한시간의 대체 예

ManagedExecutorService executor =
    (ManagedExecutorService) new InitialContext().lookup(
        "java:comp/DefaultManagedExecutorService");
Callable<Long> slowTask = new SlowTask();
slowTask = ManagedExecutors.managedTask(
           slowTask, new WorkTimeout(5, TimeUnit.SECONDS));
Future<Long> future = executor.submit(slowTask);
try {
    long result = future.get(1, TimeUnit.MINUTES);
    // task successful...
} catch (CancellationException x) {
    // task was canceled, possibly due to timeout
}

public class WorkTimeout implements ManagedTaskListener {
    private final long timeout;
    private final TimeUnit unit;

    public WorkTimeout(long timeout, TimeUnit unit) {
        this.timeout = timeout;
        this.unit = unit;
    }

    public void taskSubmitted(Future<?> future,
        ManagedExecutorService executor, Object task) {}

    public void taskStarting(final Future<?> future,
        ManagedExecutorService executor, Object task) {
        try {
            ScheduledExecutorService scheduledExecutor =
                (ScheduledExecutorService) new InitialContext().lookup(
                    "java:comp/DefaultManagedScheduledExecutorService");
            scheduledExecutor.schedule(new Runnable() {
                @Override
                	   public void run() {
                    if (!future.isDone())
                        future.cancel(true);
                }
            }, timeout, unit);
        } catch (NamingException x) {
            x.printStackTrace(System.out);
        }
    }

    public void taskAborted(Future<?> future, ManagedExecutorService executor, Object task, Throwable x) {}

    public void taskDone(Future<?> future, ManagedExecutorService executor, Object task, Throwable x) {}
}

주제의 유형을 표시하는 아이콘 참조 주제



시간소인 아이콘 마지막 업데이트 날짜: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwlp_mig_workmgr
파일 이름: rwlp_mig_workmgr.html