스케줄러를 사용하는 태스크 관리 메소드
스케줄러는 여러 가지 태스크 관리 메소드를 제공합니다.
- suspend()
- 태스크를 일시중단합니다. 태스크가 재개될 때까지 실행되지 않습니다.
- resume()
- 이전에 일시중단된 태스크를 재개합니다.
- cancel()
- 태스크를 취소합니다. 태스크가 실행되지 않고 재개할 수 없습니다.
- purge()
- 지속적 저장소에서 취소된 태스크를 영구적으로 삭제합니다.
- getStatus()
- 태스크의 현재 상태를 리턴합니다.
//Create the task.
TaskInfo taskInfo = ...
TaskStatus status = scheduler.create(taskInfo);
//Get the task ID
String taskId = status.getTaskId();
//Cancel the task. Specify the purgeAlso flag so that the task does not remain in the persistent store
scheduler.cancel(taskId,true);
set jndiName sched/MyScheduler
# Map the JNDI name to the mbean name. The mbean name is
# formed by replacing the / in the jndi name with . and prepending
# Scheduler_
regsub -all {/} $jndiName "." jndiNameset mbeanName Scheduler_$jndiName
puts "Looking-up Scheduler MBean $mbeanName"
set sched [$AdminControl queryNames WebSphere:*,type=WASScheduler,name=$mbeanName]
puts $sched
# Get the ObjectName format of the Scheduler MBean
set schedO [$AdminControl makeObjectName $sched]
# Create a TaskInfo object…
# (Some code excluded…)
set params [java::new {java.lang.Object[]} 1]
$params set 0 $taskInfo
set sigs [java::new {java.lang.String[]} 1]
$sigs set 0 com.ibm.websphere.scheduler.TaskInfo
set taskStatus [java::cast com.ibm.websphere.scheduler.TaskStatus [$AdminControl invoke_jmx $schedO
create $params $sigs]]
set taskID [$taskStatus getTaskId]
puts "Task Created. TaskID= $taskID"
# Cancel the task using the Task ID from the TaskStatus object returned during create.
set params [java::new {java.lang.Object[]} 1]
$params set 0 false
set sigs [java::new {java.lang.String[]} 1]
$sigs set 0 java.lang.boolean
set taskStatus [java::cast com.ibm.websphere.scheduler.TaskStatus [$AdminControl invoke_jmx $schedO
cancel $params $sigs]]
트랜잭션 기능. 스케줄러 API의 모든 메소드는 트랜잭션 유형입니다. 글로벌 트랜잭션 컨텍스트가 있으면 이 컨텍스트를 사용하여 조작을 수행합니다. 예기치 못한 예외가 생긴 경우 트랜잭션은 롤백으로 표시되고 호출자가 올바르게 조작해야 합니다. 예상 또는 선언된 예외가 생기는 경우 트랜잭션은 원래대로 유지되고 호출자가 롤백할지 또는 트랜잭션을 커미트할지 선택해야 합니다. 트랜잭션이 일정 지점에서 롤백되는 경우 트랜잭션 내에서 수행된 모든 스케줄러 조작도 롤백됩니다.
로컬 트랜잭션 컨텍스트가 있으면 이 컨텍스트는 일시중단되고 새 글로벌 트랜잭션 컨텍스트가 시작합니다. 마찬가지로, 활성인 트랜잭션 컨텍스트가 없는 경우 글로벌 트랜잭션 컨텍스트가 시작합니다. 두 가지 경우 모두, 예기치 못한 예외가 생기면 트랜잭션은 롤백됩니다. 선언된 예외가 발생하면 트랜잭션은 커미트됩니다.
다른 스레드가 동시에 문제의 태스크를 수정하면 TaskPending 예외가 발생합니다. 이는 스케줄러가 낙관적으로 데이터베이스를 잠그기 때문입니다. 그런 다음, 호출 애플리케이션이 조작을 재시도할 수 있습니다.
태스크가 현재 실행 중이면 태스크 관리 기능이 차단될 수 있습니다. 스케줄러는 각 태스크가 한 번만 실행될 것을 보증하지 않으므로 태스크는 실행 중인 태스크의 지속 기간 동안 잠겨져 있어야 합니다. 마찬가지로, 관리 기능 중 하나를 사용하여 태스크를 변경했지만 글로벌 트랜잭션을 커미트하지 않은 경우, 이 태스크에 대해 다른 트랜잭션으로부터 실행된 다른 모든 관리 기능은 차단됩니다.
Stateless 세션 Bean 태스크의 TaskHandler.process() 메소드는 자체 상태를 변경할 수 있습니다. 그러나 이 태스크는 스케줄러와 동일한 트랜잭션 내에서 실행 중이어야 합니다. 따라서, 실행 중인 태스크는 필요하거나 필수적인 컨테이너 관리 트랜잭션 유형을 사용하는 경우에만 자체 수정할 수 있습니다. process() 메소드에 신규 필요 트랜잭션 유형이 지정된 경우, 모든 관리 기능은 교착 상태가 됩니다.
스케줄러 API에서 정의하는 모든 메소드는 API 문서에서 설명합니다.