このトピックでは、SchedulerX のジョブ管理に関するよくある質問 (FAQ) への回答を提供します。
Spring アプリケーションが Bean を見つけられない場合はどうすればよいですか?
SchedulerX コンソールの [アプリケーション管理] ページで、Spring アプリケーションを見つけ、[インスタンスの総数] 列に表示されている番号をクリックします。起動モードが Spring または Spring Boot であることを確認します。
Spring アプリケーションのコードで
JobProcessor
にbean
が挿入されていることを確認します。たとえば、@Component
アノテーションを追加できます。pom.xml ファイルに
spring-boot-devtools
依存関係が含まれている場合は、その依存関係を削除します。JobProcessor または process メソッドにアスペクト指向プログラミング (AOP) アノテーションが含まれている場合は、SchedulerX エージェントを最新バージョンにアップグレードしてください。以前のバージョンの SchedulerX エージェントは、AOP アノテーションをサポートしていません。
Bean が他のアスペクトによってプロキシされているかどうかを確認します。
DefaultListableBeanFactory
クラスにブレークポイントを追加します。beanDefinitionNames
のメンバー変数は、Spring に登録されている Bean です。これらの Bean が他のアスペクトによってプロキシされているかどうかを確認します。たとえば、ユーザーが無効なサードパーティライブラリを間接的にインポートしたために、Bean が他のアスペクトによってプロキシされている可能性があります。Bean が他のアスペクトによってプロキシされている場合は、アスペクトを削除します。
問題が解決しない場合は、ThreadContainer.start をデバッグします。class.forName エラーが発生したがクラスが存在する場合は、Spring アプリケーションのフレームワークが SchedulerXWorker エージェントのクラスローダーとは異なるクラスローダーを使用していることが原因である可能性があります。この場合は、SchedulerxWorker.setClassLoader
を変更することで、この問題を解決できます。
ジョブが失敗し、「Unable to make field private」というエラーメッセージが返された場合はどうすればよいですか?
MapReduce は、シリアル化およびデシリアル化フレームワークを採用しています。Java 9 以降のバージョンでは、非公開変数にアクセスするために、リフレクション機能を手動で有効にする必要があります。次の構成を Java 仮想マシン (JVM) パラメーターに追加します。
--add-opens java.base/java.lang=ALL-UNNAMED
ジョブが失敗し、「submit jobInstanceId to worker timeout」というエラーメッセージが返された場合はどうすればよいですか?
この問題がアプリケーションのリリース中に発生した場合、または散発的に発生する場合は、無視して構いません。
この問題が継続的に発生し、報告されたエラーの workAddr パラメーターが同じ場合は、サーバーとエージェント間の持続的接続が切断されています。ワーカーノードを再起動するか、SchedulerX エージェントを最新バージョンにアップグレードする必要があります。その後、持続的接続は自動的に回復します。
ジョブが失敗し、「used space beyond 90.0%!」というエラーメッセージが返された場合はどうすればよいですか?
ディスクがいっぱいです。Elastic Compute Service (ECS) インスタンスまたはコンテナーのディスク容量をクリアする必要があります。
ジョブが失敗し、「ClassNotFoundException」というエラーメッセージが返された場合はどうすればよいですか?
このエラーメッセージは、ジョブを実行しているワーカーにこのクラスがないことを示しています。Java ジョブに構成されている [クラスの完全パス] パラメーターの値が、クラスの完全パスであることを確認してください。
[クラスの完全パス] が正しく構成されている場合、ワーカー上にクラスが存在しません。この場合、一般的な原因は、使用されているパッケージが正しくないか、アプリケーションが別のワーカーに接続されていることです。ワーカーにログインし、Java 逆コンパイルを使用して詳細を確認できます。
ジョブが失敗し、「jobInstance=xxx don't update progress more than 60s」というエラーメッセージが返された場合はどうすればよいですか?
ジョブを実行しているワーカーが正常に機能せず、60 秒間進捗状況が更新されない場合、ワーカーはサーバーによって強制終了されます。問題がワーカーによって発生した場合、またはワーカーが存在しない場合は、問題を無視して構いません。
ジョブが失敗し、エラーメッセージが返されない場合はどうすればよいですか?
問題の説明
ジョブが実行に失敗し、エラーメッセージが返されません。
考えられる原因
考えられる原因には、ワーカーまたはビジネス ロジックの障害が含まれます。
解決策
[インスタンス] ページで、[タスクインスタンス一覧] タブをクリックします。管理するジョブを見つけ、[操作] 列の [詳細] をクリックします。次に、[タスクインスタンスの詳細] パネルで、ジョブが失敗したワーカーを表示します。
ジョブの詳細がない場合は、ジョブは単純ジョブです。[基本情報] タブの WorkAddr パラメーターの値は、ジョブを実行するワーカーを示します。
ジョブを実行するワーカーにログオンし、~/logs/schedulerx/worker.log ログファイルを開きます。
grep <Instance ID> worker.log
コマンドを実行して、インスタンスに関連するログを表示します。エラーが発生した場合は、エラーのスタック原因を表示します。エラーの説明が空の場合は、この問題はビジネスロジックの失敗が原因であり、エラーメッセージは返されません。この場合は、ビジネスロジックのトラブルシューティングを行います。
エラーの説明にフレームワークの例外が示されている場合は、DingTalk グループ 23103656 に参加してテクニカルサポートを受けてください。
ジョブの失敗原因を特定するにはどうすればよいですか?
スタンドアロン ジョブで例外が報告された場合は、[インスタンス] ページに移動し、[タスクインスタンス一覧] タブをクリックします。次に、ジョブを見つけて、[操作] 列の [詳細] をクリックして、エラーメッセージを表示します。
例外が報告されない場合、またはジョブが分散ジョブの場合は、SchedulerX Professional Edition を使用している場合は、Log Service を使用してトラブルシューティングを行います。
Basic Edition では、ワーカーノードにログインし、SchedulerX のログとビジネスログを表示してトラブルシューティングを行うことができます。
ジョブの実行中にスタックした場合の対処方法
問題の説明
ジョブが実行中の状態のまま完了しません。
考えられる原因
ビジネス上の問題が発生している可能性があります。
SchedulerX の問題が発生している可能性があります。
解決策
ビジネス上の問題が発生した場合は、次の操作を実行します。その他の種類の問題が発生した場合は、DingTalk グループ(ID: 23103656)に参加して SchedulerX テクニカルサポートに連絡してください。
SchedulerX Professional Edition: コンソールで [ThreadDump] 機能を使用してスタックをクエリし、問題を解決します。この機能は、バージョン 1.4.2 以降のエージェントで使用できます。
SchedulerX Basic Edition: ジョブがスタックしているワーカーノードにログオンし、
jstack
コマンドを実行してスタックを表示します。jstack <pid> | grep <Instance ID> -A 20
ジョブの実行が遅い場合のトラブルシューティング方法
Professional Edition を使用し、トレース分析機能を有効にします。詳細については、「トレース分析を統合する」をご参照ください。
ジョブを実行するインスタンス数が上限に達した場合の対処方法
問題の説明
The number of concurrent job instances reaches the upper limit. Try again later.
というエラーメッセージは、[タスク管理] ページで [一度だけ実行] をクリックした後に返されます。考えられる原因
ジョブはすでにジョブインスタンスで実行されています。
ジョブを実行しているジョブインスタンスの数が、ジョブに設定されているインスタンス同時実行数パラメーターの値に達しました。
解決策
インスタンス同時実行数パラメーターの設定値が適切な場合は、それ以上の操作は必要ありません。[タスク] ページを開き、管理するジョブを見つけて、[操作] 列で を選択して、実行中のジョブインスタンスを表示できます。
インスタンス同時実行数パラメーターの設定値が不適切な場合は、[タスク管理] ページを開き、目的のジョブを見つけて、[操作] 列の [編集] をクリックします。次に、[詳細設定] で [インスタンス同時実行数] パラメーターを指定します。
ジョブがスケジュールどおりに完了しない場合、ジョブは次回実行するためにキューに入れられますか?
[インスタンス同時実行数] パラメーターのデフォルト値は 1 です。これは、ジョブが一度に 1 つのインスタンスでのみ実行されることを示します。ジョブの実行に時間がかかり、スケジュールどおりに完了しない場合、ジョブは次のスケジュール時間で直接破棄され、実行もキューにも入りません。
[インスタンス同時実行数] パラメーターが 2 に設定されている場合、スケジュールどおりに完了しなかったジョブの実行は次回も継続できます。これは、最大 2 つのジョブインスタンスがジョブを実行できることを示します。
ワンタイムジョブを作成するにはどうすればよいですか?
SchedulerX 2.0 では、Time type パラメーターを one_time に設定することで、ワンタイムジョブを作成できます。 ワンタイムジョブの実行レコードは保持されません。
ワンタイムジョブの実行後、履歴レコードを確認するにはどうすればよいですか?
ワンタイムジョブは、実行後に自動的に破棄され、履歴レコードは保持されません。これは、データの蓄積を防ぐためです。履歴レコードを保存する場合は、Log Service を有効にして、トラブルシューティングのために過去 2 週間のすべてのジョブの実行ログを保持できます。詳細については、「アプリケーション管理」をご参照ください。
秒単位の遅延スケジューリングを実行するにはどうすればよいですか?
SchedulerX は秒単位の遅延スケジューリングをサポートしています。ジョブの Time type パラメーターが cron または fix_rate に設定されている場合、ジョブは秒単位の遅延スケジューリングをサポートしません。ジョブの Time type を second_delay に設定できます。その後、ジョブは最後の実行後の遅延の間隔で実行されます。
ジョブが特定の時点でスケジュールされていない場合はどうすればよいですか?
スタンドアロン ジョブが特定の時点でスケジュールされていない場合は、ワーカー リストにワーカーが存在するかどうか、およびすべてのワーカーがビジー状態かどうかを確認します。使用可能なワーカーがない場合は、ワーカーが存在しないか、既存のワーカーがビジー状態かどうかを確認します。詳細については、「システムに「使用可能なワーカーがありません」というメッセージが表示される場合はどうすればよいですか?」および「すべてのワーカーがビジー状態の場合はどうすればよいですか?」をご参照ください。
使用可能なマシンがないアラーム スイッチをオンにすることをお勧めします。詳細については、「ジョブ管理」をご参照ください。
SchedulerX でタイムアウト期間を設定するにはどうすればよいですか?
SchedulerX では、ジョブのタイムアウト期間を設定できますが、タスクのタイムアウト期間は設定できません。 [コンソール] でタイムアウト期間を変更できます。詳細については、「ジョブ管理」をご参照ください。
ジョブの失敗の原因を特定するにはどうすればよいですか?
問題の説明: インスタンスの停止後もジョブが実行されています。
考えられる原因: ジョブインスタンスが停止した後、SchedulerX はエージェントに Kill メッセージを送信します。 Kill メッセージを受信した後、エージェントは配信と実行されていないタスクの実行を停止し、インスタンスのコンテキストを破棄し、インスタンスのすべてのスレッドプールを破棄します。 ただし、実行中のタスクは停止されず、対応するスレッドのみが中断されます。 そのため、タスクは完了するまで実行され続けます。
解決策
ほとんどの場合、それ以上の操作は必要ありません。 タスクが完了するまで待ちます。
インスタンスを停止した直後にすべての実行中のジョブを停止する場合は、タスク処理ロジックを変更し、現在のスレッドに Interrupt 状態を追加する必要があります。
ジョブ管理の詳細設定を行うにはどうすればよいですか?
詳細については、「ジョブ管理の高度なパラメーター」をご参照ください。
すべてのワーカーがビジー状態の場合の対処方法
[アプリケーション] ページで、管理するアプリケーションを見つけ、 [操作] 列の [インスタンスの表示] をクリックします。次に、ビジー状態のワーカーを特定し、[ビジー] にポインターを移動して、しきい値を超えたメトリックを表示します。
しきい値を設定するには、[アプリケーション] ページに移動し、アプリケーションを見つけ、 [操作] 列の [編集] をクリックし、[アプリケーショングループの編集] パネルで関連パラメーターを指定します。
指定されたしきい値を超える負荷が原因でワーカーがビジー状態になっている場合は、アプリケーションが Kubernetes コンテナーにデプロイされているかどうかを確認します。アプリケーションを Kubernetes コンテナーにデプロイする場合は、次のパラメーターを設定します。設定しない場合、収集された CPU 使用率が正しくない可能性があります。詳細については、「Spring Boot アプリケーションを SchedulerX に接続する」をご参照ください。
キー | 説明 | 値 | 初期バージョン |
spring.schedulerx2.enableCgroupMetrics | コントロールグループ(cgroup)を使用してエージェントのメトリックを収集するかどうかを指定します。 Kubernetes 環境では、この機能を手動で有効にする必要があります。 | 有効な値:true および false。デフォルト値:false。 | 1.2.2.2 |
spring.schedulerx2.cgroupPathPrefix | コンテナー内の cgroup パスを指定します。 | デフォルトのパスは /sys/fs/cgroup/cpu/ です。パスがすでに存在する場合は、このパラメーターを設定する必要はありません。 | 1.2.2.2 |
Tracing Analysis を統合するにはどうすればよいですか?
SchedulerX は、エンドツーエンドのトレース分析機能をサポートしています。詳細については、「トレース分析を統合する」をご参照ください。
ジョブの実行がアプリケーションリリース中に停止または低速になる場合はどうすればよいですか?
問題の説明: アプリケーションのリリース中に、ジョブの実行が停止または低速になります。
考えられる原因: 分散ジョブの場合、タスクを処理するワーカーがオフラインになると、SchedulerX はタスクを再配布し、ポーリングを実行してオンラインワーカーを識別します。 これにより、プロセス全体が遅くなります。
解決策: エージェントをバージョン 1.7.9 以降に更新します。
システムから「1 回実行」をクリックした後にインスタンスパラメーターの入力を求められた場合はどうすればよいですか?
タスク ページでスケジュールジョブの操作列の [1 回実行] をクリックすると、ジョブが 1 回実行されます。表示されるダイアログボックスで、[ターゲットマシン] パラメーターと [インスタンスパラメーター] パラメーターを指定します。[インスタンスパラメーター] はオプションであり、テストに使用されます。
「1 回実行」をクリックしてインスタンスパラメーターを入力した場合、コードはインスタンスパラメーターとジョブパラメーターのどちらを取得しますか?
インスタンスパラメーターはジョブパラメーターとは異なります。コードで取得されるパラメーターは、ビジネスコードによって決定されます。
ジョブパラメーターまたはインスタンスパラメーターを取得するにはどうすればよいですか?
次のサンプルコードは、構成の例を示しています。
@Component
public class JavaDemoProcessor extends JavaProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger("schedulerxLog");
@Override
public ProcessResult process(JobContext jobContext) throws InterruptedException {
LOGGER.info(JSON.toJSONString(jobContext));
// ジョブパラメーターを取得します。
String jobParameters = jobContext.getJobParameters();
// インスタンスパラメーターを取得します。
String instanceParameters = jobContext.getInstanceParameters();
LOGGER.info("Job parameters:" + jobParameters);
LOGGER.info("Instance parameters" + instanceParameters);
return new ProcessResult(InstanceStatus.SUCCESS);
}
}
インスタンスパラメーターを指定した場合はデフォルトでコードがインスタンスパラメーターを取得し、インスタンスパラメーターを指定しなかった場合はジョブパラメーターを取得するようにするにはどうすればよいですか?
次のサンプルコードは、構成の例を示しています。
@Component
public class JavaDemoProcessor extends JavaProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger("schedulerxLog");
@Override
public ProcessResult process(JobContext jobContext) throws InterruptedException {
String params = null;
if (StringUtils.isNotBlank(jobContext.getInstanceParameters())) {
params = jobContext.getInstanceParameters();
} else {
params = jobContext.getJobParameters();
}
LOGGER.info("JavaDemoProcessor params:{}", params);
return new ProcessResult(InstanceStatus.SUCCESS);
}
}