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