スケジュールされた Spring ジョブは、Java システムでのスケジュールされたジョブの適用を容易にしますが、エンタープライズシナリオでは多くの制限があります。SchedulerX によって管理される Spring ジョブは、エンタープライズシナリオでのより多くの要件を満たすことができます。
前提条件
クライアントバージョンは 1.8.13 以降です。
Spring Boot アプリケーションが SchedulerX に接続されていること。詳細については、「Spring Boot アプリケーションを SchedulerX に接続する」をご参照ください。
接続の説明
ステップ 1:pom.xml ファイルに依存関係を追加する
アプリケーションの pom.xml ファイルに依存関係とメインクラスを追加します。この例では、Spring Boot アプリケーションを使用します。
schedulerx2.version を SchedulerX エージェントの最新バージョンに置き換えます。詳細については、「エージェントリリースノート」をご参照ください。
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
<!-- Logback を使用する場合は、Log4j と Log4j2 を除外する必要があります。 -->
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>初めてスケジュールされた Spring ジョブを使用する場合でも、メインクラスで @EnableScheduling アノテーションを有効にしておきます。サンプルコード:
@SpringBootApplication
@EnableScheduling /**スケジュールされた Spring ジョブを有効にします。*/
public class SchedulerXWorkerApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulerXWorkerApplication.class, args);
}
}
/** ネイティブのスケジュールされた Spring ジョブクラス*/
@Service
public class SpringScheduledProcessor {
@Scheduled(cron = "0/2 * * * * ?")
public void hello() {
logger.info(DateUtil.now() + " hello world. start");
logger.info(DateUtil.now() + " hello world. end");
}
}上記の構成を初めて使用する場合、または上記の構成を既に使用している場合、SchedulerX はデフォルトではアプリケーション内の既存のスケジュールされた Spring ジョブを引き継ぎません。これらのジョブは引き続き Spring コンテナによってスケジュールされ、これらのジョブの実行は影響を受けません。
ステップ 2:パラメータ構成を追加する
SchedulerX がスケジュールされた Spring ジョブを引き継ぐことを許可するには、Properties ファイルに次の構成を追加します。
# 1. アプリケーションアクセスを構成します。
spring.schedulerx2.endpoint=${endpoint}
spring.schedulerx2.namespace=${namespace}
spring.schedulerx2.groupId=${groupId}
spring.schedulerx2.appKey=${appKey}
# 2. SchedulerX がスケジュールされた Spring ジョブを引き継ぐことを有効にします。
spring.schedulerx2.task.scheduling.scheduler=schedulerx
# 3. SchedulerX がスケジュールされた Spring ジョブを引き継ぐことを許可した後、自動ジョブ同期を有効にすることができます。次のパラメータはオプションです。
#spring.schedulerx2.task.scheduling.sync=true
# spring.schedulerx2.regionId=ジョブを同期するリージョンの ID(リージョン ID の詳細については、「エンドポイント」を参照してください。)
#spring.schedulerx2.aliyunAccessKey=XXXXXXXXX
#spring.schedulerx2.aliyunSecretKey=XXXXXXXXX構成手順:
アプリケーションアクセスの構成:SchedulerX コンソール にログインします。左側のナビゲーションペインで、[アプリケーション管理] をクリックします。[アプリケーション管理] ページで、管理するアプリケーションを見つけ、[操作] 列の [アクセス構成] をクリックして、アクセス構成情報を表示します。Spring ジョブを SchedulerX に初めて接続するときは、ジョブのアプリケーションを作成する必要があります。
既存のジョブの自動同期の有効化:既にスケジュールされた Spring ジョブを使用しており、多数の既存のスケジュールされたジョブがある場合は、アプリケーション構成ファイルでジョブの自動同期を有効にすることができます。ステップ 3 で説明されている手動のジョブ作成操作から解放されます。リージョン ID の詳細については、「エンドポイント」をご参照ください。
自動同期されたジョブが、クラスタ内のネイティブ Spring ジョブと同じ実行パターンに確実に準拠するように、システムは [実行モード] パラメータをデフォルトで [ブロードキャスト実行] に設定します。この構成により、クラスタ内の各ワーカーノードが指定された時点でジョブを同時に実行することが保証されます。ジョブをクラスタ内の特定のワーカーノードで実行する必要がある場合は、SchedulerX コンソールでジョブの [実行モード] パラメータを直接 [スタンドアロン操作] に設定できます。パラメータの詳細については、「ステップ 3」をご参照ください。
ステップ 3:(オプション)スケジュールされたジョブを手動で作成する
ステップ 2 でジョブの自動同期を有効にした場合は、スケジュールされたジョブを手動で作成する必要はありません。
SchedulerX コンソール にログインします。
左側のナビゲーションペインで、[タスク管理] をクリックします。
[タスク管理] ページで、[タスクの作成] をクリックします。[タスクタイプ] を [SpringSchedule] に設定し、クラス名とメソッド名を構成します。
パラメータ
説明
タスク名
作成するジョブの名前。
説明
ジョブの説明。ジョブの検索と管理を容易にするために、簡潔で明確な説明を指定します。
アプリケーション ID
ジョブが属するグループ。ドロップダウンリストから値を選択します。
タスクタイプ
ジョブの作成に使用するプログラミング言語。有効な値は、Java、Shell、Python、Golang、Http、Node.js、XXL-JOB、DataWorks です。Shell、Python、または Golang を選択すると、エディタが表示されます。エディタにスクリプトを入力できます。
この例では、このパラメータは SpringSchedule に設定されています。
spring scheduleConfiguration
ジョブの完全なクラス名とメソッド名。
実行モード
ジョブを実行するモード。次の実行モードがサポートされています。
スタンドアロン操作:ジョブはランダムなワーカーで実行されます。
ブロードキャスト実行:ジョブはすべてのワーカーで同時に実行され、システムはすべてのワーカーがジョブを完了するまで待機します。
説明[詳細設定] セクションのパラメータは、選択した実行モードによって異なります。
優先度
同じアプリケーションの複数のジョブが同じワーカーで同時に実行される場合、優先度の高いジョブが最初に実行されます。ただし、同じアプリケーションの複数のジョブが複数のワーカーで実行される場合、優先度の異なるジョブは異なるワーカーにスケジュールされます。この場合、優先度の低いジョブが最初に実行される可能性があります。SchedulerX はプリエンプティブキューを使用してこの問題を回避し、キュー内の優先度の高いジョブが最初にトリガーされるようにします。詳細については、「プリエンプティブキュー」をご参照ください。
タスクパラメータ
SchedulerX がジョブを実行するときにコンテキストから取得できるランダムな文字列。
トリガー頻度を構成します。
説明SchedulerX コンソールで指定された頻度が優先され、スケジュールされた Spring ジョブのコード内のネイティブアノテーション
@Scheduledの構成は無効になります。ただし、アノテーションはコード内に保持されます。次の表にパラメータを示します。
パラメータ
説明
時間タイプ
なし:ジョブはワークフローを使用してトリガーされます。
cron:ジョブは cron 式に基づいてスケジュールされます。
api:ジョブは API 操作を呼び出すことによってトリガーされます。
fixed_rate:ジョブは指定された間隔でトリガーされます。
second_delay:ジョブは 1 ~ 60 秒の遅延でトリガーされます。
one_time:ジョブは指定された時点で 1 回だけトリガーされます。
Cron 式
ジョブのスケジュールに使用される cron 式。cron 構文に基づいて cron 式を手動で入力できます。また、SchedulerX が提供するツールを使用して、有効な cron 式を自動的に生成することもできます。
固定頻度
ジョブがトリガーされる間隔。このパラメータは、[タスクタイプ] パラメータが fixed_rate に設定されている場合にのみ使用できます。値は 60 より大きい必要があります。単位:秒。たとえば、値 200 は、ジョブが 200 秒間隔でトリガーされることを示します。
固定遅延
固定遅延。このパラメータは、[タスクタイプ] パラメータが second_delay に設定されている場合にのみ使用できます。有効な値:1 ~ 60。単位:秒。たとえば、値 5 は、ジョブが 5 秒の遅延でトリガーされることを示します。
次の表に、高度なタイミング構成を示します。
パラメータ
説明
時間オフセット
処理するデータのタイムスタンプとジョブがトリガーされる時間のオフセットを指定します。SchedulerX がジョブを実行するときに、コンテキストからオフセット値を取得できます。
タイムゾーン
ビジネス要件に基づいて、国または地域のタイムゾーンを選択するか、GMT タイムゾーンを選択します。
カレンダー
[平日] または [営業日] を選択します。
アラート条件と通知方法を構成します。通知方法の詳細については、「通知連絡先と通知連絡先グループ」をご参照ください。
構成が完了すると、SchedulerX はスケジュールされた Spring ジョブを実行できます。コンソールは、視覚化された管理と制御、ジョブログクエリ、実行チェーンビュー、ジョブ実行通知とアラートなど、エンタープライズレベルの O&M 機能をネイティブ Spring ジョブに提供します。
ステップ 4:アプリケーションアクセスを確認する
Spring アプリケーションを起動します。SchedulerX コンソールにログインします。左側のナビゲーションペインで、[アプリケーション管理] をクリックします。[アプリケーション管理] ページで、アプリケーションの [インスタンスの総数] 列の値を確認します。値が 0 より大きい場合、アプリケーションは SchedulerX に接続されています。

左側のナビゲーションペインで、[タスク管理] をクリックします。表示されるページで、アプリケーションに対応するジョブを見つけ、[操作] 列の [1 回実行] をクリックします。ジョブが正常に実行されると、構成が有効になります。
FAQ
SchedulerX がスケジュールされた Spring ジョブを引き継いだ後、元の Spring タイマーが引き続き実行されるのはなぜですか?
アプリケーションでカスタムスケジューラが指定されている場合、SchedulerX はカスタムスケジューラを上書きします。アプリケーションプロジェクトに org.springframework.scheduling.annotation.SchedulingConfigurer インターフェースを実装するクラスが存在するかどうか、および ScheduledTaskRegistrar の setScheduler メソッドがデフォルトのスケジューラを上書きするために呼び出されているかどうかを確認します。クラスが存在するか、メソッドが呼び出されている場合は、関連するコードをコメントアウトします。
Spring ジョブのコンテキストを取得するにはどうすればよいですか?
コンテキストを取得するには、アプリケーションプロジェクトコードに次のコードを追加します。
JobContext jobContext = ContainerFactory.getContainerPool().getContext();Spring ジョブは処理結果を返しますか?
クライアントのバージョンが 1.10.11 以降の場合、Spring ジョブは処理結果を返すことができます。処理結果は、指定されたスケジューリング方法に基づいて返されます。
@Scheduled(cron = "0/5 * * * * ?")
public ProcessResult helloStandalone1() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. start");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. end");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. exception end..");
}
return new ProcessResult(true, "処理結果");
}
@Scheduled(cron = "0/5 * * * * ?")
public String helloStandalone2() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. start");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. end");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. exception end..");
}
return "処理結果";
}