この章では、ジョブを取り消す意味とジョブの取消し方法について説明します。次のトピックについて説明します。
実行中のジョブを停止するには、ジョブを取り消すしかありません。ジョブを取り消すと、現在実行中のジョブは停止しますが、そのジョブがその後も実行されなくなるわけではありません。システムからジョブを完全に排除するには、ジョブを削除する必要があります。ジョブの削除の詳細は、2.3項を参照してください。
ジョブを取り消した場合、再試行を使用してもう一度実行することができます。再試行の詳細は、3.2項を参照してください。
ジョブを取り消すには、oracle.ias.scheduler.Cancellableインタフェースを使用し、取消しリクエストに応答し、必要な例外JobCancelledExceptionを作成して、ジョブの取消しを指定する必要があります。
ジョブ・スケジューラに発行されたJavaのジョブ・クラスは、oracle.ias.scheduler.Cancellableインタフェースの実装を提供できます。(ジョブ・スケジューラのcancel()メソッドを呼び出して)ジョブを取り消すたびに、実装クラスのcancel()メソッドがすべてのジョブ・インスタンスで呼び出されます。
oracle.ias.scheduler.Cancellableインタフェースまたはcancel()メソッドの詳細は、『Oracle Containers for J2EE Job Scheduler API Reference』を参照してください。
例6-1は、oracle.ias.scheduler.Cancellableインタフェースを使用してジョブを取り消す方法を示しています。
例6-1 取消しオプションを使用したデータの定期的なバックアップ
例2-1で説明したアプリケーションのテスト中に、ジョブが長時間実行される可能性があります。そのため、実行中のジョブの取消しが必要になる場合があります。
次のコード例は、oracle.ias.scheduler.Executableインタフェースとoracle.ias.scheduler.Cancellableインタフェースの両方を提供するように実装を修正したものです。
import java.io.File;
import java.io.IOException;
import oracle.ias.scheduler.Job;
import oracle.ias.scheduler.Executable;
import oracle.ias.scheduler.Cancellable;
import oracle.ias.scheduler.JobContext;
import oracle.ias.scheduler.JobCancelledException;
import oracle.ias.scheduler.JobExecutionException;
public class CancellableBackupJob implements Executable, Cancellable {
boolean m_cancelled = false;
public void cancel() {
m_cancelled = true;
}
public void execute(JobContext context) throws
JobExecutionException, JobCancelledException {
// retrieve the source and destination directories
Job job = context.getJob();
String source = job.getProperties().getProperty("SourceDirectory");
String destination = job.getProperties().getProperty("DestinationDirectory");
// get the list of files to copy
File directory = new File(source);
File[] files = directory.listFiles();
// copy the files
Runtime runtime = Runtime.getRuntime();
Process process;
for (int x = 0; x < files.length; x++) {
// cancelled?
if (m_cancelled) {
throw new JobCancelledException();
}
try {
process = runtime.exec("/bin/cp " + files[x].toString() +
" " + destination);
process.waitFor();
} catch(IOException e) {
throw new RuntimeException("copy failed: "+files[x],e);
} catch(InterruptedException e) {
throw new RuntimeException("copy failed: "+files[x],e);
}
}
}
}
少なくとも、ジョブの取消しでは次のことが必要です。
実装にoracle.ias.scheduler.Cancellableインタフェースを使用する必要があります。
ジョブの実行を取り消すには、cancel()メソッドを呼び出す必要があります。このメソッドによって、ジョブの実行を停止するoracle.ias.scheduler.JobCancelledException例外が発生します。
cancel()メソッドを即座に呼び出せない場合があるので、プログラムでこの点を考慮する必要があります。
取り消されたジョブを再実行する方法はありますか。
いいえ。取り消された実行を再試行するメカニズムはありません。再試行できるのは、失敗したジョブのみです。詳細は、3.2項を参照してください。