このトピックでは、SchedulerX のジョブ管理に関するよくある質問 (FAQ) への回答を提供します。
Spring アプリケーションが Bean を見つけられない場合はどうすればよいですか?
SchedulerX コンソールの [アプリケーション管理] ページで、Spring アプリケーションを見つけ、[インスタンスの総数] 列に表示されている番号をクリックします。起動モードが [Spring] または [Spring Boot] であることを確認します。
Spring アプリケーションのコードで、
beanがJobProcessorに挿入されていることを確認します。たとえば、@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 ジョブに設定されている [プロセッサクラス名] パラメーターの値がクラスのフルパスであることを確認します。
JobProcessor クラス名が正しい場合、ワーカー上にクラスが存在しません。この場合、一般的な原因は、使用されているパッケージが正しくないか、アプリケーションが別のワーカーに接続されていることです。ワーカーにログインし、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 を使用している場合は、ログサービスを使用してトラブルシューティングを行います。
Basic Edition では、ワーカーノードにログオンし、SchedulerX のログとビジネスログを表示してトラブルシューティングを行うことができます。
ジョブの実行中に停止した場合はどうすればよいですか?
問題
ジョブが実行中の状態のまま完了できません。
考えられる原因
ビジネス上の問題が発生している可能性があります。
SchedulerX の問題が発生している可能性があります。
解決策
ビジネス上の問題が発生した場合は、次の操作を実行します。その他の種類の問題が発生した場合は、技術サポートを受けるために DingTalk グループ 23103656 に参加してください。
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 に設定することで、ワンタイムジョブを作成できます。ワンタイムジョブの実行レコードは保持されません。
ワンタイムジョブの実行後の履歴レコードを確認するにはどうすればよいですか?
ワンタイムジョブは、実行後に自動的に破棄され、履歴レコードは保持されません。これは、データの蓄積を防ぐためです。履歴レコードを保存する場合は、ログサービスを有効にして、トラブルシューティングのために過去 2 週間のすべてのジョブの実行ログを保持できます。詳細については、「アプリケーション管理」をご参照ください。
秒単位の遅延スケジューリングを実行するにはどうすればよいですか?
SchedulerX は秒単位の遅延スケジューリングをサポートしています。ジョブの [時間の種類] パラメーターが cron または fix_rate に設定されている場合、ジョブは秒単位の遅延スケジューリングをサポートしません。ジョブの [時間の種類] を second_delay に設定できます。その後、ジョブは最後の実行後の遅延の間隔で実行されます。
ジョブが特定の時点でスケジュールされていない場合はどうすればよいですか?
スタンドアロンジョブが特定の時点でスケジュールされていない場合は、ワーカーリストにワーカーが存在するかどうか、およびすべてのワーカーがビジー状態かどうかを確認します。使用可能なワーカーがない場合は、ワーカーが存在しないか、既存のワーカーがビジー状態かどうかを確認します。詳細については、「システムに「使用可能なワーカーがありません」というメッセージが表示される場合はどうすればよいですか?」および「すべてのワーカーがビジー状態の場合はどうすればよいですか?」をご参照ください。
使用可能なマシンがないアラームスイッチをオンにすることをお勧めします。詳細については、「ジョブ管理」をご参照ください。
SchedulerX でタイムアウト期間を設定するにはどうすればよいですか?
SchedulerX では、ジョブのタイムアウト期間を設定できますが、タスクのタイムアウト期間は設定できません。コンソールでタイムアウト期間を変更できます。詳細については、「ジョブ管理」をご参照ください。
ジョブの失敗の原因を特定するにはどうすればよいですか?
問題
インスタンスが停止した後も、ジョブは引き続き実行されます。
考えられる原因
ジョブインスタンスが停止した後、SchedulerX はエージェントに Kill メッセージを送信します。Kill メッセージを受信した後、エージェントは実行されていないタスクの配信と実行を停止し、インスタンスのコンテキストを破棄し、インスタンスのすべてのスレッドプールを破棄します。ただし、実行中のタスクは停止されず、対応するスレッドが中断されるだけです。そのため、タスクは完了するまで実行され続けます。
ソリューション
ほとんどの場合、タスクが完了するまで待つことができ、問題に対処する必要はありません。
インスタンスの停止後、実行中のすべてのジョブを直ちに停止する場合は、タスク処理ロジックを変更し、現在のスレッドに割り込み状態を追加する必要があります。
ジョブ管理の高度な構成を設定するにはどうすればよいですか?
詳細については、「ジョブ管理の高度なパラメーター」をご参照ください。
すべてのワーカーがビジー状態の場合の対処方法
[アプリケーション管理] ページで、管理するアプリケーションを見つけ、[操作] 列の [インスタンスの表示] をクリックします。次に、[ビジー] 状態のワーカーを特定し、[ビジー] にポインターを移動して、しきい値を超えたメトリックを表示します。
しきい値を設定するには、[アプリケーション管理] ページに移動し、アプリケーションを見つけ、[操作] 列の [編集] をクリックし、[アプリケーショングループの編集] パネルで関連パラメーターを指定します。
負荷が指定されたしきい値を超えたためにワーカーがビジー状態になっている場合は、アプリケーションが Kubernetes コンテナにデプロイされているかどうかを確認します。アプリケーションを Kubernetes コンテナにデプロイする場合は、次のパラメーターを設定します。設定しない場合、収集された CPU 使用率が正しくない可能性があります。詳細については、「Spring Boot アプリケーションを SchedulerX に接続する」をご参照ください。
key | 説明 | 値 | 初期バージョン |
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);
}
}