[Blue Prism] プロセスをスケジューラー実行してみる

はじめに
-----------------

Blue Prism の特徴として、「実行時に人間の付き添いが必要ない(unattended)」ロボット（以降、プロセスと表記）を目指している点があげられます。アプリケーションを構成する要素を認識するモードが何通りも用意されていて極力画像認識を使わずにできたり、キューの仕組みがあってデータの永続化や状態管理・リトライ・負荷分散の機能が簡単に使えたり、カレンダーやスケジューラーが使えたりすることが、その実現（付き添いが必要ないロボット）を支えています。

この記事では、Blue Prism で作ったプロセスを、スケジューラーで自動実行してみます。
類似記事が、[Enterprise Blue Ocean ◮ Blue Prismのランタイム・リソースの種類、およびスケジューラーとの関係](https://www.ebocean.work/entry/2018/11/07/040123)にもありますので、ご参考にしてください。また、Blue Prism Portal の Document にある [「Blue Prism - Guide to the Scheduler (Japanese)」](https://portal.blueprism.com/documents/blue-prism-guide-scheduler-japanese) も参考になります。

Blue Prism のプロセスを実行する方法として、「インタラクティブクライアントからデバッグ実行する」「インタラクティブクライアントから手動で（セッションを作成して）実行する」「スケジューラーから実行する」「Automate.exe から実行する」「WebService（SOAP）として公開して実行する」があります。
（通常の開発中は、「デバッグ実行」や「インタラクティブクライアントから手動で（セッションを作成して）実行する」を利用していると思います）

スケジューラーを実行するためには、2つの前提条件があります。

* A. Blue Prism のサーバーサービスが起動していること
* B. public スイッチで起動したランタイムリソースがあること

インストーラーを使って何も考えずに普通にインストールした状態では、A, B ともに満たしていない状態ですので、スケジューラー実行はできません。

Blue Prism の構成はざっくり言って下記のようになっていることを踏まえると、上記A,Bがスケジューラー実行の前提になっていることも理解しやすいかと思います。（この図にはインタラクティブクライアントが省略されているなど、正確ではありませんが。。。）
<img width="599" alt="BluePrismArchitecture.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/bbb0ce9f-0783-6ce4-75c9-ed38be536e54.jpeg">


手順を追って、前提条件を整えていきます。

Blue Prism のサーバーサービスを起動する
------------------------------------------------

Blue Prism をインストールした際に、SQL Server への接続を設定しているかと思います。その設定名を使って、Blue Prism サーバーサービスの設定を行います。

### SQL Server への接続名を確認する

Blue Prism を立ち上げます。
接続欄に表示されている名前を確認します。以下の例だと「mssql」です。
<img width="510" alt="connection_name.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/3b448be7-b73a-4b29-d2be-191f75a6d16e.jpeg">


この接続は接続タイプが「SQL Server（Windows認証）」もしくは「SQL Server（SQL Server認証）」になっていると思います。上記画面の「構成」をクリックすると確認できます。

### BPServer.exe でサーバーサービスの設定を行う

BPServer.exe を使って、設定を行います。

`C:\Program Files\Blue Prism Limited\Blue Prism Automate\BPServer.exe` を起動します。

起動すると下記のような画面が表示されます。構成の名前が `Default` になっています。この Default に対して設定を行っていきます。

「編集」ボタンをクリックします。

<img width="258" alt="bpserver00.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/6d434162-66be-4743-1743-c40bb3d0786c.jpeg">



「詳細」タブ内の項目を設定します。
* 「データベース接続」に、先ほど確認しておいた「接続」の名前を設定します（ここでは "mssql" ）。
* 「接続モード」は、「WCF：安全ではない」を選択します。（詳細は ["v6 Data Sheet - Selecting a BP Server Connection Mode"](https://portal.blueprism.com/documents/v6-data-sheet-selecting-bp-server-connection-mode) を参照してください）
* 「バインディング」では、IPアドレスとポートを設定します。使っているマシンのIPアドレスを設定します。
* 「スケジューラーを無効化」チェックボックスはオフにしておきます。

<img width="353" alt="bpserver_detail.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/ab01d62a-54d7-e704-85d7-12d29d623968.jpeg">


「キー保存」タブ内の項目を設定します。
「新規」ボタンを押します。
「暗号化キーの詳細」画面の項目を設定します。
* 「スキーム名」に「デフォルトの暗号化方式」と入力します。
* 「メソッド」に「AES-256 AesCryptoService(256bit)」を設定し、「キーを生成」ボタンをクリックします。
* 「OK」ボタンを押します。

<img width="276" alt="encription_key_detail.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/0d26b8ce-6156-dfef-0cc1-c8af5de5da4f.jpeg">


設定が終わったら、「保存」ボタンを押します。
保存できたら、BPserver.exe からサーバーを起動してみましょう。

「開始」ボタンを押します。

<img width="257" alt="bpserver_start.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/b506fb72-724d-564f-e50b-4ccdc980c3d6.jpeg">


下のログ欄に「[2020-XX-XX 06:47:47] : Scheduler: Waiting forever」などと表示されれば準備OKです。

ちなみに、Blue Prism をインストールすると、 "Blue Prism Server" という名前の手動サービスが設定されますが、これは 構成名 Default で Blue Prism サーバーを起動するサービスです。

<img width="297" alt="services.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/0cfdad99-02b8-0ea7-284d-ed5f705cd205.jpeg">


インタラクティブクライアントで、「Blue Prism サーバ」接続を構成する
--------------------------------------------------------------------------------------------

起動が確認出来たら、インタラクティブクライアントで、アプリケーションサーバー経由で接続するための接続設定を追加します。この接続名はあとから使用します。

ログイン画面で「構成」をクリックします。

<img width="505" alt="login_window.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/22e8fbd1-1ab9-c213-0913-b1c74b1a0ed1.jpeg">


画面左下の「新しい接続」をクリックし、設定を行います。
* 「接続名」に、「localApplicationServer」と入力します（後から利用します）。
* 「接続タイプ」に、「Blue Prismサーバー」を設定します。
* 「Blue Prismサーバー」に、先ほどサーバーサービスの設定で「バインディング」に指定した IPアドレスを設定します。
* 「接続モード」に、「WCF：安全でない」を指定します。
* 「サーバーポート」に、同じく先ほどサーバーサービスの設定で「バインディング」に指定した ポートを設定します。

右下の「テスト接続」を押すと、正しく接続されているかどうか確認できます。「有効な接続」と表示されれば成功です。

設定が終わったら、「OK」ボタンをクリックします。

<img width="380" alt="new_connection.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/94faf5a4-c30d-e753-d218-7a20f2107655.jpeg">


先ほど設定した接続「localApplicationServer」を使って、問題なくインタラクティブクライアントが起動できることを確認しましょう。
ユーザー名、パスワードは同じものを指定します。

<img width="508" alt="launch_test.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/3d0086a9-0b68-2551-37d9-8f144993c8a1.jpeg">


public スイッチで起動したランタイムリソースを起動する
--------------------------------------------------------------

Automate.exe を下記のスイッチで起動します。

* ```/dbconname``` には、先ほど設定した Blue Prism サーバー接続の "localApplicationServer" を指定します。
* ```/port``` には、起動するランタイムリソースが、Blue Prism サーバーに接続する際に利用するポートを指定します。

```
"C:\Program Files\Blue Prism Limited\Blue Prism Automate\Automate.exe" /resourcepc /public /dbconname "localApplicationServer" /port 8183
```

起動すると下記のような Window が表示されます。

<img width="249" alt="runtime_resource_8183.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/87443ae2-3f0b-0122-4b30-c85ce5f70132.jpeg">



インタラクティブクライアントでランタイムリソースが追加されていることを確認する
--------------------------------------------------------------------------------------------

インタラクティブクライアントのコントロールタブを見ると、下図のようにランタイムリソースが登録されていることがわかります。

<img width="547" alt="control.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/798b1bda-edd6-47a5-84fa-88020de430f8.jpeg">


スケジュールを設定する
---------------------------------------------

あらかじめスケジューラーで実行するプロセスを作成し、公開しておきます。

今回は下記のようなログファイルに行を追加していくプロセスを作成しました。

<img width="408" alt="sample_process.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/1a13a3c0-b2c9-b2da-2054-a6b54298914d.jpeg">


左上の四角をダブルクリックし、コントロールルームに公開されていることを確認します。

<img width="404" alt="open.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/88b19939-fbeb-a4fb-d625-75764233d9c5.jpeg">


インタラクティブクライアント上でスケジュールとタスクを作成します。コントロールタブを開き、"スケジューラー > スケジュール" を右クリックし、"新しいスケジュール" を選択します。

<img width="602" alt="new_schedule-00.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/e102fb46-0eaf-0a7e-fa38-93ea2f09b390.jpeg">


スケジュールの名前を適当に設定し（ここでは「テストスケジュール」と設定）、すぐに結果が確認できるように、"スケジュール" セクションの "実行" に、"毎時/毎分" を設定します。
開始日と開始時間、終了日時は、結果が確認できるように適切に設定します。

"毎時/毎分実行" のセクションでは、"毎" 「3分」等を設定します。

設定し終わったら、左下の "変更を適用" をクリックします。

<img width="547" alt="new_schedule-01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/e190e35c-922a-b2e9-9f71-e7892f71a800.jpeg">


### 関連タスクの構成

画面左に先ほど作成したスケジュールが表示され、自動的にその子要素として新しいタスクが作成されます。

タスクの名前を適当に設定し（ここでは「定期的なログ」と設定）ます。"完了時"　や "例外発生時" の設定項目はデフォルトのままにしておきます。

<img width="549" alt="new_schedule-02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/6326f994-15d2-420d-b5b8-190845073e8a.jpeg">


"利用可能なプロセス" エリアに、前もって公開しておいたプロセス 「logSample」があることを確認します。

"利用可能なリソース" エリアに、起動しておいたランタイムリソース（ここでは 「DESKTOP-N2LOBGL:8183」）が表示されていることを確認します。

プロセスを実行するのと同じように、「logSample」プロセスを「DESKTOP-N2LOGBL:8183」にドラッグ&ドロップします。

その結果 "スケジュールされたセッション" エリアに、新しいセッションが作成されたことを確認し、左下の "変更を適用" ボタンをクリックします。

<img width="549" alt="new_schedule-03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/db103b00-554b-c396-5f38-8b09ef8bbd62.jpeg">


スケジュール実行されたプロセスを確認する
---------------------------------------------

しばらくして、インタラクティブクライアント上でコントロールタブを開き、"スケジューラー > レポート > 最近のアクティビティ" を選択すると、自動実行されたプロセスが確認できます。

<img width="558" alt="schedule.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/b8e8a253-cf95-712e-3bce-8ee0337b4684.jpeg">


プロセスが実行されたことは、ログファイルをみても確認できます。

<img width="432" alt="tail.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/1d00dffc-573b-d315-1af6-2d6fc92f5541.jpeg">