Enterprise Blue Ocean ◮

神谷町RPAブログ

  • Blue Prism 初級者向け
    • Blue Prism を 無料で利用する 方法はこちら
    • Blue Prism の Blue Prism 事始め!オンボーディングの記事はこちら
    • Blue Prism で Excelを操作 する記事はこちら
  • Blue Prism、ちょっと進んだコンテンツ☆
    • Blue Prism の ベストプラクティス 記事はこちら
    • Blue Prism の 逆引きナレッジ wiki こちら
    • Blue Prism を リアルタイムで起動する 方法はこちら
  • RPA、そもそも論!
    • Youtube で、あらためて振り返る RPA とは?・・・はこちら☆

Blue Prismの中止と再実行にキューを活用する(+べき等 超入門)

Blue Prismのキュー(Queue)を一時記憶装置として使った場合、具体的に何が嬉しいのか?

ebo.hatenablog.com

答えは沈黙!…以下で解説していきます。

 

中止と再実行

Blue Prismでは、プロセスの実行を中止することができます。
中止には、Immediate Stop(即時中止)Request Stop(中止を要求)の2種類があります。
RPAの性質上、長時間実行されるプロセスは少なくないです。実行の中止は、とても重要な機能だと思います。
(基礎コース:Foundation Trainingにも出てきますね)

f:id:EnterpriseBlueOcean:20180717180638p:plain

プロセスを実行中に、何らかの理由で中止をした場合、再実行(リトライ)を賢く行う方法が必要です。

 

べき等(idempotent)

中止と再実行…みたいな話をしたことがある人は、べき等(べきとう、冪等。idempotent)という言葉を耳にしたことがあると思います。
(え、聞いたことない?細けぇことはいいんだよ!

frsyuki.hatenablog.com

frsyuki.hatenablog.com

上記でも語られていますが…(いきなりレベル、上がったな)ちょっとだけ横道に逸れると、まず、数学にはべき乗という演算があります。下みたいなやつです。中学で習いましたね。

\displaystyle x, x^2, x^3, ...

英語表記はpowerです。ExcelにもPOWER関数があります。
ここで、1という数値を考えます。1は、何回べき乗しても1です。

\displaystyle 1 = 1^2 = 1^3 = ...

このように、何度、同じ演算(ここではべき乗)を繰り返しても、同じ結果になるのがべき等という概念です。
べき等という言葉自体が、そもそもラテン語の "idem"(同じ:same)と"potere"(べき乗:power)から来ているそうです。

冪等 - Wikipedia

単にべき乗だけでなく、何回繰り返しても同じ結果が得られれば、あらゆる演算、関数、処理がべき等と呼ばれます。
Blue Prismのプロセスも例外ではありません。
つまり、プロセスを何度、流しても同じ結果を返すのであれば、それはべき等と呼べるわけです。

 

…んで、そのべき等とかいうのが、何の役に立つわけ?

上記の記事でも語られていますが、私の認識を簡単に書きますと、、

  • プロセスがべき等であれば、中止した後、特別な後処理/前処理を行うことなく、単に頭から再実行するだけでOKになります。
  • プロセスがべき等でないと、中止した後、中止する前と同じ状態を再現してからでないと再実行できません(結果が同じになりません)。

プロセスがべき等かどうかは、再実行の容易性に大きくかかわってきます。

さて、どうすればプロセスをべき等にすることができるのでしょうか。

これはいろいろなポイントがあり、ここで説明しきることは(そもそも私の能力的に)難しい気がします。上記のリンクにも情報が詰まっています。

ただ、少なくともひとつ確実に言えることは、処理中のデータを保存しておくことがポイントのひとつだ、ということです。そこから再実行すれば、毎回、同じ結果にできますからね。

一時記憶装置としてのキューが、べき等に結びつく瞬間です。

 

やってみよう(設計編)

以前、Yahooファイナンスから情報をとってきて、Excelに転記するプロセスを作成しました。

ebo.hatenablog.com

ebo.hatenablog.com

このプロセスを、毎日、朝9:30に定期実行した場合を考えます。毎朝の断面で情報が収集されて、便利ですね。

このような毎朝の処理を、何かの理由で中止した場合、どうやって再実行させればいいでしょうか。頭から流しなおす?…おそらく、頭から流しなおすと、流した時点でWeb(Yahooファイナンス)からデータをとってきてしまいます。いま、ほしいのは毎朝の断面のデータですから、これでは結果が異なります。

ここで、プロセスを修正し、毎朝のデータをWebから取得した際に、キューに保存する形にすればどうでしょうか。これなら、Excelに書き込みしている途中で中止しても、データはキューに残ります。

実行時に、以下のような条件分岐を設れば

  • キューにデータがある場合:キューからデータを取り出して、Excelに書き込む
  • キューにデータがない場合:Webからデータを取得して、Excelに書き込む

初回実行/再実行を問わず、頭から流すだけで良くなります。

 

やってみよう(実装編) 

上記を踏まえて、以下のようなプロセスを作りました。

f:id:EnterpriseBlueOcean:20180718172336p:plain

プロセスの前半では、キューからデータを取り出し、データの件数をチェックさせています。

  • データの件数が0件、つまりキューにデータがなければ、初回実行としてWebブラウザを立ち上げ、Yahooファイナンスからデータを取得します。
  • キューに1件以上のデータがあれば、過去に中止されたプロセスとみなし、キューの中のデータを使います

f:id:EnterpriseBlueOcean:20180718172408p:plain

プロセスの後半では、Excelへの書き込みを行います。

中止と再実行をわかりやすくするために、Excelへのデータの書き込みは一件ずつにしています(Blue Prismでは、一気に表形式のデータをExcelに入力することもできます)。

一件ずつの書き込みをするごとに、Request Stop(中止を要求)が行われたかどうか、チェックしています。これは、分岐の中に IsStopRequested() を入れることで実現しています。今回は、Immediate Stop(即時中止)は使わず、Request Stop(中止を要求)を使って中止を行う前提で考えています。これにより、キューにデータを入れる前のような危険な場所で中止することはなく、安全に中止することができます。

f:id:EnterpriseBlueOcean:20180718172501p:plain

 

やってみよう(実行編) 

まず実行し、実行の途中で中止し、再実行しています。

初回実行ではWebブラウザが立ち上がりましたが、再実行ではWebブラウザは立ち上がりません。

中止はRequest Stop(中止を要求)により安全に行われ、中止後にキューにデータがたまっていることがわかります。

やったぜ。

 

まとめ

キューを使って、実行途中のデータを保存させることで、頭から再実行してもOKなべき等プロセスを作成しました。

今回は安全な中止を実現させるために、Immediate Stop(即時中止)ではなくRequest Stop(中止を要求)を使用しました。

 

追伸:キューは一時記憶装置、と書いてますが、データベースに永続化されるので揮発性のデータソースではありません。