PEXA Supportについて

PEXAプロパティ

トランスレータ

印刷フレームワーク

AETフレームワーク

ワークフロー

動的フォーム

変換フレームワーク

テンプレートエンジン

カレンダー

タスクスケジューラー

目次

  1. はじめに
  2. タスクスケジューラー機能の全体構成
    1. TaskScheduleマスタ
    2. Taskスキーマ
    3. TaskSchedulerFacade
    4. TaskScheduleClock
  3. タスクスケジューラー機能の利用手順
    1. Task実行する処理の実装
    2. Taskスキーマの作成
    3. TaskScheduleマスタにスケジュール登録
    4. TaskScheduleClockの実行(Jboss)
    5. TaskScheduleClockの実行(JWildFly)


はじめに

このドキュメントは、タスクスケジューラー機能のアーキテクチャについて解説するものです。

タスクスケジューラー機能を利用するにはいくつか作業が発生します。
このドキュメントに一通り目を通して全体構成を把握した上で利用して下さい。


タスクスケジューラー機能の全体構成

TaskScheduleマスタ

タスクスケジュール情報を登録するマスタデータモデルです。
このマスタデータモデルは、PEXA標準提供のデータモデル定義「DML_PEXA_000021 - TaskSchedule」として提供されます。

このマスタの内容及び、ケース毎の登録内容については後述します。


Taskスキーマ

スケジュール実行したいタスクの詳細を記述する定義ファイルです。
TaskScheduleマスタに登録する実行スケジュールでは、このTaskスキーマに記述したTaskの名前を指定します。

Taskはタイプとして以下の2種類があります。

  • ServiceClientタイプ:文字通りServiceの呼出元として動作します。
  • Pluginタイプ:指定されたインタフェースを実装するプラグインクラスを呼び出します。
Taskスキーマの詳細については、こちらを参照して下さい。


TaskSchedulerFacade

StatelessSessionBeanとして提供される、タスクスケジューラー機能の実体です。
TaskScheduleClockから定期的(基本的に1分に1回)にonClockメソッドを呼び出されて、 TaskScheduleマスタを参照して実行クロックとマッチングするタスクスケジュールがあれば実行します。

なお、このEJBはトランザクション無し(Never指定)の物となります。
これは、TaskSchedulerFacadeがあくまでタスクの呼出元でしかないことや、 スケジュールが合致したTaskはそれぞれを別スレッドで非同期に実行するためです。

サービスを呼び出すタイプのタスクの場合、TaskはあくまでServiceClientに相当する物となりますので、 トランザクションはTaskの単位では無く、呼び出されたService毎になります。 そのため、1つのトランザクションで複数のサービスを実行したい場合は、 入り口となるサービスをTask側から1つ呼出して、その中で複数のサービスを呼び出して下さい。

もしTask側で複数のサービスを呼び出した場合、 それはServiceClientから連続でServiceを呼び出したのと同じようにそれぞれが別のトランザクションで動作することになります。 これを理解した上で、データの一貫性に矛盾が出ないことが分かっていればあえて分割実行することもできます。


TaskScheduleClock

TaskSchedulerFacadeに実行クロックを送信するモジュールです。
起動しておけば1分毎に定期的にTaskSchedulerFacadeのonClockメソッドを呼び出します。
これにより、分指定の実行スケジュールが登録された場合でも、60秒以内の精度でTaskを実行できます。

このモジュールは、コマンドラインから実行する単純なJavaクラスとなっています。
この形と取ることで、実行時のクラスパス設定のみ接続するAPサーバーに合わせて変更すれば、どの環境でも実行することが可能となっています。
JBoss向けの実行スクリプトのサンプルがありますので、そちらを利用して下さい。



タスクスケジューラー機能の利用手順

ここからは、タスクスケジューラー機能を利用するために必要な作業内容について順を追って説明します。
以下のような作業が発生します。

それぞれについて、以降を参照して下さい。


Task実行する処理の実装

まず、実際に実行したい処理の実装を行います。
Taskのタイプには、以下の2種類があります。

  • ServiceClientタイプ:Task定義中で指定されたサービスの呼出を行います。
  • Pluginタイプ:Task定義中で指定されたプラグインクラスの呼出を行います。
それぞれについて以下で説明します。

ServiceClientタイプ

このタイプのTaskは、Serviceの呼出を行います。
そのため、実行したい処理は以下の要件を満たすService定義で記述して下さい。

  • サーバイサイド(service_location=server)
  • 呼出パラメータ無しで単独で動作する
なお、Task自体はあくまでServiceClientの扱いになりますので、トランザクションはTaskの時点ではかかっていません。
呼び出されたService側で初めてトランザクションがかかりますので、 1タスクから複数のServiceを呼び出した場合はそれぞれが別のトランザクションで実行されることになります。


Pluginタイプ

このタイプのTaskは、Pluginクラスの呼出を行います。
そのため、実行したい処理は以下のインタフェースをimplementsしたJavaクラスとして作成して下さい。

    pexa.share.task.TaskHelper
このインタフェースで宣言されている、以下のメソッドで実行処理を実装して下さい。
/**
 * タスクを実行する
 * @param taskNameKey 実行タスク名(Key)
 * @param taskSchemaInfo 実行タスクスキーマ情報Map
 * @param resource 実行時カーネルリソース
 */
public void doTask(Key taskNameKey, Map taskSchemaInfo, Resource resource);
なお、ServiceClientタイプの説明にもあったとおり、このdoTaskメソッドはトランザクションの外で実行されます。
基本的にこのPluginタイプのTaskはトランザクションが必要ないタイプの処理を実装するようにして下さい。
トランザクションが必要であるなら、ServiceClientタイプにしてServiceを呼出して、その中でProcessプラグインを呼ぶなどの手段を考えて下さい。



Taskスキーマの作成

実行したい処理を実装したら、それをTaskスキーマに登録します。
タスクスキーマは、以下の格納場所及びファイル名になります。

    ${PRJHOME}/src/task/task.entry
中身はテキストファイルで、PEXAプロパティ形式で記述されます。

このTaskスキーマでは、以下の要素を記述します。
  • TaskScheduleClockの実装クラス指定
  • 実行クロックの間隔、初期化時のスキップ指定
  • 実行タスクの登録
ここで登録したタスクの名前を、後述のTaskScheduleマスタで実行スケジュールと一緒に指定します。
Taskスキーマの構成についてはこちらを参照して下さい。

Taskスキーマの記述例

;---------------------------------------------------------------
; Release-Date:     $Date:: 2016-03-22 10:56:48 #$
; Release-Version:  $Revision: 8406 $
; Author:           $Author: tann $
; First-Created-On: 2011/04/25
; First-Created-By: Daisuke Morishita
;---------------------------------------------------------------
task_clock_provider  "pexa.ext.server.service.jboss.JBossTaskScheduleClock"
task_clock_noexec    "1"
task_clock_interval  "60000"
[task_infos
    ;;===========================================
    ;; Task : TestServiceClientTask
    ;; サービスを呼び出すタイプのタスク
    ;;===========================================
    task_name   TestServiceClientTask
    task_type   service_client
    (service_client
        [services
            (SSR.Test.ServiceTask1
            )
            (SSR.Test.ServiceTask2
            )
        ]
    )
    ,
    ;;===========================================
    ;; Task : TestPluginTask
    ;; プラグインクラスを呼び出すタイプのタスク
    ;;===========================================
    task_name   TestPluginTask
    task_type   plugin
    (plugin
        class   "test.pexa.share.task.TestTaskPlugin"
    )
]



TaskScheduleマスタにスケジュール登録

実行したいTaskの実装及び定義が終わったら、TaskScheduleマスタに該当Taskの実行スケジュールを登録します。
このTaskScheduleマスタでは、以下の項目で実行スケジュールを表現します。

現象型ID 現象型名 説明
PT_PEXA_100153 TaskScheduleYear 実行年(西暦)。指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100154 TaskScheduleMonth 実行月(1~12)。指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100155 TaskScheduleDay 実行日(1~31)。指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100156 TaskScheduleHour 実行時(0~23)。指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100157 TaskScheduleMinute 実行分(0~59)。指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100158 TaskScheduleDayOfWeek 実行曜日(1[Sunday]~7[Saturday])。指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100159 TaskScheduleExecTask 実行したい処理を、Taskスキーマで宣言したタスク名で設定する

上記は、ほぼLinuxのcronと同じ項目の持ち方となっており、設定値もほぼ同じ形式となります。
以下のルールに従います。

  • 指定無しの場合は"*"を設定する。(例:毎年ならTaskScheduleYearに"*"と設定)
  • 特定のタイミングのみの場合は対応する数字を設定する。(毎月の1日ならTaskScheduleDayに"1"と設定)
  • 複数タイミングの場合は対応する数字はカンマ区切りで列挙する(0時と12時ならTaskScheduleHourに"0,12"と設定する)
上記のルールにより、なるべく1行のデータで複数の実行タイミングを表現できるようにしています。
もしこれで1行データで表現しきれなければ、例えば1Taskの実行スケジュールを複数行のデータで表現しても構いません。
いくつか設定例を挙げておきます。

例1:毎月1日の0時0分と12時0分に実行する場合

  • TaskScheduleYear="*"
  • TaskScheduleMonth="*"
  • TaskScheduleDay="1"
  • TaskScheduleHour="0,12"
  • TaskScheduleMinute="0"
  • TaskScheduleDayOfWeek="*"


例2:毎週月曜日の0時0分に実行する場合

注意:TaskScheduleDayOfWeekは、1が日曜日、2が月曜日・・・7が土曜日となる。

  • TaskScheduleYear="*"
  • TaskScheduleMonth="*"
  • TaskScheduleDay="*"
  • TaskScheduleHour="0"
  • TaskScheduleMinute="0"
  • TaskScheduleDayOfWeek="2"


例3:毎年6月と12月の1日および15日の午前1時0分に実行する場合

  • TaskScheduleYear="*"
  • TaskScheduleMonth="6,12"
  • TaskScheduleDay="1"
  • TaskScheduleHour="1"
  • TaskScheduleMinute="0"
  • TaskScheduleDayOfWeek="*"



TaskScheduleClockの実行(Jboss)

ここまで準備が出来たら、あとはTaskScheduleClockを実行してTaskSchedulerFacadeに定期的の実行クロックを送信します。
このTaskScheduleFacadeは、単純なコマンドライン実行プログラムとなっています。起動させておけば一分毎に定期的にクロックを送信してくれます。

JNDI及びRMI通信でクロック送信を行うので、APサーバー毎に適切なクラスパスを設定して実行する必要があります。
JBoss向けの実行スクリプトのサンプルが以下に用意されています。

  • ${PRJHOME}/etc/config/jboss/JBossTaskScheduleClock.bat
  • ${PRJHOME}/etc/config/jboss/JBossTaskScheduleClock.sh
どちらも内容はほぼ同じです。
これらのファイルをコピーして、実行環境向けにパスの設定を書き換えて実行します。

上記のスクリプトを使用する場合、変数として以下の3つを書き換えて下さい。

  • JAVA_HOME:JDKのインストール先ディレクトリ
  • JBOSS_HOME:接続先のJBossのインストール先ディレクトリ
  • PEXALIBPATH:後述のPEXAのjarファイル及びjndi.propertiesの格納先ディレクトリ

書き換えたら、PEXALIBPATHで指定したディレクトリに、以下のファイルをコピーして格納して下さい。

  • ${PRJHOME}/lib/pexa/pexataskclock.jar
  • ${PRJHOME}/etc/config/jboss/jndi.properties
ここまで準備が出来たら、あとはスクリプトを実行することで起動するはずです。
このプログラムは一度起動したら、killされるまでは動き続けますので、 終了させる場合はkillコマンドやタスクマネージャ、Ctrl+C等で終了して下さい。


TaskScheduleClockの実行(JWildFly)

基本的にJBOSSと同じように実行しますが、jndi.propertiesは以下のようになります。
java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://localhost:8080
java.naming.factory.url.pkgs=org.jboss.naming.client
java.naming.security.principal=ejb3
java.naming.security.credentials=ejb3_pexa
j2ee.clientName=

起動用のバッチファイルは、サンプルが、以下のフォルダに準備してあります。

  • ${PRJHOME}/etc/config/wildfly/WildFlyTaskScheduleClock.bat
.shファイルは、Jbossを参考にして作成してください。

上記のスクリプトを使用する場合、変数として以下の4つを書き換えて下さい。
  • JAVA_HOME:JDKのインストール先ディレクトリ
  • WILDFLY_HOME:接続先のWILDFLYのインストール先ディレクトリ
  • JNDIPATH:jndi.propertiesの格納先ディレクトリ
  • PRJNAME: プロジェクト名(小文字)
例:
set JAVA_HOME=C:\java\jdk1.8.0_66
set WILDFLY_HOME=C:\jboss\wildfly-9.0.2.Final
set JNDIPATH=%PRJHOME%\xtemp
set PRJNAME=pwtest

ここまで準備が出来たら、あとはスクリプトを実行することで起動するはずです。
このプログラムは一度起動したら、killされるまでは動き続けますので、
終了させる場合はkillコマンドやタスクマネージャ、Ctrl+C等で終了して下さい。


更新情報

  • 最終更新者 : $Author: tann $
  • 最終更新日時 : $Date:: 2016-03-22 10:56:48 #$
  • バージョン : $Revision: 8406 $



Copyright © 2006, Atrris Corporation