この付録では、Oracle Application Server Containers for J2EEまたは他のスケジューラベースのアプリケーションのトラブルシューティングに使用できるツールとメソッドについて説明します。次のトピックについて説明します。
Oracle Application Serverとの統合を簡略化するために、標準のJDK1.4.1 java.util.logging
APIを使用します。これらのAPIは、ロギングAPI(java.util.logging.Logger
)と各宛先へのログ・メッセージの書込みを制御するAPI(java.util.logging.Handler
)およびメッセージの書式とローカライズを制御するAPI(java.util.logging.Formatter
)を明確に区別しています。これらのメッセージは、OracleのODLハンドラを使用してODL形式で記録されます。
ジョブ・スケジューラでは、次のタイプのロギングを使用できます。
実行時ロギング。スケジューラ・サブシステムのかわりに実行されます(設定ミスによる警告メッセージなど)。
ジョブ・ロギング。ジョブの実行に関連しています。2種類のジョブ・ロギングがあります。
暗黙的ジョブ・ロギング。このタイプのロギングは、主にジョブ・スケジューラによって実行され、ジョブ定義の一部として指定されます。
明示的ジョブ・ロギング。このタイプのロギングは実際のジョブ実装によって実行されます。つまり、ユーザー定義です。
暗黙的ジョブ・ロギングは、ジョブ定義の一部として指定されます。ジョブ・スケジューラではJavaのロギングAPIを使用するため、ログ・レベルはjava.util.logging.Level
クラスが提供するログ・レベルを使用して指定されます。
暗黙的ロギングのデフォルト・レベルはLevel.FINER
に設定されています。ジョブ・スケジューラでは、メッセージの記録にこれらのレベルの一部のみを使用します。
ロギング・レベルがLevel.WARNING
に設定されている場合、ログ・エントリは次の条件で書き込まれます。
ジョブの実行がJobExecutionException
例外で終了した場合
ジョブの実行がRuntimeException
例外で終了した場合
ロギング・レベルの値がLevel.FINE
に設定されている場合、次の追加情報がログに書き込まれます。
ジョブが開始された日時
ジョブが終了した日時
ロギング・レベルの値がLevel.FINER
に設定されている場合、次の追加情報がログに書き込まれます。
関連付けられたトリガーが通知を評価した日時と評価結果
ロギング・レベルの値がLevel.FINEST
に設定されている場合、次の追加情報がログに書き込まれます。
ジョブの合計経過時間
各ログ・エントリには次の情報が含まれます。
ジョブの説明
ジョブ実装クラス名
日時
スタック・トレース(ジョブが例外で終了した場合)
関連付けられたメッセージ・パラメータ
ジョブ実行時のジョブ実装でも、暗黙的ジョブ・ロギングと同じロギング機能を使用できます。ロギング・コンテキストは、ジョブがJobContext
オブジェクトから実行されるときにジョブに渡されるコンテキストから使用できます。
public interface JobContext extends Serializable { public Job getJob(); public java.util.logging.Logger getLogger(); public java.util.logging.Logger getLogger(String resourceBundleName);}
どちらのgetLogger()
メソッドも使用できますが、後者のメソッドではリソース・バンドルを指定できます。
例E-1は、ジョブにロギング機能を追加する方法を示しています。各ファイルをコピーする前に、情報ログ・エントリが書き込まれます。具体的には、コピー・コマンドを実行する前にジョブ・コンテキストからログ出力が取り出され、情報ログ・メッセージが書き込まれます。
例E-1 ロギング付きジョブの実装
import java.io.File; import java.io.IOException; import java.util.logging.Logger; import oracle.ias.scheduler.Job; import oracle.ias.scheduler.Executable; import oracle.ias.scheduler.Cancellable; import oracle.ias.scheduler.JobContext; import oracle.ias.scheduler.JobCancellationException; import oracle.ias.scheduler.JobExecutionException; public class CancellableBackupJobLogged implements Executable, Cancellable { boolean m_cancelled = false; public void cancel() { m_cancelled = true; } public void execute(JobContext context) throws JobExecutionException, JobCancellationException { // retrieve the source/destination directories Job job = context.getJob(); Logger log = context.getLogger(); 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 JobCancellationException(); } log.info("copying file "+files[x]); 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); } } } }
ログ・レベルは、ログ出力で適切なAPIを起動することで設定できます。次に例を示します。
<code> Logger logger = jobContext.getLogger(); logger.setLoglevel(Level.FINEST); </code>
注意: すべてのジョブが1つのログ出力インスタンスを共有するため、ログ・レベルの設定は、ジョブの全インスタンスについて行われる後続のすべてのメッセージのロギングに影響します。 |
Oracle Dynamic Monitoring Service(DMS)は、アプリケーション固有のパフォーマンス情報を測定するために使用されます。2種類のメトリックが用意されています。
スケジューラ・メトリック。特定のジョブ・スケジューラ・インスタンスに関する統計情報を提供します(実行中のジョブ・インスタンスの合計数、アクティブなジョブの合計数、一時停止中のジョブの合計数など)。
ジョブ・メトリック。ジョブの集約統計情報と特定のジョブに関する情報を提供します(ジョブの説明、ジョブの状態、失敗したジョブ数など)。
表E-1に、スケジューラ・メトリックが提供する情報をまとめます。
表E-1 スケジューラ・メトリックの統計情報のタイプ
メトリック名 | 説明 |
---|---|
|
ジョブ・スケジューラの起動時の |
|
現在実行中のジョブ・インスタンスの合計数 |
|
アクティブなジョブの合計数 |
|
一時停止されたジョブの合計数 |
|
完了したジョブの合計数 |
表E-2に、ジョブ・メトリックが提供する情報をまとめます。
表E-2 ジョブ・メトリックの統計情報のタイプ
メトリック名 | 説明 |
---|---|
|
スケジュールの文字列バージョン |
|
トリガーの文字列バージョン |
|
ログ・レベル |
|
クラス名の文字列バージョン |
|
ジョブの説明 |
|
実行しきい値(ミリ秒) |
|
再試行期間(ミリ秒) |
|
ジョブの状態(アクティブ、一時停止、完了) |
|
このジョブのインスタンスの実行時間 |
|
失敗した実行数 |
|
JVM起動後、取り消された実行数 |
|
JVM起動後、成功した実行数 |
|
JVM起動後、ブラックアウトされた実行数 |
|
JVM起動後、実行しきい値を超えた実行数 |
DMSの詳細は、『Oracle Application Serverパフォーマンス・ガイド』を参照してください。
ジョブ・スケジューラのアクティビティはどのように監視しますか。
DMS Spyサーブレットに接続して、ジョブ・スケジューラの統計情報とその各種ジョブを調べます(現在アクティブ、完了済、および実行中のジョブ数など)。ジョブごとに、現在の状態、継続時間、結果(ジョブが失敗したかどうかなど)に関する情報が提供されます。詳細は、DMSの付録を参照してください。
はい。詳細は、第9章を参照してください。
ジョブ・スケジューラのロギングはどのように構成しますか。
ジョブ・スケジューラのロギングの構成の詳細は、第9章を参照してください。
ロギングを使用して問題を解決するにはどうすればよいですか。
特定のジョブの問題を解決するには、そのジョブのログ・レベルを変更して、ログ・メッセージの精度を高めます。管理コンソールのジョブMBean管理インタフェースから、またはリモート・スケジューラ・インタフェースを直接起動して動的に設定できます。グローバル・ルート・ログ出力のデフォルト・レベルはLevel.WARNING
に設定されています。