CData Software Blog

クラウド連携のCData Software の技術ブログです。

ジョブ同士をつなげて、前のジョブ結果で別ジョブの実行有無を制御する方法:CData Sync

f:id:sennanvolar44:20210922150406p:plain こんにちは!テクニカルサポートエンジニアの宮本です!

今回は CData Sync のジョブ同士をシリアルにつなげる方法を試していきます。
というのも、Sync のジョブはそれぞれが独立されているため、他のジョブ結果を待たずにスケジュールされた時間で実行されるようになっています。

しかし、このようなジョブがあったとき、
①:kintone → MySQL
②:SalesforceMySQL

①のジョブが正常終了してから②を実行したいという要件も存在するかと思います。そのような時に今回ご紹介する方法で制御することが可能になります。

それでは実際にやっていきましょう。

手順

内容は上記で示した①②のジョブ同士を Post-JOB でつなげ、①のジョブが正常終了したら②のジョブを実行するという流れをやっていきます。
なお、Post-JOB とはジョブ実行後に何か実行したい場合にコードで定義することができる設定エリアになります。

https://cdn.cdata.com/help/ASG/jp/sync/Events.html

先頭ジョブの Post-JOB を設定

まず、①のジョブ(kintone → MySQL)で定義しているジョブはこのようになっています。
f:id:sennanvolar44:20210921234938p:plain

このジョブが実行されたあとに行いたい内容は、こちらのPost-JOB 画面で設定します。
f:id:sennanvolar44:20210921235218p:plain

設定内容をこちらになります。この内容をPost-JOB にもともとあるコメントの Code goes here の下に追記してください。

<!-- Code goes here -->
<api:set attr="statusjob.JobName" value="kin2mysql"/>
<api:call op="~/api/getJobStatus.rsb"  in="statusjob" out="_out" >
    <api:set attr="status" value="[_out.Status]" />
    <api:if attr="status" value="SUCCESS" operator="equals"> 
        <api:set attr="job.JobName"        value="sf2mysql-jobcheck"/>
        <api:set attr="job.ExecutionType"  value="Run"/>
        <api:set attr="job.ASync"          value="true"/> 
        <!--Setting to true will wait for Job to complete -->
        <api:call op="~/api/executeJob.rsb" in="job"/>
    </api:if>
    <api:push/>
</api:call>

では、一つずつ何をやっているかみていきます。

Post-JOB に設定した内容について

<api:set attr="statusjob.JobName" value="kin2mysql"/>
<api:call op="~/api/getJobStatus.rsb"  in="statusjob" out="_out" >

ジョブ実行結果を getJobStatus.rsb にアクセスして取得します。その際、何のジョブかを statusjob.JobName に指定します。getJobStatus.rsb を呼びだす際には statusjob というオブジェクトをインプットパラメータとし、out= は取得結果を保持するオブジェクトとなります。
※オブジェクト名は任意のもので構いません

 <api:set attr="status" value="[_out.Status]" />

先にお伝えしたように、実行結果はout に格納されています。ただし、out はJSON で各項目の値も保持していますので、上記のように _out.Status と指定します。そうすることでジョブの実行結果のみを取得することができます。
※ちなみに、他にはQuery で実行クエリ、LastRun で最終実行日時なども併せて取得できるようになってます。

 <api:if attr="status" value="SUCCESS" operator="equals">   

取得したジョブ実行結果が "SUCCESS" だったら次に進むように条件分岐を入れています。なお、失敗したら status には "ERROR" がセットされてきます。

     <api:set attr="job.JobName"        value="sf2mysql-jobcheck"/>   
        <api:set attr="job.ExecutionType"  value="Run"/>   
        <api:set attr="job.ASync"          value="true"/>    

ここからは 先ほどの IF 文で True になった場合にみに実行する部分です。
実行したい次のジョブを JobName にセットし、ExecutionType、ASync はそのままコピーで大丈夫です。

         <!--Setting to true will wait for Job to complete -->   
        <api:call op="~/api/executeJob.rsb" in="job"/>    

job をパラメータとして executeJob.rsb からジョブステータス取得のスクリプトを実行するよう指示しています。

ジョブを実行

それでは①のジョブを手動で実行しみます。
f:id:sennanvolar44:20210922003338p:plain

正常終了しているので、②のジョブが実行されているか確認してみます。
f:id:sennanvolar44:20210922003552p:plain ちゃんと①のあとに実行されていますね!

では、同期先DB の MySQL が停止していた場合に①を実行したとき、②ではジョブが実行されないかを確認してみます。
f:id:sennanvolar44:20210922003909p:plain

MySQL が止まったままの状態でジョブを実行すると、当たり前ですが接続エラーが発生します。
f:id:sennanvolar44:20210922004016p:plain
この状態で②のジョブ結果を確認してみます。
f:id:sennanvolar44:20210922004223p:plain
先ほどと同じ結果なので、ジョブが実行されていないことが確認できました。

おわりに

いかがでしたでしょうか。Post-JOB を使用することでSync のジョブをシリアルにつなげていくことができるようになります。
この Post-JOB は他にもバッチファイルを実行したり、DB にアクセスしたりなど色々とできるようになっています。
こういう使い方はできる!?などありましたら、下記サポートフォームよりぜひぜひお問い合わせください!

CData Software Japan - Technical Support