Payara Micro のからくり

この記事は Java EE Advent Calendar 2015 の 8 日目です。昨日は @n_agetsu さんの「Javaバッチ処理のNFS向けファイルI/O」でした。

今回は当初、GlassFish と Payara の最新事情に関する記事を予定していましたが、GlassFish Japan に掲載した方が良さそうなので、後日そちらに書きます。代わりに今回は Payara Micro のあまり知られていないことを紹介します。

1. Payara Micro の正体

Payara Micro の正体は埋め込み GlassFish のラッパーです。その証拠に GlassFish の埋め込みサーバー API がそのまま使えます。個人的には Payara Micro の API の方がシンプルで使いやすいと思いますが。

Payara Micro は非常に短期間で開発され、しかも当初から商用レベルの品質に達していました。埋め込み GlassFish という完成品をラップしただけなので、ある意味当然の結果と言えます。

2. Payara Micro を Ctrl + C で停止できる理由

埋め込み GlassFish は本来、シャットダウンのためのコードを記述する必要があります(忘れるとリソースリークの原因となります)。Payara Micro はシャットダウン・フックに埋め込み GlassFish のシャットダウン・コードを実装しているため、Ctrl + C で自動的にシャットダウンするような仕組みになっています。

ただし、Payara Micro API を JavaFX アプリケーションから使用する場合、どうやら JavaFX がシャットダウン・フックを乗っ取ってしまうらしく、別途シャットダウンのメソッドを呼び出す必要があります。

3. Payara Micro で asadmin のコマンドを実行できる理由

asadmin は見かけこそスクリプトですが、実体は GlassFish/Payara の管理・監視 API をラップする一番外側の皮です。つまり asadmin を使わなくても API を直接呼び出すことで同様の操作ができるわけです。例えば Eclipse の GlassFish Tool などは直接 API を呼び出すことで GlassFish/Payara の起動・停止・デバッグ実行を実現しています。

Payara Micro API も GlassFish の管理・監視 API を呼び出すことで asadmin コマンドを実行できるようになっています。そもそも埋め込み GlassFish 自身が管理・監視 API を内包していて、埋め込みサーバー API のバックエンドに利用しているのです。

ただし、Payara Micro API でドメインの起動・停止・再起動はやらない方が無難です。少なくとも筆者の環境では上手くいった試しがありません。

4. Payara Micro の自動バインドとは?

Payara Micro には動的に HTTP(S) ポートをリスンする自動バインド機能が備わっています(既定では無効)。これは指定したリスンポート (既定では HTTP が 8080、HTTPS が8181) が空いているかどうかを調べ、使用中ならば空いているポートが見つかるまでリスンポートをインクリメントしていく仕掛けになっています。この機能は Hazelcast のリスンポート周りの挙動を HTTP(S) でも実現したいという、ただそれだけの理由で追加されました。実装も難しいものではありません。

自動バインドは機能そのものとしては面白いしデモのネタにはなるのですが、現在のロードバランサーの多くがアドレスとポート番号を直接指定していることを考えると、今のところ実用性は薄いのかもしれません。

今回は Payara Micro が裏で何をしているのかについて、いくつかピックアップしてご紹介しました。Payara はオープンソースなので、ソースコードを見れば今回ご紹介したことは全部分かってしまうのですが、ミドルウェアのソースコードを積極的に見ることはあまりないかと思って、ちょっとまとめてみました。

明日は @koduki さんです。