HTTPリクエストからChannelへメッセージを送る

GETやPOSTなどのHTTPリクエストを受け取り、その処理の中でChannelにデータを送信したい場合、以下のように書くことでメッセージを送信できる。

HelloPhoenix.Endpoint.broadcast_from! self(), "rooms:lobby", "new_msg", %{uid: uid, body: body}

http://hexdocs.pm/phoenix/Phoenix.Channel.html の "Broadcasting to an external topic" の箇所に書いてあったのを ここ に合わせて少し変更した。そこの例では channel 側のコードとして書かれているけど、controller 側のコードの中でも使えた(まあ、*.Endpoint モジュールの関数なので当たり前?)。

ちなみに、これで何をしたかったのかというと、fluentd でログを転送して、それをブラウザでリアルタイムで見れるようにしたかった。

こんな感じ。

       +---------+     +---------+
Log -> | fluentd |     | Browser |
       +---------+     +---------+
           |                A
           |                | 
           +-- HTTP(POST)   +-- Websocket
           |                |
           V                |
       +-----------------------+
       |         Phoenix       |
       +-----------------------+