-SimpleGrizzly

Grizzlyでつくる出来る限りシンプルなHTTPサーバ。

package org.ashikunep.iyomante;
import java.io.IOException;
import com.sun.enterprise.web.connector.grizzly.SelectorThread;
import com.sun.enterprise.web.connector.grizzly.standalone.StaticResourcesAdapter;
public class SimpleGrizzly {
  public static void main(String[] args)
      throws IOException, InstantiationException {
    SelectorThread selectorThread = new SelectorThread();
    selectorThread.setPort(8080);
    StaticResourcesAdapter adapter = new StaticResourcesAdapter();
    String root = args.length > 0 ? args[0] : "/";
    adapter.setRootFolder(root);
    selectorThread.setAdapter(adapter);
    selectorThread.initEndpoint();
    selectorThread.startEndpoint();
  }
}

ここで、AdapterというのはTomcatのCoyoteフレームワークのインターフェイスが実装されたものなんですが。。。うーん。コレも作り直して欲しいねえ。たとえばこの例ではシンプルなんでやってませんが、この方向性でもうちょっと手を加えるとなるとAdapterのservice(Request, Response)メソッドを実装することになるかと思います。そうとなると、このRequestですでに結構なことをやっているのが見つけられます。ServletAPIのほうで現れるAttributeをMapで用意していたり。また、書き出しが独自のByteChunkを用いていますがこれこそnioのByteBufferなんかを使った実装なほうが徹底していていいんじゃないかなと。デカいバッファだったらヒープ外のダイレクトマッピングなnio.DirectByteBufferでいけたりして(このへん覚えたてなんで言ってみたいだけだったりしてw)。まだ読み進めてないですが、Grizzly的にはPipeline-Taskを実装するといった具合で生でやれちゃうのかな?。。。となるとSelecterThreadは最基底なんで、abstract SelectThread <- CoyoteSelectThreadというふうに、もう一段はさんで抽象化してほしかったかな。
いか〜ん、Tapestry5を見るはずの隙間時間はすべてGrizzlyにとられている。。。