Workatoで長時間実行アクションを使わずに一定時間待つ方法

# はじめに

[こちらの記事](https://qiita.com/ykkoba/items/884c683f96e7f0b7134f)では、Workato の長時間実行アクション(Long Actions)には注意点があることをお伝えしました。

Workato には一定時間待つアクションが [scheduler by Workato] コネクターの [Wait for time duration] アクションとして用意されていますが、こちらは長時間実行アクションになっています。

単一のステップでは 90 秒でタイムアウトが発生するため、それ以上の時間に対応するためですが、待つ必要のある時間が 1 分程度の場合に長時間実行アクションの制限を回避する方法はないでしょうか？

# 実現方法

Python コネクターを利用することで、長時間実行アクションを使用せずに実現が可能です。

Ruby や JavaScript でも類似の機能は実現可能ですが、これらのコネクターはタイムアウト時間が 30 秒と通常のアクションより短いため、今回の用途では、タイムアウト時間が通常のアクションと同じ 90 秒の Python の方が向いています。


## time モジュールの sleep メソッドを利用する

1. 待ち時間の秒数をパラメータとして設定します
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/3cd51f8a-27d2-047d-42ee-c278614feff7.png)

1. sleep 関数は time モジュールに含まれているため、time モジュールをインポートします
    ``` python
    import time
    ```
1. 関数を定義し、time.sleep() を呼び出します
パラメータは文字列としてくることがあるため、int() でパラメータを整数に変換しておきます。
    ``` python
    def main(input):
      time.sleep(int(input["WaitSeconds"]))
    
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/f516ea52-7de9-74b3-be19-3f13ed3c18e8.png)


# Salesforce の Bulk API 2.0 のクエリでの使用例

一定時間待つ必要のある例として、Salesforce の Bulk API 2.0 のクエリを実行してみます。

Bulk API は、リクエストを投げた後、処理完了後に結果を取得する流れとなるため、ジョブを作成したのち、一定時間ごとにジョブの状態を確認し、ジョブの完了を待って結果を取得するという処理が必要となります。

Salesforce コネクターには長時間実行アクションとして提供されている  [Search records in bulk using SOQL] があるため、実運用時はそちらを利用することをおすすめします。

1. カスタムアクションとして、Bulk API 2.0 のクエリジョブを作成します
  ここでは Lead の情報を CSV 形式で取得します
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/54894930-0af0-add7-8cdd-d7e24beec1ce.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/20334b97-77ae-30af-858d-77360cff8864.png)

1. ジョブの完了を待つため、[Repeat while] を利用します
1. 先程作成した Python のアクションで 60 秒待ちます
1. カスタムアクションで、クエリジョブの状態を取得します
1. ジョブの状態が準備完了(UploadComplete)か処理中(InProgress)の間は、ループを継続するように設定します
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/63a730b3-0995-92c9-f0d6-34303d1f3c63.png)

1. ジョブの状態が正常終了の場合、カスタムアクションでクエリジョブの結果を取得します
1. ジョブの状態がそれ以外である場合、エラー終了します
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/6e12febc-332b-b1cc-ba0f-6c104029ce2f.png)

1. テスト実行すると、正常終了し、ネットワークのデバッグ情報も取得できます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755136/2dda40fc-7ca7-6248-477b-5e6fc6e38e59.png)


# まとめ

まとめると、以下のようになります。

- Workato のスケジューラの [Wait for time duration] アクションは長時間実行アクションのためレシピに制限が生じる
- 待ち時間が 1 分程度の場合は、Python コネクターを利用することで、通常のアクションとして実現可能
  - Ruby, JavaScript コネクターはタイムアウト時間が他のアクションより短いため、待ち時間の設定には向いていない

# おわりに

Workato の標準アクションを適用しにくいケースでは、Python や Ruby などのスクリプトを利用することで、より便利な方法で実現できる場合があります。
各スクリプトのコネクターによって、向き不向きがありますので、適切なコネクターを選ぶことが重要です。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=["62c7358305be7869372a"])へ是非ご相談ください。

# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=["62c7358305be7869372a"])
* Workato 公式サイト
    * [Long Actions](https://docs.workato.com/recipes/long-actions.html)
    * [Scheduler/Actions](https://docs.workato.com/features/scheduler.html#actions)
    * [Python - Execute Python Code Action](https://docs.workato.com/connectors/python/actions/execute-python-code.html)
    * [Ruby snippets by Workato](https://docs.workato.com/connectors/ruby-snippets-by-workato.html)
    * [JavaScript](https://docs.workato.com/connectors/javascript.html)
* Python 公式サイト
    * [time.sleep](https://docs.python.org/ja/3/library/time.html#time.sleep)
* Salesforce 公式サイト
    * [Bulk API 2.0 Query](https://developer.salesforce.com/docs/atlas.en-us.248.0.api_asynch.meta/api_asynch/query_bulk_api_2_0.htm)
* 本記事のサンプルレシピ
    * JPデータセンター利用者向け
        * [[Example] Create job and wait completion](https://app.jp.workato.com/recipes/416842?st=258e482836e0e2d88d490b2d63d21fad92a35c61bcea8f75916a8c430020a5ee)
    * USデータセンター利用者向け
        * [[Example] Create job and wait completion](https://app.workato.com/recipes/48770910?st=5b4fcf9d0ee121679be0aae31721aed61e827a9408fd5ab06b7afd90d9a63a52)