ヘッダーをスキップ
Oracle Containers for J2EEジョブ・スケジューラ開発者ガイド
10g(10.1.3.1.0)
B31853-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

E Oracle Application Server Containers for J2EEのトラブルシューティング

この付録では、Oracle Application Server Containers for J2EEまたは他のスケジューラベースのアプリケーションのトラブルシューティングに使用できるツールとメソッドについて説明します。次のトピックについて説明します。

E.1 Oracle Diagnostic Logging(ODL)

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形式で記録されます。

E.1.1 ロギングのタイプ

ジョブ・スケジューラでは、次のタイプのロギングを使用できます。

  • 実行時ロギング。スケジューラ・サブシステムのかわりに実行されます(設定ミスによる警告メッセージなど)。

  • ジョブ・ロギング。ジョブの実行に関連しています。2種類のジョブ・ロギングがあります。

    • 暗黙的ジョブ・ロギング。このタイプのロギングは、主にジョブ・スケジューラによって実行され、ジョブ定義の一部として指定されます。

    • 明示的ジョブ・ロギング。このタイプのロギングは実際のジョブ実装によって実行されます。つまり、ユーザー定義です。

E.1.1.1 暗黙的ジョブ・ロギング

暗黙的ジョブ・ロギングは、ジョブ定義の一部として指定されます。ジョブ・スケジューラではJavaのロギングAPIを使用するため、ログ・レベルはjava.util.logging.Levelクラスが提供するログ・レベルを使用して指定されます。

暗黙的ロギングのデフォルト・レベルはLevel.FINERに設定されています。ジョブ・スケジューラでは、メッセージの記録にこれらのレベルの一部のみを使用します。

ロギング・レベルがLevel.WARNINGに設定されている場合、ログ・エントリは次の条件で書き込まれます。

  • ジョブの実行がJobExecutionException例外で終了した場合

  • ジョブの実行がRuntimeException例外で終了した場合

ロギング・レベルの値がLevel.FINEに設定されている場合、次の追加情報がログに書き込まれます。

  • ジョブが開始された日時

  • ジョブが終了した日時

ロギング・レベルの値がLevel.FINERに設定されている場合、次の追加情報がログに書き込まれます。

  • 関連付けられたトリガーが通知を評価した日時と評価結果

ロギング・レベルの値がLevel.FINESTに設定されている場合、次の追加情報がログに書き込まれます。

  • ジョブの合計経過時間

各ログ・エントリには次の情報が含まれます。

  • ジョブの説明

  • ジョブ実装クラス名

  • 日時

  • スタック・トレース(ジョブが例外で終了した場合)

  • 関連付けられたメッセージ・パラメータ

E.1.1.2 明示的ジョブ・ロギング

ジョブ実行時のジョブ実装でも、暗黙的ジョブ・ロギングと同じロギング機能を使用できます。ロギング・コンテキストは、ジョブが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.2 グローバル・ログ・レベルの構成

ジョブ・スケジューラのグローバル・ログ・レベルを構成できます。詳細は、9.4項を参照してください。

E.1.3 ロギングの例

例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つのログ出力インスタンスを共有するため、ログ・レベルの設定は、ジョブの全インスタンスについて行われる後続のすべてのメッセージのロギングに影響します。

E.2 DMSメトリック

Oracle Dynamic Monitoring Service(DMS)は、アプリケーション固有のパフォーマンス情報を測定するために使用されます。2種類のメトリックが用意されています。

表E-1に、スケジューラ・メトリックが提供する情報をまとめます。

表E-1 スケジューラ・メトリックの統計情報のタイプ

メトリック名 説明

schedulerStartTime

ジョブ・スケジューラの起動時のSystem.currentTimeMillis()

executingJobs

現在実行中のジョブ・インスタンスの合計数

activeJobs

アクティブなジョブの合計数

pausedJobs

一時停止されたジョブの合計数

completedJobs

完了したジョブの合計数


表E-2に、ジョブ・メトリックが提供する情報をまとめます。

表E-2 ジョブ・メトリックの統計情報のタイプ

メトリック名 説明

jobSchedule

スケジュールの文字列バージョン

jobTrigger

トリガーの文字列バージョン

jobLogLevel

ログ・レベル

jobClassName

クラス名の文字列バージョン

jobDescription

ジョブの説明

jobExecutionThreshold

実行しきい値(ミリ秒)

jobRetryPeriod

再試行期間(ミリ秒)

jobState

ジョブの状態(アクティブ、一時停止、完了)

execution

このジョブのインスタンスの実行時間

failedExecutions

失敗した実行数

cancelledExecutions

JVM起動後、取り消された実行数

successfulExecutions

JVM起動後、成功した実行数

blackoutExecutions

JVM起動後、ブラックアウトされた実行数

exceededThresholdExecutions

JVM起動後、実行しきい値を超えた実行数


DMSの詳細は、『Oracle Application Serverパフォーマンス・ガイド』を参照してください。

E.3 ジョブ・スケジューラの監視に関するFAQ

ジョブ・スケジューラのアクティビティはどのように監視しますか。

DMS Spyサーブレットに接続して、ジョブ・スケジューラの統計情報とその各種ジョブを調べます(現在アクティブ、完了済、および実行中のジョブ数など)。ジョブごとに、現在の状態、継続時間、結果(ジョブが失敗したかどうかなど)に関する情報が提供されます。詳細は、DMSの付録を参照してください。

DMSの統計情報の収集を無効にできますか。

はい。詳細は、第9章を参照してください。

E.4 ジョブ・スケジューラのロギングに関するFAQ

ジョブ・スケジューラのロギングはどのように構成しますか。

ジョブ・スケジューラのロギングの構成の詳細は、第9章を参照してください。

ロギングを使用して問題を解決するにはどうすればよいですか。

特定のジョブの問題を解決するには、そのジョブのログ・レベルを変更して、ログ・メッセージの精度を高めます。管理コンソールのジョブMBean管理インタフェースから、またはリモート・スケジューラ・インタフェースを直接起動して動的に設定できます。グローバル・ルート・ログ出力のデフォルト・レベルはLevel.WARNINGに設定されています。