Show page source of Function/service/scheduler2/DefaultSchedulerService #96580

= 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]