[フレームワーク]スケジューラ

バッチアプリケーション開発において、業務処理をスケジュールを組んで、実行したいという要求があります。
業務処理をスケジュールして実行するには、スケジュールを管理する機能と、スケジュールを起動して実行する機能が必要です。

スケジュール実行には、以下のような機能が必要となります。

  • スケジュールの起動と、スケジュールの実行は異なるスレッドで行う
  • スケジュールは、並列に実行できる
  • スケジュールは、分散して実行できる
  • スケジュール間の依存関係を考慮して実行する
  • スケジュールの実行の失敗を検知する

スケジュール管理には、以下のような機能が必要となります。

  • スケジュールをマスタ管理し、日毎のスケジュール実行を管理する
  • スケジュールの開始時間を指定できること
  • スケジュールで実行する業務処理を指定できること
  • スケジュール間の依存関係を指定できること
  • スケジュール状態を管理し保存できること

Nimbusには、2つのスケジューラ実装があります。

簡易スケジューラ高機能スケジューラです。
簡易スケジューラは、Nimbus2で廃止されているため非推奨です。

関連するパッケージは、以下です。

簡易スケジューラ

簡易なスケジューラです。
簡易である故の制限として、

  • スケジュールのマスタと日毎のスケジュール管理という概念を持っていないため、当日のスケジュールしか管理できません。
    そのため、保存したスケジュールの状態は、適切なタイミングで削除する必要があります。
  • スケジュールの起動と、スケジュールの実行は、基本的には同一スレッドで行います。
    実行スレッドを分ける事もできますが、スケジュール毎にスレッドを割り当てる仕組みであるため、同時処理スレッド数の制限などのスレッドのリソース管理に難があります。
  • 分散でのスケジュール実行をサポートしません。

スケジュールの起動を行う機能を抽象化したのがScheduler
スケジュールの生成を行う機能を抽象化したのがScheduleFactory
スケジュールの状態保存を行う機能を抽象化したのがScheduleStateManager
スケジュールを抽象化したのがSchedule
スケジュールの実行を行う機能を抽象化したのがScheduleTask

スケジュール起動インタフェース Scheduler

インタフェースjp.ossc.nimbus.service.scheduler.Schedulerは、ScheduleFactoryから取得したScheduleの起動を行う機能を抽象化したものです。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler.TimerSchedulerServiceデフォルト実装。java.util.Timerを利用して、スケジュールの起動を行う

スケジュール生成インタフェース ScheduleFactory

インタフェースjp.ossc.nimbus.service.scheduler.ScheduleFactoryは、引数で指定されたキーに該当するScheduleを生成する機能を抽象化したものです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler.Schedulerスケジュールを取得するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler.SimpleScheduleFactoryService引数のキーは無視して、サービス定義でインジェクションした固定のスケジュール配列を生成する
jp.ossc.nimbus.service.scheduler.KeyMappingScheduleFactoryService引数のキーに該当するScheduleFactoryからスケジュール配列を生成する
jp.ossc.nimbus.service.scheduler.DateMappingScheduleFactoryService引数のキーをjava.util.Dateとみなして、日付条件に該当するScheduleFactoryからスケジュール配列を生成する
jp.ossc.nimbus.service.scheduler.DatabaseTimerScheduleFactoryServiceデータベースからスケジュールを読み込み、引数のキーに該当するスケジュール配列を生成する

スケジュール状態保存インタフェース ScheduleStateManager

インタフェースjp.ossc.nimbus.service.scheduler.ScheduleStateManagerは、スケジュールの実行状態を保存する機能を抽象化したものです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler.Schedulerスケジュールの状態を保存するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler.DefaultScheduleStateManagerServiceデフォルト実装。スケジュールの状態をCacheMapに保存します。
jp.ossc.nimbus.service.scheduler.DatabaseScheduleStateManagerServiceスケジュールの状態をデータベースに保存します。

スケジュールインタフェース Schedule

インタフェースjp.ossc.nimbus.service.scheduler.Scheduleは、スケジュールを抽象化したものです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler.Scheduler実行するスケジュールとして使用する
jp.ossc.nimbus.service.scheduler.ScheduleFactoryスケジュールを提供するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler.TimerScheduleServiceデフォルト実装。

スケジュール実行インタフェース ScheduleTask

インタフェースjp.ossc.nimbus.service.scheduler.ScheduleTaskは、スケジュールを実行する機能を抽象化したものです。
このインタフェースを直接実装したアプリケーションを作成する事も可能です。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler.Scheduleスケジュールを実行するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler.BeanFlowCallScheduleTaskService業務フローを呼び出す
jp.ossc.nimbus.service.scheduler.IOCCallScheduleTaskServiceIOCを呼び出す

サンプルは、以下。

高機能スケジューラ

実行するスケジュールを日付毎に管理し、クラスタを組んで分散実行が可能な高機能なスケジューラです。
スケジュールの依存性管理はもとより、実行遅延監視やスケジュールのリスケジュール機能なども持ちます。

スケジュールの起動を行う機能を抽象化したのがScheduler
日付の概念を持たないスケジュールのマスタとなる機能を抽象化したのがScheduleMaster
当日実行するスケジュールの機能を抽象化したのがSchedule
スケジュールマスタから当日に実行するスケジュールを作成する機能を抽象化したのがScheduleMaker
当日に実行するスケジュールを管理する機能を抽象化したのがScheduleManager
スケジュールの実行を行う機能を抽象化したのがScheduleExecutor
スケジュールの管理をHTTPで行うScheduleManagerServlet

スケジュール起動インタフェース Scheduler

インタフェースjp.ossc.nimbus.service.scheduler2.Schedulerは、ScheduleManagerから現在実行すべきスケジュールを取得してキューに投入し、プールした実行スレッドでスケジュールをScheduleExecutorに渡して実行する機能を抽象化したものです。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler2.DefaultSchedulerServiceデフォルト実装。起動するスケジュールをQueueHandlerContainerに投入する。
jp.ossc.nimbus.service.scheduler2.JMSSchedulerService起動するスケジュールをJMS Queueに投入する。

スケジュール作成インタフェース ScheduleMaker

インタフェースjp.ossc.nimbus.service.scheduler2.ScheduleMakerは、jp.ossc.nimbus.service.scheduler2.ScheduleMasterから当日に実行するjp.ossc.nimbus.service.scheduler2.Scheduleを作成する機能を抽象化したものです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler2.ScheduleManagerスケジュールマスタからスケジュールを作成するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler2.DefaultScheduleMakerServiceデフォルト実装。
jp.ossc.nimbus.service.scheduler2.DateKeyConditionScheduleMakerServiceスケジュールを作成するかどうかの条件判定を日付で行う
jp.ossc.nimbus.service.scheduler2.BeanFlowConditionScheduleMakerServiceスケジュールを作成するかどうかの条件判定を業務フローで行う
jp.ossc.nimbus.service.scheduler2.DatabaseConditionScheduleMakerServiceスケジュールを作成するかどうかの条件判定をSQLで行う

スケジュール管理インタフェース ScheduleManager

インタフェースjp.ossc.nimbus.service.scheduler2.ScheduleManagerは、ScheduleMakerScheduleMasterを渡して、当日のScheduleを作成する機能と、スケジュールを管理及び監視する機能を抽象化したものです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler2.Schedulerスケジュールの検索、リスケジュール、スケジュールの状態変更を行うために使用する
jp.ossc.nimbus.service.scheduler2.ScheduleExecutorスケジュールの状態変更を行うために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler2.DefaultScheduleManagerServiceデフォルト実装。スケジュールをメモリまたはファイルで管理します。スケジュールの状態を他JVM上のScheduleManagerと共有できないため、クラスタはサポートしません。
jp.ossc.nimbus.service.scheduler2.DatabaseScheduleManagerServiceスケジュールをデータベースで管理します。

スケジュール実行インタフェース ScheduleExecutor

インタフェースjp.ossc.nimbus.service.scheduler2.ScheduleExecutorは、Scheduleを実行及び実行中のScheduleを制御する機能を抽象化したものです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービス用途
jp.ossc.nimbus.service.scheduler2.Schedulerスケジュールを実行するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.scheduler2.BeanFlowScheduleExecutorService業務フローを呼び出します
jp.ossc.nimbus.service.scheduler2.ConcentrateScheduleExecutorService集配信スケジュールを業務フローで実行し、ConcentrateBackupManagerで集配信したオブジェクトをバックアップします
jp.ossc.nimbus.service.scheduler2.CommandScheduleExecutorServiceシェルやバッチなどのコマンドを実行します

サンプルは、以下。