LoginSignup
2
0

More than 5 years have passed since last update.

Timerコンポーネントで動的にフローを変更する

Posted at

はじめに

ASTERIA WARPではTimerコンポーネントを使って、あるフローから別のフローを非同期に実行することができます。
通常は実行するフロープロパティにフローを指定するのですが、条件によって実行するフローを変えたいことがあります。例えば、ユーザーによって変えるとか、時間帯によって変えるとか、接続先によって変えるとか。
そういうときは、マッピングでフロー名自体を実行するフローに渡せば簡単にできてしまいます。

環境

  • Windows 10
  • ASTERIA WARP 1712

フロー

普通はこんな感じで直接実行するフローを指定します。
timer_normal.png
動的に指定するにはこんな感じでマッピングすればよいです。もちろんプロパティ式も利用可能
timer_dynamic.png
マッパーの中はこんな感じです。ここでは、フロー変数でフロー名を渡してます。
あるコードを使って呼び出すフローを変える場合はTable関数を使うこともできますし、Embed関数で条件を組み合わせてフロー名を組み立ててもいいでしょう。
mapping_dynamic.png

値の引き渡し

ここで、フローを呼び出すときに何かしらのパラメータを渡したいことがありますよね。
フローを直接渡した場合は、パラメータタブに呼び出されるフローの公開フロー変数が見えるようになりますので、ここにマッピングするだけです。しかし、実行するフローを動的に指定した場合、どのフローが呼ばれるかわからないのでこの手は使えません。
そんなときには、入力ストリームを使います。入力ストリーにはParameterListというキーバリューを渡すためのストリームがありますのでこれを使えばOKです。
実は、上のマッピングで気づいた人もいるかも知れませんが、ここではその手法を使ってます。
ちなみに、受け側の定義も同じストリーム型にして置かなければなりません。中身はフィールドの定義は異なってても構いません。例えば、呼び出し側ではA,B,Cを渡すんですが、呼び出される側はA,Bだけとか、A,Cだけという定義でもいいです。ただ、混乱を招くので、ストリーム定義を使って共有しておいたほうがいいと思います。

つまりASTERIA流のDI?

ここではTimerコンポーネントを使いましたが、他にFlowInvokerとかNextFlowでも同じようにフロー名を動的に変更できます。
BranchSwitchだと、接続先やバリエーションが増えるたびにメインフローを書き換えないといけませんが、このやり方だと、メインフローのメンテナンスはほぼやらずに、バリエーションを増やすことができるので便利です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0