そして例外処理へ
socket.ioの仕組みは面白いですがそこまでならずとも、すでにNode.jsコアでHTTPをハンドルしている仕組みのレベルで面白いです。というか、大変好き。
http://mk.hatenablog.com/search?q=Grizzly
https://grizzly.java.net/
こちらはこのブログの検索リンクと本家サイトです。相当前の日付ばかりですけどGrizzlyというのにしばらくハマってました。調べてみると今でもがんばってるみたい。ただしググっても「grizzly java」とか「grizzly nio」とかやっても本家以外は古い日付ばかりです。ブレイクせずに今に至るかなと。隠れて組み込まれてどっかですごいことになってるのかもしれないけど。うん、このときに作りたかったものはNode.js+socket.ioみたいなものをJavaで実現するものだったのだなあ。そして一番ダメなのがJavaでやろうとすることだった。Javaなら絶対ブロッキングコード書いちゃうもの。たぶん出来るからこそおかしなことをはじめちゃう。
で、気を取り直してNode.jsでいいじゃない!昔と違って老いて体力も無いしって。そうなってくると悩むのが例外処理です。Javaの例外処理は体に染みてるのでわかるけど、JavaScriptのそれはどこまでどうしたものかまったく加減が分からない。Node.jsでは元々processでイベントハンドラちっくに非同期かつ後日の例外発生を押さえていたところ、domainというものが入ってきたと。。。いまのところよく分からない。捕捉スコープを自由に設定することがこのdomainによってできるようにしたかったみたいだけど、だからこそどういった粒度で例外設計したものか。。。わからん。勉強続けます。
ただ、これをちゃんとやらないと、単一ループで全部回してるNode.jsのアプリケーションはなんかあったらすぐ落ちちゃう。WEBを泳ぐとどうにも、reqとresをconnectのミドルウェアで押さえてOKみたいな感じに見えるんだよなあ。マジどうしてるんだよ、みんな。
var domain = require('domain'); app.use(function(req, res, next) { var d = domain.create(); d.on('error', function(e) { res.statusCode = 500; res.setHeader('content-type', 'text/plain'); res.end('Internal Server Error\n'); }); d.add(req); d.add(res); d.run(next); });
これで捕捉できてるんだろうか。。。そして、これでWebSocketはどう押さえるんだ?おさえられてるのか?domain.jsは約240行のコードでrequireしてるのはutilとeventsのみですか。。。読めってことですな、これは。一方でhttpは2000行以上。。。老いたので体力に課題が。