はじめに
この投稿は、RPAツール「UiPath」の ナレッジメモ の記事です。
UiPathのコミュニティ「UiPath Friends」が企画する「UiPathブログ発信チャレンジ2021サマー」の 26日目の投稿でもあります。
企画の内容は こちら 。カレンダーのURLは こちら です。
invoke workflowの罠
invoke workflowで、私が実際に経験した「怖い話(困った話)」を3つ紹介します。
思い出すだけで (((( ;゚Д゚)))))))ガクガクブルブルガタガタ
「ワークフローファイルを呼び出し (Invoke Workflow File)」アクティビティの公式説明はこちら
高度に使用するための参考(公式)記事はこちら
罠1)DataTableは「呼び出し先での変更」の影響を受ける
これは有名な話ですが、
(;Д;)ヒィィ!
引数に DataTable型を指定する場合、引数の方向が「In」に指定しても、
呼び出し「先」で DataTable の中身を変更すると、
呼び出し「元」の DataTable も変更される。
(引数の方向が「In」なら、影響を受けないはずなのに)
という話です。
そもそも「Inで指定しておいて、何で変更するの?」というほうが怖いですけれども。
DataTable型に限らず、シリアライザブルではない型は、影響を受けてしまいます。
多分、以下の制約を受けているのだと思います。
UiPathの元になっている「C#やVB.NET」では、値そのものを(別の変数で)コピー(ディープコピー)したい場合に、オブジェクトをシリアライズし、それを別オブジェクトにデシリアライズする方法があるが、そのためには、シリアライザブルな型である必要があります。
要するにin方向の引数でも、型によっては変更の影響を受けるということです。(値渡しではなく、参照渡しになってしまう。)
これを回避するには、以下のいずれかの方法があります。
【回避方法】
1)引数で「.copy」してデータテーブルの複製を渡す(※)
2)分離で実行する
※ .copy:データテーブルを複製。複製版を引数で渡すので、元のデータテーブルに影響が出ません
罠2)引数の「サイズ」が大きいとエラーになる
これはレアな話ですが、
(;Д;)ヒィィ!
引数で返すデータのサイズが大きいと、フローの呼び出し完了時に
大きすぎて処理できないエラーになることがある。
<エラーメッセージ>
RemoteException wrapping System.Exception:
ジョブの実行結果を取得できませんでした。
メッセージが大きすぎて処理できなかったことが原因である可能性があります。
というものです。残念ながら、発生原因や再現方法が掴めていないのですが、その時のメモリ使用量と関係しているような気がします。(メモリの余裕がないときに、大きなデータを引数で返すとエラーになる?)
これを回避するには、以下の方法があります。
【回避方法】
1)再起動、リトライしてみる
2)引数のデータサイズを減らしてみる(呼び出しを複数回にするなど)
3)フローを呼び出さず、同じフローで処理する(残念)
分離実行の場合、シリアライズできない型は引数にできない
これもレアで、分離実行しないとお目にかからないです。
(;Д;)ヒィィ!
フローを分離実行で呼び出す時に、
引数の型でオブジェクトのシリアル化および逆シリアル化をサポートしていないものは
引数に指定できない。例えば「UI ブラウザー、UI 要素」等が該当します。
誤って指定すると、参照したときに「NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 」エラーになります。
これを回避するには「分離実行をしない」ように設定します。
終わりに
いかがでしたでしょうか。困った際の参考になれば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。