すべてのプロダクト
Search
ドキュメントセンター

Microservices Engine:Spring ジョブ

最終更新日:Apr 23, 2025

スケジュールされた Spring ジョブは、Java システムでのスケジュールされたジョブの適用を容易にしますが、エンタープライズシナリオでは多くの制限があります。SchedulerX によって管理される Spring ジョブは、エンタープライズシナリオでのより多くの要件を満たすことができます。

前提条件

接続手順

ステップ 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

構成の説明:

  • アプリケーションアクセスの構成:MSE コンソールにログインし、SchedulerX バージョン ページに移動します。左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。アプリケーションページで、管理するアプリケーションを見つけ、[操作] 列の [アクセス構成] をクリックして、アクセス構成情報を表示します。Spring ジョブを SchedulerX に初めて接続するときは、ジョブのアプリケーションを作成する必要があります。

  • 既存のジョブの自動同期の有効化:既にスケジュールされた Spring ジョブを使用しており、多数の既存のスケジュールされたジョブがある場合は、アプリケーション構成ファイルでジョブの自動同期を有効にすることができます。ステップ 3 で説明されている手動のジョブ作成操作から解放されます。リージョン ID の詳細については、「エンドポイント」をご参照ください。

重要

自動同期されたジョブがクラスタ内のネイティブ Spring ジョブと同じ実行パターンに確実に準拠するように、システムはデフォルトで「実行モード」パラメータを「ブロードキャスト実行」に設定します。この構成により、クラスタ内の各ワーカーノードは、指定された時点でジョブを同時に実行します。ジョブをクラスタ内の特定のワーカーノードで実行する必要がある場合は、SchedulerX コンソールでジョブの「実行モード」パラメータを「スタンドアロン操作」に直接設定できます。パラメータの詳細については、ステップ 3 をご参照ください。

ステップ 3:(オプション)スケジュールされたジョブを手動で作成する

説明

ステップ 2 でジョブの自動同期を有効にした場合、スケジュールされたジョブを手動で作成する必要はありません。

  1. MSE コンソールにログインし、SchedulerX バージョン ページに移動します。

  2. 左側のナビゲーションウィンドウで、[タスク] をクリックします。

  3. [タスク] ページで、[タスクの作成] をクリックします。「タスクの作成」パネルで、「タスクタイプ」ドロップダウンリストから「SpringSchedule」を選択し、クラス名とメソッド名を入力します。

    パラメータ

    説明

    タスク名

    作成するジョブの名前。

    説明

    ジョブの説明。ジョブの検索と管理を容易にするために、簡潔で明確な説明を指定します。

    アプリケーション ID

    ジョブが属するグループ。ドロップダウンリストから値を選択します。

    タスクタイプ

    ジョブの作成に使用するプログラミング言語。有効な値は、Java、Shell、Python、Golang、Http、Node.js、XXL-JOB、および DataWorks です。「Shell」、「Python」、または「Golang」を選択すると、エディタが表示されます。エディタにスクリプトを入力できます。

    この例では、このパラメータは「SpringSchedule」に設定されています。

    spring scheduleConfiguration

    ジョブの完全なクラス名とメソッド名。

    実行モード

    ジョブを実行するモード。次の実行モードがサポートされています。

    • スタンドアロン操作:ジョブはランダムなワーカーで実行されます。

    • ブロードキャスト実行:ジョブはすべてのワーカーで同時に実行され、システムはすべてのワーカーがジョブを完了するまで待機します。

    説明

    「詳細構成」セクションのパラメータは、選択した実行モードによって異なります。

    優先度

    同じアプリケーションの複数のジョブが同じワーカーで同時に実行される場合、優先度の高いジョブが最初に実行されます。ただし、同じアプリケーションの複数のジョブが複数のワーカーで実行される場合、優先度の異なるジョブは異なるワーカーにスケジュールされます。この場合、優先度の低いジョブが最初に実行される可能性があります。SchedulerX はプリエンプティブキューを使用してこの問題を回避し、キュー内の優先度の高いジョブが最初にトリガーされるようにします。詳細については、「キュー内のジョブの優先度に基づいてアプリケーションレベルのスロットリングを実行する」をご参照ください。

    タスクパラメータ

    SchedulerX がジョブを実行するときにコンテキストから取得できるランダムな文字列。

  4. トリガー頻度を構成します。

    説明

    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 タイムゾーンを選択します。

    カレンダ

    「営業日」または「金融日」を選択します。

  5. アラート条件と通知方法を構成します。通知方法の詳細については、「通知連絡先と通知連絡先グループ」をご参照ください。

    構成が完了すると、SchedulerX はスケジュールされた Spring ジョブを実行できます。コンソールは、ネイティブ Spring ジョブに、視覚化された管理と制御、ジョブログクエリ、実行チェーンビュー、ジョブ実行通知とアラートなど、エンタープライズレベルの O&M 機能も提供します。

ステップ 4:アプリケーションアクセスを確認する

  1. Spring アプリケーションを起動します。MSE コンソールにログインし、SchedulerX バージョン ページに移動します。左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。アプリケーションページで、アプリケーションの「インスタンスの総数」列の値を確認します。値が 0 より大きい場合、アプリケーションは SchedulerX に接続されています。

  1. 左側のナビゲーションウィンドウで、[タスク] をクリックします。表示されるページで、アプリケーションに対応するジョブを見つけ、[操作] 列の [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 "処理結果";
}