ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

JAX-RS アプリケーションを Groovy で書いて Grizzly で動かすサンプルコード

JAX-RS 実装として Jersey 2.6 を使って JAX-RS アプリケーションを書いて、Java 製 HTTP サーバーの Grizzly で動かす、ということをしてみたのでサンプルコードを残しておく。 Groovy で書いた。

依存ライブラリの管理も Grape を使ってコード中で行っているので、groovy コマンドが使える環境であれば次のコードを適当なファイル (test.groovy とか) にコピペして groovy test.groovy とコマンド入力すれば実行することができる。 初回起動時は依存ライブラリを取ってくるので時間がかかるはず。

手元で web アプリケーションを動かしたいけどちゃんとしたプロジェクトを作るほどではない、みたいなときに Groovy で書いて Grizzly 上で動かしたら便利だなー、と思った。

実際に書いたコード

上のドキュメント (「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"