= Scheduler実装サービス jp.ossc.nimbus.service.scheduler2.!DefaultSchedulerService [http://nimbus.sourceforge.jp/reports/apidocs/jp/ossc/nimbus/service/scheduler2/DefaultSchedulerService.html jp.ossc.nimbus.service.scheduler2.DefaultSchedulerService]は、スケジュールを[wiki:Function/service/queue#header_Queue Queue]を使って非同期処理する[http://nimbus.sourceforge.jp/reports/apidocs/jp/ossc/nimbus/service/scheduler2/Scheduler.html Scheduler]実装サービスです。 このサービスは、実行すべきスケジュールを監視するスレッドを1つ持ちます。[[BR]] 監視スレッドは、定期的にスケジュールを管理する[wiki:Function/service/scheduler#header_scheduler2_ScheduleManager ScheduleManager]に「現在実行すべきスケジュール」を問い合わせます。[[BR]] 「現在実行すべきスケジュール」が存在する場合、スケジュールを取得して、[wiki:Function/service/queue#header_Queue Queue]にスケジュールを投入します。その際、!ScheduleManagerに依頼して、スケジュールの状態を「投入」に変更します。[[BR]] また、このサービスは、内部に[wiki:Function/service/queue#header_QueueHandlerContainer QueueHandlerContainer]を持ちQueueに投入されたスケジュールを受けとる処理スレッドをプールしています。[[BR]] 処理スレッドは、Queueからスケジュールを受け取ると、[wiki:Function/service/scheduler#header_scheduler2_ScheduleExecutor ScheduleExecutor]にスケジュールの実行を依頼します。その際、!ScheduleManagerに依頼して、スケジュールの状態を「実行中」に変更します。[[BR]] その後、!ScheduleExecutorの応答に応じて、!ScheduleManagerに依頼してスケジュールの状態を「正常終了」、「異常終了」、「中断」、「リトライ」などに変更します。[[BR]] スケジューラのクラスタ化は、Active-Active構成とActive-Standby構成の2パターンあります。[[BR]] クラスタ化する場合、前提として、[wiki:Function/service/scheduler#header_scheduler2_ScheduleManager ScheduleManager]の実装サービスが、サーバを跨いでもスケジュールを共有できる実装である必要があります。 Active-Active構成の場合は、それぞれのサーバ上のスケジューラは、互いの存在を意識する事なく動作します。[[BR]] そのため、利点としては、分散設計が単純である(フェイルオーバがない)ことです。[[BR]] 逆に欠点は、サーバ間でスケジュールの処理割り当ての調整を行わないため、ロードバランスとしては、適切には行われません。取ったもの勝ちで処理していきます。但し、属性!ExecutorKeyでスケジューラに論理的な名前を与える事が可能で、スケジュール毎に処理するスケジューラを指定する事で、静的にロードバランスを決める事はできます。[[BR]] Active-Standby構成の場合は、スケジューラは、どこか1台のサーバのみが稼働します。但し、待機系のサーバは、純粋に待機している訳ではなく、スケジュールを実行する!ScheduleExecutorは稼働します。つまり、スケジュールを監視して投入するサーバは1台ですが、実行は全サーバのどこかにロードバランスして、実行することで、負荷分散を行います。[[BR]] そのため、利点としては、各サーバの負荷に応じてロードバランスを行う事ができ、リソースを有効に活用できる事です。もちろん、Active-Active構成の時と同様に、スケジュール毎に静的なロードバランスを指定する事もできます。但し、待機系のスケジューラは稼働しないため、スケジュール割り当てのための論理名は、!ScheduleExecutorの属性!ExecutorKeyで設定します。[[BR]] 逆に、欠点としては、分散設計が複雑である(フェイルオーバがあり、稼働系と待機系で異なる挙動をしている)ことです。[[BR]] ロードバランスのポリシーは、[wiki:Function/service/keepalive#header_KeepAliveCheckerSelector jp.ossc.nimbus.service.keepalive.KeepAliveCheckerSelector]サービスの実装クラスに依存します。[[BR]] このサービスは、複合的なサービスで、以下のサービスを下位サービスとして使用します。 ||下位サービスインタフェース||用途|| ||[wiki:Function/service/scheduler#header_scheduler2_ScheduleManager jp.ossc.nimbus.service.scheduler2.ScheduleManager]||実行すべきスケジュールを取得する。|| ||[wiki:Function/service/scheduler#header_scheduler2_ScheduleExecutor jp.ossc.nimbus.service.scheduler2.ScheduleExecutor]||スケジュールの実行を依頼する。|| ||[wiki:Function/service/keepalive/ClusterService jp.ossc.nimbus.service.keepalive.ClusterService]||スケジューラをクラスタ化する。|| ||[wiki:Function/service/sequence#header_Sequence jp.ossc.nimbus.service.sequence.Sequence]||スケジュールの処理通番を発行する。|| ||[wiki:Function/service/context/ThreadContextService jp.ossc.nimbus.service.context.ThreadContextService]||スケジュールの処理通番を設定する。|| ||[wiki:Function/service/transaction#header_TransactionManagerFactory jp.ossc.nimbus.service.transaction.TransactionManagerFactory]||javax.transaction.!TransactionManagerを取得する|| ||[wiki:Function/service/queue#header_Queue jp.ossc.nimbus.service.queue.Queue]||スケジュールの実行を非同期に行うためのキュー。|| 以下に簡単なサービス定義を示します。 {{{ code xml <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE server PUBLIC "-//Nimbus//DTD Nimbus 1.0//JA" "http://nimbus.sourceforge.jp/dtd/nimbus-service_1_0.dtd"> <server> <manager> <!-- スケジューラサービス --> <service name="Scheduler" code="jp.ossc.nimbus.service.scheduler2.DefaultSchedulerService"> <!-- ScheduleManagerサービスのサービス名を設定する --> <attribute name="ScheduleManagerServiceName">#ScheduleManager</attribute> <!-- ScheduleExecuterサービスのサービス名を設定する --> <attribute name="ScheduleExecutorServiceName">#ScheduleExecutor</attribute> <!-- スケジュール実行スレッド数を設定する --> <attribute name="ScheduleDispatcherSize">5</attribute> <depends>ScheduleManager</depends> <depends>ScheduleExecutor</depends> </service> <!-- ScheduleManagerサービス --> <service name="ScheduleManager" code="jp.ossc.nimbus.service.scheduler2.DefaultScheduleManagerService"> <attribute name="ScheduleMasterServiceNames"> #ScheduleMaster1 #ScheduleMaster2 #ScheduleMaster3 #ScheduleMaster4 </attribute> <attribute name="PersistDir">./schedule</attribute> <depends> <!-- スケジュールマスタ1 08:00:00にFlow1を実行するスケジュール --> <service name="ScheduleMaster1" code="jp.ossc.nimbus.service.scheduler2.DefaultScheduleMaster"> <attribute name="Id">Schedule1</attribute> <attribute name="TaskName">Flow1</attribute> <attribute name="StartTime">// 08:00:00 000</attribute> </service> </depends> <depends> <!-- スケジュールマスタ2 スケジュールマスタ1の終了を待って、08:00:00にFlow2を実行するスケジュール --> <service name="ScheduleMaster2" code="jp.ossc.nimbus.service.scheduler2.DefaultScheduleMaster"> <attribute name="Id">Schedule2</attribute> <attribute name="TaskName">Flow2</attribute> <attribute name="StartTime">// 08:00:00 000</attribute> <attribute name="Input">100</attribute> <attribute name="Depends">Schedule1</attribute> </service> </depends> <depends> <!-- スケジュールマスタ3 スケジュールマスタ2の終了を待って、08:01:00から08:02:00まで5秒間隔にFlow3を実行するスケジュール --> <service name="ScheduleMaster3" code="jp.ossc.nimbus.service.scheduler2.DefaultScheduleMaster"> <attribute name="Id">Schedule3</attribute> <attribute name="TaskName">Flow3</attribute> <attribute name="StartTime">// 08:01:00 000</attribute> <attribute name="EndTime">// 08:02:00 000</attribute> <attribute name="RepeatInterval">5000</attribute> <attribute name="Depends">Schedule2</attribute> </service> </depends> <depends> <!-- スケジュールマスタ4 スケジュールマスタ1とスケジュールマスタ3の終了を待って、08:00:00から08:03:00までFlow4の結果でリトライを指示される限り、10秒間隔でFlow4を実行するスケジュール 08:03:00に達しても、リトライを指示された場合は、エラー終了する --> <service name="ScheduleMaster4" code="jp.ossc.nimbus.service.scheduler2.DefaultScheduleMaster"> <attribute name="Id">Schedule4</attribute> <attribute name="TaskName">Flow4</attribute> <attribute name="StartTime">// 08:00:00 000</attribute> <attribute name="Depends">Schedule1,Schedule3</attribute> <attribute name="RetryInterval">10000</attribute> <attribute name="RetryEndTime">// 08:03:00 000</attribute> </service> </depends> </service> <!-- ScheduleExecuterサービス --> <service name="ScheduleExecutor" code="jp.ossc.nimbus.service.scheduler2.BeanFlowScheduleExecutorService"> <attribute name="ScheduleManagerServiceName">#ScheduleManager</attribute> <attribute name="BeanFlowInvokerFactoryServiceName">#BeanFlowInvokerFactory</attribute> <depends>ScheduleManager</depends> <depends>BeanFlowInvokerFactory</depends> </service> <!-- BeanFlowInvokerを生成するBeanFlowInvokerFactoryサービス --> <service name="BeanFlowInvokerFactory" code="jp.ossc.nimbus.service.beancontrol.DefaultBeanFlowInvokerFactoryService"> <attribute name="DirPaths">flows</attribute> <attribute name="BeanFlowInvokerAccessClass">jp.ossc.nimbus.service.beancontrol.BeanFlowInvokerAccessImpl2</attribute> <attribute name="Validate">true</attribute> </service> </manager> </server> }}} ---- [wiki:Function/service/scheduler#header_scheduler2_Scheduler スケジューラ/高機能スケジューラ/Scheduler]