intra-mart Accel Platform TERASOLUNA Server Framework for Java (5.x) プログラミングガイド 第15版 2019-08-01

ジョブスケジューラ

ジョブスケジューラとは

ジョブスケジューラとは、ジョブと呼ばれる処理単位に事前にいつ実行するかというスケジュールを定義しておくことで
自動的に実行する機能です。1つの業務を定期的に複数回実行する場合や、大量データを扱うため時間かかる業務処理を
夜間に実行する場合などに利用します。
intra-mart Accel Platform のジョブスケジューラは、このような要求を実現するためサーバ上の Java や
サーバサイドJavaScript で構成された任意の業務処理をスケジュールで定義されたタイミングで
自動的に実行する機能や、実行状況の監視や実行結果の管理を行うための機能を提供します。

仕様

ジョブスケジューラの仕様については、ジョブスケジューラ仕様書を参照してください。

サンプルプログラム

サンプル内容

固定文字列”Hello.”に、”message”というキーに設定されたパラメータ値を連結して出力します。
Spring Framework の Application Context から GreetingService の bean を取得し、メッセージを出力します。

プログラムソース

package sample.tgfw.job.hello;

import jp.co.intra_mart.foundation.context.Contexts;
import jp.co.intra_mart.foundation.context.model.AccountContext;
import jp.co.intra_mart.foundation.job_scheduler.Job;
import jp.co.intra_mart.foundation.job_scheduler.JobResult;
import jp.co.intra_mart.foundation.job_scheduler.JobSchedulerContext;
import jp.co.intra_mart.foundation.job_scheduler.annotation.Parameter;
import jp.co.intra_mart.foundation.job_scheduler.annotation.Parameters;
import jp.co.intra_mart.foundation.job_scheduler.exception.JobExecuteException;
import jp.co.intra_mart.framework.extension.spring.context.ApplicationContextProvider;
import sample.tgfw.domain.greeting.GreetingService;

public class HelloJob implements Job {

    public HelloJob() {
    }

    @Override
    @Parameters(@Parameter(key = "message", value = "world!"))
    public JobResult execute() throws JobExecuteException {
        try {
            // アカウントコンテキスト
            final AccountContext accountContext = Contexts.get(AccountContext.class);
            System.out.println("Account context : " + accountContext.toString());

            // ジョブスケジューラコンテキスト
            final JobSchedulerContext jobSchedulerContext = Contexts.get(JobSchedulerContext.class);
            System.out.println("Job scheduler context : " + jobSchedulerContext.toString());

            // パラメータの取得
            final String message = jobSchedulerContext.getParameter("message");
            if (null == message) {
                // 処理結果:異常
                return JobResult.error("パラメータにメッセージが存在しません。");
            } else if (message.trim().isEmpty()) {
                // 処理結果:警告
                return JobResult.waring("メッセージが空です。");
            }
            // メッセージの表示
            System.out.println("Hello. " + message);

            // application contextから service beanを取得
            final GreetingService greetingService = ApplicationContextProvider.getApplicationContext().getBean(GreetingService.class);
            System.out.println(greetingService.hello());

            // 処理結果:正常
            return JobResult.success("ジョブが正常に実行されました。");
        } catch (final Exception e) {
            // 処理結果:異常(例外による処理結果の返却)
            throw new JobExecuteException("予期しないエラーが発生しました。", e);
        }
    }
}
sample.tgfw.domain.greeting.GreetingService の bean を Spring Framework の Application Context に登録するために、 モジュールプロジェクトの applicationContext*.xml に以下を追記しておきます。
<context:component-scan base-package="sample.tgfw.domain" />
  • Jobの実装クラスの作成
    Java のジョブプログラムは、jp.co.intra_mart.foundation.job_scheduler.Jobの実装クラスを作成します。
    このインタフェースには、ジョブの実行処理を記述するためのexecuteメソッドが定義されています。
    ジョブ開発者は、このexecuteメソッドにジョブ処理で実行したいプログラムを記述します。
  • Spring Framework の Application Context の取得
    Spring Framework の Application Context を取得する場合には、 jp.co.intra_mart.framework.extension.spring.context.ApplicationContextProvider.getApplicationContext() を使用してください。
    この例では、 Spring Framework の Application Context に登録されている GreetingService を取得しています。

コラム

ジョブ処理では、アカウントコンテキストとジョブスケジューラコンテキストが取得可能です。
この2つのコンテキストを利用して任意の業務処理を記述します。

アカウントコンテキスト

アカウントコンテキストには、ジョブスケジューラから実行されたことを表すアカウント情報が格納されています。

ジョブスケジューラコンテキスト

ジョブスケジューラコンテキストには、ジョブ、ジョブネット、トリガの定義情報と実行日時などの
実行情報が格納されています。

ジョブの実行方法

コラム

ジョブ管理画面からジョブを実行する方法に関しては、「テナント管理者操作ガイド」 - 「ジョブを設定する」 を参照してください。

ジョブ・ジョブネットを登録する

ここでは、ジョブを登録する例を示します。
// ジョブビルダの作成
JobBuilder jobBuilder = new JobBuilder("sample-job");
jobBuilder = jobBuilder.withLocalize("Sample Job", "This is a sample job.");// ローカライズ情報の設定
jobBuilder = jobBuilder.ofJobClass(HelloJob.class); // ジョブクラス名の登録
final JobDetail job = jobBuilder.build(); // ジョブの生成

// ジョブスケジューラマネージャの作成
final JobSchedulerManager manager = JobSchedulerManagerFactory.getJobSchedulerManager();

// ジョブを登録する
manager.insertJob(job);
ここでは、ジョブネットを登録する例を示します。
// ジョブネットビルダの作成
JobnetBuilder jobnetBuilder = new JobnetBuilder("sample-jobnet");
jobnetBuilder = jobnetBuilder.withLocalize("Sample Jobnet", "This is a sample jobnet."); // ローカライズ情報の設定
jobnetBuilder = jobnetBuilder.ofJobIdList("sample-job"); // 直列実行するジョブIDの設定
jobnetBuilder = jobnetBuilder.allowConcurrent(); // ジョブネットの同時実行の許可
jobnetBuilder = jobnetBuilder.usingParameters("message", "world!"); // パラメータの設定
final Jobnet jobnet = jobnetBuilder.build(); // ジョブネットの生成

// ジョブスケジューラマネージャの作成
final JobSchedulerManager manager = JobSchedulerManagerFactory.getJobSchedulerManager();

// ジョブネットの登録
manager.insertJobnet(jobnet);

ジョブを実行する

ここでは、指定したジョブネットを即時実行する例を示します。
final String triggerId = "sample-trigger";
try {
    final JobSchedulerManager manager = JobSchedulerManagerFactory.getJobSchedulerManager();
    try {
        final Trigger trigger = manager.findTrigger(triggerId);
        // 登録済みのトリガーを再登録して実行
        manager.updateTrigger(trigger);
    } catch (DataNotFoundException e) {
        // トリガーが存在しない場合は新規登録
        final Trigger trigger = new TriggerBuilder(triggerId).forJobnetId("sample-jobnet").onceSchedule().build();
        manager.insertTrigger(trigger);
    }
} catch (JobSchedulerException e) {
    // 例外処理
}

intra-mart Accel Platform 2014 Winter以降のジョブの即時実行方法

以下の方法でジョブの即時実行をスケジュールすることができます。
// ジョブスケジューラマネージャの作成
final JobSchedulerManager manager = JobSchedulerManagerFactory.getJobSchedulerManager();

// 指定したジョブネットの即時実行
manager.execute("sample-jobnet");