Gws 20140117 lt

11

Click here to load reader

Transcript of Gws 20140117 lt

Page 1: Gws 20140117 lt

2014.1.17

須江信洋(@nobusue)

http://d.hatena.ne.jp/nobusue

https://www.facebook.com/nobuhiro.sue

G*ワークショップZ

2014新春LT大会

『Vert.xで何か作ってみた』

Page 2: Gws 20140117 lt

自己紹介

須江 信洋(すえ のぶひろ) Twitter: @nobusue

https://www.facebook.com/nobuhiro.sue

約10年ほどJavaEE関連の仕事をしてます

2013年10月よりフリーランス(個人事業主)

G*(Groovy関連技術)との関わり JGGUGサポートスタッフ

「プログラミングGROOVY」執筆チーム

「Groovy イン・アクション」翻訳チーム

2

Page 3: Gws 20140117 lt

憶えてますか?

3

2013.10.18 (10.20 updated)

須江信洋(@nobusue)

http://d.hatena.ne.jp/nobusue

https://www.facebook.com/nobuhiro.sue

G*ワークショップZ

Vert.xハンズオン w/ CRaSH

Page 4: Gws 20140117 lt

使わないと忘れちゃうよね・・・

ということで、作ってみました

Vert.x WebTail (仮称) WebSocketとNIO2でブラウザにtail –f

node.jsではポピュラーなネタらしい

でも、なんちゃってtail(内部でtail –fコマンド実行)ばっか・・・・

4

Page 5: Gws 20140117 lt

動機

Windowsでもtail-f 使いたい!!!

5

Page 6: Gws 20140117 lt

こんなの作ってみた

6

ファイル Verticle

socket

WebSocket

Vert.x Runtime(JVM)

polling

NIO2の

SeekableByteChannelで

ファイル末尾を読み込み

ブラウザ

Page 7: Gws 20140117 lt

WebTail.groovy (WebSocket)

7

def eb = vertx.eventBus

vertx.createHttpServer().websocketHandler { ws ->

eb.registerHandler("update", { message ->

ws.writeTextFrame(message.body())

})

}.requestHandler { req ->

if (req.uri == "/") req.response.sendFile “console.html"

}.listen(8080)

Page 8: Gws 20140117 lt

WebTail.groovy (tail部分抜粋)

8

def timerID = vertx.setPeriodic(1000) { timerID ->

size = sbc.size()

def sb = new StringBuilder()

if( size > lastsize ) {

while(sbc.read(buf) > 0) {

buf.flip()

sb << Charset.forName(encoding).decode(buf).toString()

}

print sb

eb.publish("update", sb.toString())

} else if ( size < lastsize ) {

Page 9: Gws 20140117 lt

サンプルコード

GitHubに置いてあります https://github.com/nobusue/vertx-webtail

「とりあえず動く」レベルの実装なので、改造歓迎

9

Page 10: Gws 20140117 lt

今後の野望

割と簡単にtail –fができたので満足

いろいろ拡張したい ポーリング ⇒ Java7のWatchService

メッセージ変換 ⇒ JSONなど

ElasticSearch対応 JSON変換してREST APIで投入すればいけそう

td-agentの代替 大人の事情でRuby系がNGな環境で・・・

10

Page 11: Gws 20140117 lt

ありがとうございました

11

https://www.facebook.com/orehiji