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ノードを組み合わせると、以下の挙動になります。
  • 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」を設定して出力しています。


続いてTriggerノード「trigger 3s」の内容は次のとおりです。
  • 受信したメッセージを第一のポートにそのまま出力
  • 3秒待って、msg.payloadに文字列「0」を設定したメッセージを第二のポートに出力


続いてTriggerノードの第一ポートに繋がっているFunctionノードです。動作は次の通りです。
  • msg.payloadに指定された時間(この場合1秒)待って、msg.payloadに文字列「done 〜s」を設定したメッセージを送信

一方、Triggerノードの第二ポートに繋がっているChangeノードはmsg.payloadに文字列「timeout」を設定したメッセージを出力しています。


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ノードシリーズ終了です。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)