JAX-RS アプリケーションを Groovy で書いて Grizzly で動かすサンプルコード
JAX-RS 実装として Jersey 2.6 を使って JAX-RS アプリケーションを書いて、Java 製 HTTP サーバーの Grizzly で動かす、ということをしてみたのでサンプルコードを残しておく。 Groovy で書いた。
- Groovy 公式サイト: Groovy - Home
- Jersey 公式サイト: Jersey
- Grizzly 公式サイト: Project Grizzly
依存ライブラリの管理も Grape を使ってコード中で行っているので、groovy
コマンドが使える環境であれば次のコードを適当なファイル (test.groovy とか) にコピペして groovy test.groovy
とコマンド入力すれば実行することができる。 初回起動時は依存ライブラリを取ってくるので時間がかかるはず。
手元で web アプリケーションを動かしたいけどちゃんとしたプロジェクトを作るほどではない、みたいなときに Groovy で書いて Grizzly 上で動かしたら便利だなー、と思った。
実際に書いたコード
- Jersey のドキュメント: Chapter 4. Application Deployment and Runtime Environments
上のドキュメント (「4.5.1.2. Grizzly HTTP Server」) にあるコードをベースにしている。
@Grab(group='org.glassfish.jersey.containers', module='jersey-container-grizzly2-http', version='2.6') import org.glassfish.grizzly.http.server.HttpServer import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory import org.glassfish.jersey.server.ResourceConfig import java.net.URI import java.util.concurrent.CountDownLatch import java.util.concurrent.Future import java.util.concurrent.TimeUnit import javax.ws.rs.GET import javax.ws.rs.Path import javax.ws.rs.Produces import javax.ws.rs.core.UriBuilder @Path("/") class HelloWorldResource { @GET @Produces("text/plain; charset=utf-8") String getResource() { return "Hello world!" } } final URI baseUri = UriBuilder.fromUri("http://localhost/").port(10082).build() final ResourceConfig config = new ResourceConfig(HelloWorldResource.class) final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(baseUri, config) // 以下、終了処理 final mainThreadWaiter = new CountDownLatch(1); addShutdownHook { println "To be shutdown..." mainThreadWaiter.countDown() Future f = server.shutdown() // `final` 修飾子が有効でなくても `server` 変数のメモリ可視性って保証される? f.get(15, TimeUnit.SECONDS) } mainThreadWaiter.await() println "Main thread stopped"