アクションのフロー制御基礎編
アクションの各コンポーネントは独立したスレッドで並列に動作し、各々のコンポーネントは自身のキューから入力Payloadを取得し、なにか処理して出力Payloadを生成し次のコンポーネントのキューにポストし、また自身のキューから入力Payloadを取得するということを繰り返しています。ポストされた次のコンポーネントは同様に処理を開始します。
このようにバケツリレーのようにPayloadを受け渡しすることで次々とコンポーネントが動作するようになっています。
(実際のアクションはバケツリレーと違い、同じPayloadを受け渡しするわけではないので、表現としては正しくないと思いますが、イメージとして・・・)
C01 -> C02 -> C03 -> [END]
上記のようにコンポーネントが並んでいると(実際は[END]というコンポーネントはありません。最後を表す仮想的なコンポーネントです)、C01コンポーネントにはトリガーから渡されたPayloadがキューに入り処理を開始します。C01コンポーネントが出力Payloadを生成しC02コンポーネントのキューにポストします。C01コンポーネントは自身のキューから次のPayloadを待ちますが次のPayloadはないので待ちのまま終了を迎えます。
C02コンポーネントはキューにPayloadがポストされるとそれを取得し処理を開始します。同様に出力Payloadを生成しC03コンポーネントのキューにポストします。
C03コンポーネントはC02と同様に処理しますが次のコンポーネントはないためそれがアクションとしての出力となります。
このように、それぞれのコンポーネントは独立したスレッドで並列に動いていますが、C01、C02、C03と順に動いているように見えます。
これまで、コンポーネントは必ず次のコンポーネントのキューに出力Payloadをポストすることにより、次のコンポーネントが処理を開始していましたが、フロー制御をサポートした新しいエンジンでは、次のコンポーネント以外のコンポーネントのキューに出力Payloadをポストすることを可能とし、途中のコンポーネントをスキップしたり、別のアクションをインスタンス化しその先頭コンポーネントにポストすることにより別アクションを呼び出すことを可能としています。
C01が分岐コンポーネントだとすると条件によって、通常通りC02にポストすることもできますし、C03にポストすることもできます。
このケースでは具体的にはIfコンポーネントを使います。
C01 -> C02 -> C03 -> [END]
| |
——————-
C02コンポーネントが分岐コンポーネントだとして、通常通りC03にポストすることもできますし、条件によっては別アクションのC11にポストすることもできます。
具体的には、Jump/JumpIf/Call/CallIfコンポーネントを使います。
Jump/JumpIfを使うとC12の後は仮想[END]に繋がり、出力Payloadはアクションの出力となりますが、Call/CallIfを使うとC12の後はC03に繋がります。
+-> C11 -> C12
|
C01 -> C02 -> C03 -> [END]
別アクションの呼び出しは多段にすることも可能ですが、同じアクションが途中にあるときは無限ループになる可能性があるためRuntimeエラーとしています。
+-> C21 -> C22
|
+-> C11 -> C12 -> C13
|
C01 -> C02 -> C03 -> [END]
Ifコンポーネント
式をプロパティで指定しtrueのときは同一アクション内のComponentIdプロパティで指定した別のコンポーネントへ出力Payloadをポストする。次のコンポーネントを選ぶこともできるがそのために使うのは意味がない。このコンポーネントより前のコンポーネントを選ぶことはできない。選ぶとRuntimeエラーになる。
Jump/JumpIfコンポーネント
別アクションを呼び出す。別アクションの実行が終わっても戻ってこないでアクション全体の出力となる。
JumpIfは式をプロパティで指定しtrueの時はActionIdで指定されたアクションを呼び出すが、falseの時は次のコンポーネントにポストする。
Jumpは条件式はなく、無条件でActionIdで指定されたアクションを呼び出す。
Call/CallIfコンポーネント
別アクションを呼び出す。別アクションの実行が終わったら次のコンポーネントに戻ってくる。
CallIfは式をプロパティで指定しtrueの時はActionIdで指定されたアクションを呼び出すが、falseの時は次のコンポーネントにポストする。
Callは条件式はなく、無条件でActionIdで指定されたアクションを呼び出す。
別アクションのコンポーネントにポストしたとして、元のアクションの動作は止まりません。
上記最後のアクションの例では、C01/C02/C03/C11/C12/C13/C21/C22すべてが並列に動作しており、C02からC11にポストされても、C01は動き続けており、例えばC01がSplit、C02がJumpIfだとすると、JumpIfがC11にポストした後、Splitは動き続けてJumpIfに届いた次のPayloadはC03にポストされるかもしれません、その時には、C03とC11(既にC12にいってるかもしれない)は並列に動作を続けます。
すべての分岐コンポーネントはPayloadだけでなくコンポーネント変数cvもCloneされ、スキップ先、もしくは別アクションのコンポーネントに届きます。例えばHTTPRequestコンポーネントは出力PayloadにHTTPレスポンスのステータスなどがコンポーネント変数として設定されますが、間にIfなどを挟んだとしてもスキップした先にコンポーネントへいっても、次のコンポーネントへいったとしてもHTTPレスポンスのステータスはそのまま渡ります。
Post your comment on this topic.