JavaでCGIを作る

JavaSE6のあまりの軽さに、以前CGI用途もいけるんじゃね?と以下のエントリで書いた。

http://d.hatena.ne.jp/shin/20081124/p1



今回は実際にCGIを作ってみたいと思う。Apacheだと準備するのが面倒そうに思えたのでAN HTTPDで。

準備

CGIのコードは以下のとおり。CでCGI作っていた時代を思い出す。適当に環境設定を出力するもの。

package javacgi;

public class Main {

    public static void main(String[] args) {

        System.out.printf("Content-Type: text/html; charset=Shift_JIS\r\n\r\n");
        System.out.printf("<html>%n");
        System.out.printf("QUERY_STRING   :%s<br>%n" , System.getenv("QUERY_STRING"));
        System.out.printf("SCRIPT_NAME    :%s<br>%n" , System.getenv("SCRIPT_NAME"));
        System.out.printf("SCRIPT_FILENAME:%s<br>%n" , System.getenv("SCRIPT_FILENAME"));
        System.out.printf("REQUEST_METHOD :%s<br>%n" , System.getenv("REQUEST_METHOD"));
        System.out.printf("</html>");

    }

}

んで、アダプタ的なバッチファイル。クラスパスは適当に。今回はNetBeansのbuildをクラスパスルートにした。これでさまざまなクラスがあろうが、クラスの単体コンパイルで毎回最新になってくれる。別にjarアーカイブにする必要はない。mainのクラス指定を変えればよいだけ。
javacgi.bat

@echo off
java -cp C:\_product\_test\JavaCGI\build\classes javacgi.Main

本来ならばちゃんとJavaのプロセスを起動してくれるやつを用意するべきだとは思うが面倒なので今回はこれでいく。


実行

URLは以下のとおり。

http://localhost/cgi-bin/javacgi.bat?param=123


結果。

QUERY_STRING :param=123
SCRIPT_NAME :/cgi-bin/javacgi.bat
SCRIPT_FILENAME:C:\_work\application\httpd142p\htdocs\cgi-bin\javacgi.bat
REQUEST_METHOD :GET

うん、問題ない。VMの起動があからさまに遅いとかそういうことはなく、レスポンスは悪くない。

単純なレスポンスのテスト

あまりにあっけなく動いてつまらないのでレスポンスを検証してみる。JMeterを起動。単純なレスポンス比較のためスレッド1で。

200回の結果は以下のとおり。

まぁ、早くはないけど社内LANとかなら十分対応可能ななレスポンスあるもんだなと思った。VMさえ起動してしまえばあとはどうにでもなると思うし。


今度はbatファイルのみを実行してみる。

Javaのプロセス起動でおおむね50ms程度増えてるってことかな。


おまけでT2Frameworkのサンプル。鯖はGlassfish V3で。アダプタはLucyにしてある。

さすがにサーブレットは早い。最小値が恐ろしいほど早い…のだが、たまにものすごく遅いときがある。たまにといいつつ頻度は多い。まぁチューニングしだいでこの辺は大きく変わると思うけど、初期設定のアプリケーションサーバーほど危険なものはないというのがこれでわかったかな。しかし、CGI版より平均値で劣るとは正直思わなかった。


さらにCubbyのサンプルでテスト。

最小値はT2とくらべると若干値が悪いようだ。そのかわり悪い値が出る頻度がかなりT2より少なく、結果平均値ではかなり低い値となった。レスポンスは安定してるほうがやっぱりいいね。

役に立たないくだらないことをやると気分がいいね!