Triggerノードを使う(その2)
ここのところずっとNode-REDのサンプルを見ながら各ノードの使い方を確認しています。頭出しの記事はこちらをご確認ください。今回からTriggerノードシリーズです。
メッセージが来なくなったら定期的にメッセージを送り続ける
見出しを読んだだけだとなんのこっちゃ?という感じではありますが、サンプルを見ていきます。確認するサンプルは「flows > node-red > function > trigger > 03 - Send placeholder message when a stream stops sending」です。
Triggerノードが2つあるのでそれぞれ確認していきます。まずは下流の「resend every 2s」から。内容を言葉で表現すると以下の通りです。
- メッセージを受け取ったら、それ以降2秒間隔でmsg.payloadに「0」を設定したメッセージを出力する
- msg.payloadの値が「reset」だったら初期化(繰り返し動作を停止)する
続いて左側の「trigger 2s」。内容は以下のとおりです。
- メッセージを受け取ったらmsg.payloadに文字列「reset」を設定したメッセージを送信する
- 2秒以内に新たなメッセージを受け取らなければmsg.payloadに「true」を設定したメッセージを送信する
- 2秒以内にTriggerノード「trigger 2s」がメッセージを受け取っていればログ出力されません
- Injectノードを連打し続けると確認できます
- Triggerノード「trigger 2s」がメッセージを受け取らない時間が2秒以上あくとTriggerノード「resend every 2s」がメッセージを出力し続けます
常に動き続けていてほしいシステムが止まったら警告メッセージを出す、みたいな用途で使えそうです。
タイムアウト機構を実現する2
次に確認するサンプルは「flows > node-red > function > trigger > 04 - Timeout processing using trigger node」です。タイムアウト機構を実現します。タイムアウトといえば、前回の記事で一定時間メッセージを受信しなかったらメッセージを送信するサンプルを確認しましたが、今回はもう少し複雑です。
左から順番に見ていきます。まずはInjectノードから。msg.payloadに数値「1」を設定して出力しています。
- 受信したメッセージを第一のポートにそのまま出力
- 3秒待って、msg.payloadに文字列「0」を設定したメッセージを第二のポートに出力
続いてTriggerノードの第一ポートに繋がっているFunctionノードです。動作は次の通りです。
- msg.payloadに指定された時間(この場合1秒)待って、msg.payloadに文字列「done 〜s」を設定したメッセージを送信
FunctionノードとChangeノードの出力はどちらもTriggerノード「trigger 10s」につながっています。ここまでの動作を整理すると次のようになります。
- Triggerノード「trigger 3s」でメッセージが2つに分岐します
- 実はどちらも同じmsg._msgidを持っており、これは後述するTriggerノード「trigger 10s」で利用します
- Functionノードを通るメッセージはInjectノードで指定した時間(1秒または5秒)遅れてTriggerノード「trigger 10s」に流れます
- 一方、Changeノードを流れるメッセージは3秒(固定値)遅れてTriggerノード「trigger 10s」に流れます
さて、いよいよ最後のTriggerノード「trigger 10s」を確認します。内容は次のとおりです。
- メッセージを受信したらそれをそのまま出力し、その後10秒間何もしません
- この動作は「msg._msgid」毎に動きます
- つまり、値が同じ「msg._msgid」であれば、最初に届いたメッセージの内容を出力し、後から届いたメッセージを破棄する挙動になります。
Changeノードを通るメッセージの遅延は3秒で固定されているので、Injectノードで5秒遅延するメッセージを流すと、Triggerノード「trigger 10s」に届くメッセージの順序が逆転してtimeoutします。
一個ずつ説明するとやたらと複雑ですが、こんな感じです。
まとめ
今回確認したTriggerノードの機能をまとめます。
- Triggerノードが後から出力するポートを第二のポートから出力してフローを分岐できます
- 同じmsg._msgidを持つメッセージに同じ条件を適用してまとめて扱うことができます
これでTriggerノードシリーズ終了です。
コメント
コメントを投稿