#Sample - 19.6 - プロセスを呼び出し

「呼び出し」というと、その音の響きから大相撲の呼出を思い起こします。「ひが~し~、○○山、に~ぃし~、○○海」という例のアレを土俵で呼び上げる人です。この3月場所は無観客で行われて一抹の寂しさを覚えますが、いつもは聞けない取り組みの“生音”が聞けると話題ですね。

さて、今回のトピックで取り上げる新アクティビティは、「プロセスを呼び出し」アクティビティです。クラス名は、UiPath.Core.Activities.InvokeProcess です。このアクティビティは 2019.6 以上の System パッケージをプロジェクトに追加することで利用できます。

ガイドはこちら

このアクティビティは、指定したプロセスを開始することができます。プロセスといっても UiPath プロセス、つまりワークフローのことです。Windows プロセスのことではないのでお間違えのないようにお願いいたします。

開始できるプロセスは、次のとおりです。

  • ローカルコンピューターのプロセス
    ローカルコンピューターにパブリッシュされているプロセス
  • Orchestrator のプロセス
    ログオンユーザーに対して Orchestrator で公開されているプロセス

なお、ローカルコンピューターのプロセスを開始する場合、ローカルコンピューターは Orchestrator と接続していない(つまり切断状態にある)必要があります。逆に、Orchestrator のプロセスを開始する場合は、当然のことながらローカルコンピューターは Orchestrator と接続している必要があります。したがって、ローカルコンピューターのプロセスから Orchestrator のプロセスを呼び出したり、Orchestrator のプロセスからローカルコンピューターのプロセスを呼び出したりすることはできません。

プロセスを呼び出しアクティビティのプロパティは次のとおりです。

プロセス名プロパティに呼び出したいプロセスの名前=プロセス名を指定します。この指定は必須です。プロセス名は、ワークフローパッケージファイルのバージョン部分と拡張子を除いた名前に相当する部分です。(ワークフロープロジェクト名と同じになります。)例えば、パッケージファイル名が Quux.1.0.1.nupkg だった場合、ここで指定するプロセス名は Quux になります。

フォルダー パス プロパティには、呼び出したいプロセスが属する Orchestrator のフォルダーを指定します。なお、次の場合は指定不要です。

  • ローカルコンピューターのプロセスを呼び出す場合
  • Orchestratorのプロセスを呼び出す場合に、呼び出す側と呼び出される側の双方のプロセスが同じフォルダーに属している場合

「プロセスを呼び出し」アクティビティを使ってプロセスを呼び出す場合の特徴としては、呼び出されるプロセスはプロセスとしてカウントされない、ということです。

通常、デスクトップにて起動できるフォアグラウンドプロセス( UI 操作を伴うプロセス)は同時実行できるプロセスの個数が1個に限られます。ですから、次の例のようにフォアグラウンドプロセス「桃太郎」を起動中に別のフォアグラウンドプロセス「浦島太郎」の起動を試みても失敗に終わります。

ここで、「プロセスを呼び出し」アクティビティを使って、三つのフォアグラウンドプロセス「桃太郎」「浦島太郎」「金太郎」(各プロセスはそれぞれメッセージボックスを表示)を呼び出してみましょう。

プロセスを呼び出し検証プロジェクトの Main.xaml はこんな感じです。

各「ワークフローファイルを呼び出し」アクティビティの分離プロパティは True に設定しました。引数にプロセス名を渡しています。

また、Invoke.xaml はこんな感じです。

実行時のデスクトップの様子はこんな感じです。

ご覧のとおり呼び出せました。Agent Desktop 上の実行中プロセスは「プロセスを呼び出し」アクティビティを呼び出したプロセスのみの表示となっています。呼び出されたプロセス「桃太郎」「浦島太郎」そして「金太郎」は、プロセスとしてカウントされていないのです。

Windows プロセスの様子はどうなっているのか、Process Explorer で見てみましょう。

UiPath.Service.Host.exe (ロボットサービス)から起動されている UiPath.Executor.exe(ロボット)は「並列」アクティビティを呼び出している最初に起動した UiPath プロセスです。この Windows プロセスは合計 6 個の UiPath.Executor.exe を起動しています。その内訳はこうなります。「並列」アクティビティで 3 個の「ワークフローファイルを呼び出し」アクティビティを実行しています。それぞれの「ワークフローファイルを呼び出し」アクティビティの分離プロパティを True にしたため、新しい Windows プロセス(UiPath.Executor.exe)が 3 個作成されました。そして、それらが「プロセスを呼び出し」アクティビティをそれぞれ呼び出したため、新しい UiPath.Executor.exe が3個起動した、というものです。

このように、「プロセスを呼び出し」アクティビティは、フォアグラウンドプロセスの実行上の制約にひっかかることがないため、親プロセスから必要なだけ子プロセスを呼び出すことができます。この特徴により、子プロセスとして実装する機能単位を小さくし、それぞれを部品化することができるわけです。部品化した子プロセスを自由に組み合わせてさまざまな自動化プロジェクトを短時間に高品質に作ることができるでしょう。つまり「プロセスを呼び出し」アクティビティは、自動化プロジェクトの開発に関して生産性の向上に寄与する極めて重要なアクティビティと言えるのです。

なお、今回取り上げた例では、フォアグラウンドプロセスを同時実行しましたが、通常の利用場面では、UI 操作を伴うフォアグラウンドプロセスについて数珠つなぎ状に逐次実行する形になります。なぜなら、ログオンセッションにディスプレイ、キーボード、マウスは 1 セットしかないため、複数の UI 操作を同時並列実行することはできないからです。ですから、並列化のために別 Windows プロセスとして実行しましたが、普通はその必要はありません。直接「プロセスを呼び出し」アクティビティを使用すれば良いと思われます。その点にご留意ください。

バックグラウンドプロセスについては、じゃんじゃんばりばり並列化しちゃってください。 :vulcan_salute:

今回検証に使用したワークフローファイル:InvokeProcess_20200313.zip (17.3 KB)

速報 (2020/03/19)

Studio/Robot バージョン 20.3 とともに公開された System パッケージバージョン 20.3.0-preview では 「プロセスを呼び出し」アクティビティに Entry Point Workflow なるプロパティが追加されました。このプロパティは、プロジェクトで規定している既定の開始ワークフロー以外のワークフローから実行を開始する場合にそのファイル名を指定するためのプロパティです。

どうぞ、お見知りおきを。 :vulcan_salute:

5 Likes