UiPathのバックグラウンドプロセスについて

#バックグラウンドプロセスの概要とその特徴

##バックグラウンドプロセスとは？
　UiPathの2019.10(あたり?)で正式に導入された機能に**バックグラウンドプロセス**があります。
　UiPathでは通常１台のロボットにつき同時に１つの自動化プロセスしか動作させることはできません。しかしこの**バックグラウンドプロセス**は他のプロセスと並行して稼働することができますので、うまく活用できれば、系全体で見たプロセスの稼働率をかなり向上させることができます。これはつまり投資対効果の観点からも非常に有用になりうる機能と思います。

##バックグラウンドプロセスの特徴
　このように有用性を期待できるバックグラウンドプロセスですが、通常のプロセスに比べてできることがかなり制限されています。具体的には、UI操作を行うことができません。技術的に言えばUiPath.UiAutomation Activities Packageがない状態で自動化を行う必要があります。操作の例でいうと、マウスのクリック、文字入力、画面からのテキスト取得、キーイベント捕捉、ブラウザやウインドウ操作といった事項が**できない**ということになります。逆にAPIによる操作や、通信、ファイル操作といったことは可能です。

#バックグラウンドプロセスを使う
##バックグラウンドプロセスの作成方法
　UiPath Studioのホーム画面に、バックグラウンドプロセス用のテンプレートがありますので、これを利用するのが最も簡単です。
![img_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/711d89b9-a1de-8e27-897c-23c821ef64aa.png)

テンプレートから作成した直後のアクティビティパッケージは以下の通りです。UiAutomationがありません。

![img_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/3da3945d-8f2b-576b-aa19-a19f07c3432b.png)

内部的な話になりますが生成されたproject.jsonは以下の通りです。

```project.json
{
  "name": "バックグラウンドプロセス3",
  "description": "バックグラウンド プロセス",
  "main": "Main.xaml",
  "dependencies": {
    "UiPath.Excel.Activities": "[2.8.5]",
    "UiPath.Mail.Activities": "[1.8.5]",
    "UiPath.System.Activities": "[20.4.0]",
    "UiPath.WebAPI.Activities": "[1.4.5]"
  },
  "webServices": [],
  "schemaVersion": "4.0",
  "studioVersion": "20.4.1.0",
  "projectVersion": "1.0.1",
  "runtimeOptions": {
    "autoDispose": false,
    "isPausable": true,
    "requiresUserInteraction": false,
    "supportsPersistence": false,
    "excludedLoggedData": [
      "Private:*",
      "*password*"
    ],
    "executionType": "Workflow"
  },
  "designOptions": {
    "projectProfile": "Developement",
    "outputType": "Process",
    "libraryOptions": {
      "includeOriginalXaml": false,
      "privateWorkflows": []
    },
    "fileInfoCollection": []
  },
  "arguments": {
    "input": [],
    "output": []
  },
  "expressionLanguage": "VisualBasic"
}
```


ミソは
"requiresUserInteraction": false,
の部分になります。ここの値がfalseの時バックグラウンドプロセスとみなされます。

ちなみに通常プロセスをあとからバックグラウンドプロセスに変更したい場合、あるいはその逆を行いたい場合は、プロジェクトパネルにある「プロジェクト設定」から変更することができます。

![img_2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/f4cbb966-dfdb-7477-60a0-ab6e8d8cb13c.png)

ここからプロセスの実装を始めます。

実装ができたら、動作確認を経てパブリッシュに移ります。

![img_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/c44cbd1b-c4cf-359b-591e-22fb0b70034f.png)

　通常のプロセスのパブリッシュ時には表示されない注意事項が表示されています。
UI操作が入っていないか今一度確認してから、パブリッシュします。

##バックグラウンドプロセスの実行とその動作仕様
　パブリッシュが完了すると、通常のプロセス同様UiPath Assistant(またはRobot tray)にプロセスが表示されます。

![img_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/7090f2c9-b430-cfa3-003a-20557a64086a.png)

　実際に実行するとRunningProcessesの欄に表示されます。以下の図ではフォアグラウンドプロセスであるHelloWorld4とバックグラウンドプロセスであるバックグラウンドプロセス３が同時に動作していることがわかります。
なおバックグラウンドプロセス３の左側にある四角いマークがバックグラウンドプロセスの印になります。（20.4.1CEの場合。19.10.4のDesktop Agentの場合ForegroundとBackgroundとでそれぞれに欄があります。）

![img_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/3f9630f5-b3aa-71be-6275-16eee3ee0726.png)

　バックグラウンドプロセスはどんな時でも並行して稼働ができるように思えますが、実際には例外があります。
まずAttended Robot（AR）での動作ですが、これは期待通りに並行稼働が可能です。
具体的には、
・フォアグラウンドプロセスが実行中の状態での、バックグラウンドプロセスの起動
・バックグラウンドプロセスが実行中の状態での、フォアグラウンドプロセスの起動
両者とも問題なく動作します。

一方Orchestratorからの実行指示に基づくUnattended Robotでの動作は（少なくとも現時点では）
並行動作とはならず、単独の動作となります。
具体的には、
・フォアグラウンドプロセスが実行中の状態での、バックグラウンドプロセスの実行指示
・バックグラウンドプロセスが実行中の状態での、フォアグラウンドプロセスの実行指示
両者とも後から実行指示したプロセスがPendingとなります。

例えば以下のようにOrchestrator上にフォアグラウンドプロセスとバックグラウンドプロセスがあるとします。バージョン欄のアイコンがそれぞれフォアグランドプロセス、バックグラウンドプロセスの表示になります。
![img_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/55873ce9-b116-8a9d-1da0-09f08de454a4.png)

フォアグラウンドプロセスであるHelloWorld4を実行中に、バックグラウンドプロセス3の実行指示を行ってもPendingとなりバックグラウンドプロセスとして期待する並行稼働にはなりません。また逆もしかりで、バックグラウンドプロセス実行中にフォアグラウンドプロセスの実行指示をしても並行稼働にはなりません。
![img_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/04c671b3-433d-c126-231d-535f169f7746.png)

これは対象ロボットのアカウントがログイン状態であろうが、ログアウト状態であろうが同様でした。

ということで結論的には、現時点(2020/6)ではバックグラウンドプロセスはAttended Robotでの利用でしか大きなメリットは得られないと思われます。Unattended Robotでの利用しかないのであれば、通常のプロセスと差異はありませんので、バックグラウンドプロセスを選択する意味はあまりないと思います。

#バックグラウンドプロセスの実装上の注意事項
##安全に停止させることが難しい
　特に監視を行うようなプロセスで問題になると思いますが、基本的にUI操作ができない仕様になっていますので、直接的に取りうるアクションはUiPath Assistantの停止ボタン、一時停止ボタンしかありません。イベント監視系のプロセスもほとんどはUiAutomationの中なので、利用できるTrggerはFileTriggerV2アクティビティくらいしかありません。
　Orchestratorからの停止指示有無を返すShouldStopアクティビティに相当するものも無いので、処理の途中で問答無用でkillされると問題となる場合は、安全に停止する方法を模索することになります。

　先日実装したバックグラウンドプロセスとして動作する[気象警報・注意報の監視・取得ワークフローテンプレート](https://connect.uipath.com/ja/marketplace/components/monitoring-and-get-weather-alert-from-jma) では、デスクトップ上のbatファイルをFileTriggerで監視、そのファイルが削除されたら安全に停止する。またそのbatには自身を削除するコマンドを入れておく、といった対応をしました。
　UiPath AssistantにKill とStopが明示的に実装され、ShouldStopがこれに対応してくれると良いのですが．．．

##情報の入力
　Attended Robotで通常のプロセスを使う場合は、インタラクティブな画面が利用できますので、それを通じてプロセスに情報を与えることができます。またファイルを通じての受け渡しも可能です。
　一方Unattended Robotの場合、インタラクティブな画面は使用できませんので、引数を用いることが多いのではないかと思います。
　Attended Robotにおけるバックグラウンドプロセスは、インタラクティブな画面が使えない等特性的にはUnattended Robotで稼働させるプロセスに近い部分がありますが、Orchestratorからの起動と異なり、UiPath Assistantから引数をわたすことができません。このあたりも機能追加が望まれる部分です。


#確認環境
このドキュメントはUiPath Studio 20.4.1CE+Cloud Orchestrator CEでの動作を記述しています。なお一部UiPath 19.10.4（サービスモード）での動作を記述している部分もあります。Orchestratorは2020/6現在のCloud Orchestratorを利用しています。

(おわり)