22.6.2 スケジュール済ジョブのエラーの解決

スケジュール済ジョブのエラーの診断には、スケジューラのロギングを有効化したり、スケジューラが実行していること、ジョブが有効化されていること、クロックがすべてのノードで同期していることを確認したりするアクティビティが含まれます。

この問題を診断するには:

  1. スケジューラ・サービスが実行されているかどうかを確認します。スケジューラ・サービスは、明示的に無効にされるまで、クラスタの各ノードにデプロイされています。そのノードのscheduler.disabledサーバー・レベル・プロパティをfalseに設定すると、無効にすることができます。スケジューラ・サービスの状態は、次のURLで確認できます。

    http://OIM_HOST:OIM_PORT/SchedulerService-web/status

    このURLで、OIM_HOSTはOracle Identity Managerサーバーをホストしているコンピュータの名前、OIM_PORTはOracle Identity Managerサーバーの待機ポートです。

  2. 特定のジョブが有効かどうかを確認します。これは、アイデンティティ・システム管理の「スケジューラ」セクションで確認できます。スケジュールで実行するには、ジョブを有効にする必要があります。

  3. すべてのノードのクロックが同期しているかどうかを確認します。クロックは、互いに1秒以内である必要があります。

  4. スケジューラUIから既存のトリガーを削除し、UIから新しいトリガーをスケジュールします。問題が解決されたかどうかを確認します。

  5. ログ・レベルをDEBUGに変更して、スケジューラのログを有効にします。これを行うには、Oracle Enterprise Managerからoracle.iam.scheduler.implパッケージのログ・レベルを変更します。ログで次のメッセージがトレースされているかどうかを確認します。

    Job Listener, Job was executed '$JOB_NAME'
    Job Listener, Job to be executed '$JOB_NAME'
    

    ここで、$JOB_NAMEは、その時点で実行される必要があるジョブの名前です。

    メッセージがログされていない場合は、Oracleサポートに連絡してください。

  6. Oracle Enterprise Managerで、oim-config.xmlファイルのschedulerConfigセグメントのthreadPoolSizeパラメータを確認します。これは、ジョブの同時実行のために使用可能なスレッドの数です。したがって、特定の時間に実行できるジョブ数は、設定されたthreadPoolSize数を超過できません。このようなジョブの実行はスキップされ、次のスケジュール時刻に実行されるので、スケジュールされた時刻にジョブが実行されていないという印象を与えます。このパラメータのデフォルト値は10ですが、必要に応じて調整できます。

  7. サーバーを再起動し、ジョブが実行されたかどうかを確認します。

  8. 次の例外がログに記録されているかどうかを確認します。

    Caused By: java.lang.NullPointerException at org.quartz.SimpleTrigger.computeNumTimesFiredBetween(SimpleTrigger.java:800)
    

    この問題を解決するには、次の問合せを実行します。

    UPDATE QRTZ92_TRIGGERS SET NEXT_FIRE_TIME=1 WHERE  NEXT_FIRE_TIME<1;
    
  9. QRTZ92_TRIGGER表で、トリガーのステータスがBLOCKEDからPAUSED状態に更新されない場合があります。この状況は、環境が適切に調整されていない場合に発生し、プールからのデータベース接続がサーバー上で実行されている他のパラレル操作によって使い尽くされています。その結果、QUARTZフレームワークは、実行中のジョブを更新するためにプールから接続を取得できません。この状況は、サーバーのログに、データベース接続プールに関連する例外が記録されている場合に特定できます。通常、このようなトリガーは、サーバーの再起動の後に修正されますが、トリガー・ステータスが同じままである場合は、次の問合せを実行できます。

    UPDATE QRTZ92_TRIGGERS SET TRIGGER_STATUS='WAITING' WHERE JOB_NAME ='$JOB_NAME'
    

    $JOB_NAMEは、ジョブ名に置き換えてください。

  10. QRTZ92_TRIGGER表で、ジョブの手動トリガーが更新されていない場合があります。手動トリガーは、スケジューラUIから「即時実行」をクリックするか、スケジューラのrunNow() APIを使用してジョブを実行したときにシステムに作成されます。このようなトリガーは、ジョブが正常に実行された後に削除される必要があります。この問題を修正するには:

    1. サーバーを停止します。

    2. Oracle Identity Managerデータベースで次の問合せを実行します。

      DELETE FROM QRTZ92_FIRED_TRIGGERS where TRIGGER_NAME like ('MT_%');
      DELETE FROM QRTZ92_SIMPLE_TRIGGERS where TRIGGER_NAME like ('MT_%');
      DELETE FROM QRTZ92_TRIGGERS where TRIGGER_NAME like ('MT_%');
      

    このような手動トリガーの自動削除は、Quartzフレームワークによって維持されます。