はじめに
ASTERIA WARPではTimerコンポーネントを使って、あるフローから別のフローを非同期に実行することができます。
通常は実行するフロー
プロパティにフローを指定するのですが、条件によって実行するフローを変えたいことがあります。例えば、ユーザーによって変えるとか、時間帯によって変えるとか、接続先によって変えるとか。
そういうときは、マッピングでフロー名自体を実行するフロー
に渡せば簡単にできてしまいます。
環境
- Windows 10
- ASTERIA WARP 1712
フロー
普通はこんな感じで直接実行するフロー
を指定します。
動的に指定するにはこんな感じでマッピングすればよいです。もちろんプロパティ式も利用可能
マッパーの中はこんな感じです。ここでは、フロー変数でフロー名を渡してます。
あるコードを使って呼び出すフローを変える場合はTable
関数を使うこともできますし、Embed
関数で条件を組み合わせてフロー名を組み立ててもいいでしょう。
値の引き渡し
ここで、フローを呼び出すときに何かしらのパラメータを渡したいことがありますよね。
フローを直接渡した場合は、パラメータタブに呼び出されるフローの公開フロー変数が見えるようになりますので、ここにマッピングするだけです。しかし、実行するフロー
を動的に指定した場合、どのフローが呼ばれるかわからないのでこの手は使えません。
そんなときには、入力ストリームを使います。入力ストリーにはParameterList
というキーバリューを渡すためのストリームがありますのでこれを使えばOKです。
実は、上のマッピングで気づいた人もいるかも知れませんが、ここではその手法を使ってます。
ちなみに、受け側の定義も同じストリーム型にして置かなければなりません。中身はフィールドの定義は異なってても構いません。例えば、呼び出し側ではA,B,Cを渡すんですが、呼び出される側はA,Bだけとか、A,Cだけという定義でもいいです。ただ、混乱を招くので、ストリーム定義を使って共有しておいたほうがいいと思います。
つまりASTERIA流のDI?
ここではTimerコンポーネントを使いましたが、他にFlowInvoker
とかNextFlow
でも同じようにフロー名を動的に変更できます。
Branch
やSwitch
だと、接続先やバリエーションが増えるたびにメインフローを書き換えないといけませんが、このやり方だと、メインフローのメンテナンスはほぼやらずに、バリエーションを増やすことができるので便利です。