Java SEアプリケーションにHTTP Server機能を組み込みたい(Grizzly編)

受託の開発をやっていると既存のJava SEアプリケーションにHTTP Serverとしての機能を組み込みたい、といった要件を提示されることも多々あります。
GrizzlyはJava EEアプリサーバのGlassFishで採用されているHTTPサーバの実装ライブラリで、Java SEアプリケーションに単体で組み込むこともできます。

公式サイト
https://javaee.github.io/grizzly/

公式のサンプルほぼそのままですが、Mavenプロジェクトでの実装例を記載します。

まずは、pom.xmlに以下の通り追記して保存します。

<dependencies>
	<dependency>
		<groupId>org.glassfish.grizzly</groupId>
		<artifactId>grizzly-http-server</artifactId>
		<version>2.4.4</version>
	</dependency>
</dependencies>

Grizzlyを使用するために必要なライブラリが自動的ダウンロードされプロジェクトに取り込まれます。
うまくいかない場合は、おおよそWebプロキシが原因なのでsettings.xmlに然るべき設定をしてリトライしましょう。

次に新規クラスを作成してmainメソッドを以下の通り記載します。

package net.xamarinian.examples;

import java.nio.charset.StandardCharsets;

import org.glassfish.grizzly.http.server.HttpHandler;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.http.util.ContentType;

public class GrizzlyMain {

	/**
	 * Java SEアプリケーションにHTTP Serverを組み込むサンプル(Grizzly版)
	 * @param args
	 */
	public static void main(String[] args) {
		// リッスンポート8080でサーバインスタンスを生成
		final HttpServer server = HttpServer.createSimpleServer();
		// サーバにハンドラを登録
		server.getServerConfiguration().addHttpHandler(
				new HttpHandler() {
					@Override
					public void service(Request request, Response response) throws Exception {
						String data = "Hello Grizzly!!";
						response.setContentType(ContentType.newContentType("text/plain", "UTF-8"));
						response.setContentLength(data.getBytes(StandardCharsets.UTF_8).length);
						response.getWriter().write(data);
					}
				}, "/grizzly");

		try {
			// HTTP Server開始
			server.start();
			System.out.println("Press any key to stop the server...");
			System.in.read();

		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			server.shutdownNow();
		}
	}
}

mainメソッドの実装が終わったらさっそくアプリケーションを実行してみます。
サンプルのHttpServerへはhttp://localhost:8080/grizzlyからアクセスすることが可能です。
Webブラウザからも当然アクセス可能ですが、PowerShellのInvoke-WebRequestコマンドレット(curl)を使うとヘッダ情報まで確認できて便利です。

PS C:\Windows\system32> curl http://localhost:8080/grizzly


StatusCode        : 200
StatusDescription : OK
Content           : Hello Grizzly!!
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 15
                    Content-Type: text/plain;charset=UTF-8

                    Hello Grizzly!!
Forms             : {}
Headers           : {[Content-Length, 15], [Content-Type, text/plain;charset=UTF-8]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 15