Simple "tail -f" using websocket on Vert.x
Vert.xを利用したシンプルなtailコマンドのサンプルです。
timerで一定時間おきにファイルサイズをチェックし、ファイルサイズが増加していたら差分をイベントバスに送信し、WebSocketサーバー経由でブラウザにリアルタイム表示します。
一応、ファイルの読み込み部分はファイルサイズが大きくなっても耐えられるよう、NIO2のSeekableByteChannelとByteBufferを利用してランダムアクセスを行っています。
このサンプルは、2014/1/17開催の新春恒例GGX2013ロンドン報告&LT大会! - JGGUG G*ワークショップZ Jan 2014で発表した内容に、多少手を加えたものです。 発表資料はこちらです。
- JDK7以上
- Vert.x 2.0以上(2.1M2で動作確認済み)
- WebSocket対応ブラウザ
http://vertx.io/install.html を参照してください。
Bashが使える環境でしたら、GVMを利用するのがオススメです。
できればvertxコマンドにパスを通しておく方が何かと楽です。
適当なフォルダでgit cloneなりしてください。vert.x以外への依存関係はないので、配置先など特に制限はありません。
WebTail.conf(JSON)を編集して、
- tail対象のファイル名
- WebSocketのポート
を指定してください。
$ vertx run WebTail.groovy -conf WebTail.conf
サーバーが起動したら、WebSocket対応ブラウザ(Chrome/Safari等)で http://localhost:<websocket_port/ を開いてください。
1秒おきに監視対象のファイルの内容の更新差分がブラウザに表示されるはずです。例えば以下のコマンドなどで試してください。
$ for i in {1..5}; do date >> /tmp/dummy.log; sleep 1; done
$ cat /dev/null > /tmp/dummy.log
- Vert.x Core Manual: Periodic Timers
- Vert.x Core Manual: WebSockets
- Using Vert.x from the command line
- java.nio.channels.SeekableByteChannel
- ITPro Java技術最前線「New I/Oで高速な入出力」第3回 バッファを使ってみよう
- エラーハンドリング全般
- フィルタ(メッセージ変換)でJSON化など->ElasticSearch連携とか
- セキュリティ確保の仕組み