Java App Server

サービスとは?

Windowsシステム上で、Javaアプリケーションはコマンドプロンプトで動かすことができますが、 ユーザーアカウントで、システムに常にログインしている状態で、 コマンドプロンプトを開き、デスクトップ上で動かす必要があります。

これには、セキュリティ面やシステムパフォーマンス面、いくつか難点があり、 例えば、ユーザーがコマンドプロンプト上でキーの押し間違いで、 Javaアプリケーションを終了させてしまったり、というリスクが伴います。

それらの問題を解決するために、Windowsではアプリケーションをサービスとしてバックグランドで動かすことができます。 サービスはシステムのスタートアップ時に起動され、ユーザーのログインを必要としません。 システム管理者以外のユーザーがサービスを停止、開始、あるいは設定変更をすることができないため、 これはセキュリティ面でもシステム全体の安定性の向上においても非常に良いことです。

ただ一つ問題は、Java自身が自力でサービスとして動作できないことです。 Windowsの「sc」コマンドのような、よくあるシンプルなツールでは、 サービスとしてJavaを動かすことはできますが、 ユーザーがマシンからログオフするのと同じくらい簡単に、ユーザーがJavaをシャットダウンさせることもできます。

Java Service Wrapperを使うと、Windowsサービスとして動作を可能にするばかりでなく、 Javaアプリケーションの起動も簡単にすることができます。 また、高度な障害迂回、エラーリカバリー(回復)、分析機能なども加え、 アプリケーションを最大限の動作可能時間で運用できるよう確実に実現できます。

シンプルな HelloWorldServer Javaクラス

例えば、サンプル例のように シンプルなHelloWorldServerアプリケーションを利用しており、 バックグランドで動作し、telnetでクライアントから接続します。

この例のようなHelloWorldServerアプリケーションを作成して構築する方法については、 アプリケーションの概要詳細をご覧ください。

そのサンプル例を実際に動かしたくなければ、以下のJavaコマンドラインを利用して動かすことができますので、事は足りるでしょう。

サンプル例を動かす:
java -classpath lib\classes HelloWorldServer

HelloWorldServerクラスを包む(ラップする)

HelloWorldServerクラスをサービスへ移管するには、まず初めのステップとして、 弊社のサンプルアプリケーションが動くようにJava Service Wrapperを設定します。 大多数のJavaアプリケーションに対して言えることですが、Javaコードを書く必要なく、間単に設定が可能です。

ディレクトリー構造

Wrapperは非常に柔軟性の富んでおり、いかなるディレクトリー構造においても動作するように設定することができます。 この例のように、やや複雑なアプリケーションにおいても、 再利用できるようなシンプルなディレクトリー構造にすることをおススメします。 自分で選択した任意のディレクトリー下に、次のディレクトリー構造を再形成してください。 このルートディレクトリーを「%EXAMPLE_HOME%」と呼びます。 これは、HelloWorldServer概要で説明しているディレクトリー構造の拡大版です。

ディレクトリー構造:
%EXAMPLE_HOME%\
%EXAMPLE_HOME%\bin\
%EXAMPLE_HOME%\conf\
%EXAMPLE_HOME%\lang\
%EXAMPLE_HOME%\lib\
%EXAMPLE_HOME%\lib\classes\
%EXAMPLE_HOME%\logs\

Java Service Wrapperを入手する

ダウンロードページから、 ご自分の利用しているOSに対応するJava Service Wrapperの最新版をダウンロードし、 ダウンロードした圧縮ファイルを任意のディレクトリーに解凍してください。 解凍先ディレクトリーを「%WRAPPER_HOME%」と呼びます。

Wrapperファイルをコピーする

Java Service Wrapperは3つの主要なコンポーネントで成り立っています。 Wrapperバイナリjarファイル、jarファイルで使われるネイティブライブラリーです。 以下のように、その3つのファイルをコピーしてください:

ファイルをコピーする:
%WRAPPER_HOME%\bin\wrapper.exe -> %EXAMPLE_HOME%\bin\wrapper.exe
%WRAPPER_HOME%\lib\wrapper.jar -> %EXAMPLE_HOME%\lib\wrapper.jar
%WRAPPER_HOME%\lib\wrapper.dll -> %EXAMPLE_HOME%\lib\wrapper.dll

Wrapperは、バッチファイルを利用したり、直接コントロールすることができます。 これらのファイルについての詳しい説明は、Windows上でアプリケーションを起動するページをご覧ください。 その例では、直接Wrapperを実行します。

国際化/ローカライゼーション:

もしWrapperを英語以外の言語で利用したい場合、 ローカライゼーションリソースである「lang」ディレクトリー丸ごとコピーしてください。

ファイルをコピーする:
%WRAPPER_HOME%\lang -> %EXAMPLE_HOME%\lang

ライセンスキー:

Java Service Wrapperのスタンダード版やプロフェッショナル版を動作させるために ライセンスキーが必要です。 Wrapperには、 トライアルライセンス(15分間)のライセンスキーを 同梱しています。今、それもコピーしてください。 ページ上部にある「無料トライアル」ボタンをクリックして、長期間トライアルライセンスの申請をすることもできます。

ファイルをコピーする:
%WRAPPER_HOME%\src\conf\wrapper-license-time.conf -> %EXAMPLE_HOME%\conf\wrapper-license.conf

Wrapperコンフィギュレーションファイル:

最後に、デフォルトのWrapperコンフィギュレーションファイルをコピーします。 その設定ファイルの編集方法については、次のセクションで説明します。

ファイルをコピーする:
%WRAPPER_HOME%\src\conf\wrapper.conf.in -> %EXAMPLE_HOME%\conf\wrapper.conf

Wrapperコンフィギュレーションファイル

%EXAMPLE_HOME%\conf\wrapper.confファイルを「ノートパッド」などのテキストエディターで開いてください。

以下の各プロパティを探して値を設定してください。

コンフィギュレーションファイル:
wrapper.java.command=java
wrapper.java.command.loglevel=INFO

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=HelloWorldServer

wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/classes

wrapper.java.library.path.1=../lib

wrapper.logfile=../logs/wrapper.log

wrapper.console.title=Hello World Server
wrapper.name=helloworldserver
wrapper.displayname=Hello World Server
wrapper.description=Hello World Server
  • wrapper.java.command] プロパティで、利用するJavaコマンドの配置場所を指定します。 ここで指定した値は、システムパス上に配置されます。 また、絶対パスで指定することも可能です。

  • wrapper.java.command.loglevel] プロパティは任意設定ですが、Wrapperが生成するJavaコマンドラインのデバッグに便利です。 最初の利用開始時には、何か問題が起きたときを考え、最短の解決に向けて、情報ログを含めることを推奨しますが、 一旦、アプリケーションが正しく動作するようになったら、このプロパティをコメントアウト(コメント記号で無効化)にすると良いでしょう。

  • wrapper.java.mainclass] プロパティで、起動したときにJavaへ引き渡すメインクラスを指定します。 これが、新しいユーザーにとって、混乱する点の1つですが、 ほとんどの場合、これは、Javaアプリケーションのメインクラスではなく、Wrapperのヘルパークラスの1つになるでしょう。 Wrapperでは、いくつかのインテグレーション方法をサポートしていますが、 この例にあるように、ここでは一番シンプルな方法 「インテグレーション方法1「WrapperSimpleApp」ヘルパークラス」を利用します。 このヘルパークラス[org.tanukisoftware.wrapper.WrapperSimpleApp]で JVMライフサイクルやWrapperとのバックエンド通信を管理します。 現時点では、この点について心配する必要はありません。

  • アプリケーション「HelloWorldServer」の実際のメインクラスは、 [wrapper.app.parameter.1] プロパティを使って、最初のパラメータとして引き渡されます。 そのプロパティのナンバリングインデックスを使って、 追加のパラメータとして「HelloWorldServer」へ引き渡すことが可能です。 例えば、「wrapper.app.parameter.2=P1」です。

    ここでは示しませんが、 [wrapper.java.additional.<n>] プロパティを使って、Javaパラメータを追加することも可能です。

  • wrapper.java.classpath.<n>] プロパティを使って、クラスパスを指定します。 弊社のサンプルアプリケーションに2つのクラスパス指定が必要です。 1つ目は、Wrapperのヘルパークラスを含んでいる「wrapper.jar」ファイルで、これは必須で指定してください。 2つ目は、「HelloWorldServer」クラスが配置されている 「lib/classes」ディレクトリーを指定してください。

  • Wrapperでは、いくつかの機能を実装するために、 ネイティブライブラリーwrapper.dll」を活用します。 多くのJavaアプリケーションでは、ネイティブライブラリーを利用しませんので、慣れていないかもしれませんが、 [wrapper.java.library.path.<n>] プロパティでこれらのライブラリーが配置されている場所を指定します。 現時点では、この点について心配する必要はありません。

以上で、Javaアプリケーションをどのように動作させるのか、Wrapperに指示を出しました。

あと2、3の設定する必要があるプロパティがあります。

全てのプロパティ値を設定する際に、1つ注意しなければならない大切なことは、 常に、wrapper.exe」バイナリの配置場所へ 相対参照のパスで指定してください。

ここで設定している各種プロパティに加えて、コンフィギュレーションファイルに関する重要な基本設定が2、3つあります。

コンソールでHelloWorldServerを動かす

ここでWrapperのセットアップは完了しました。 ここで設定したコンフィギュレーションをテストするために WindowsコマンドプロンプトでWrapperを開始してみましょう。

新しくコマンドプロンプトを開き、「cd」コマンドを使って、 自分の「%EXAMPLE_HOME%」ディレクトリーに移動しましょう。

次のように、WrapperとインテグレーションしたJavaアプリケーションを開始できます:

bin\wrapper.exe -c ..\conf\wrapper.conf

コンフィギュレーションファイルの配置場所はWrapperバイナリから相対的な位置にある点に注目してください。 異なる方法を使って起動すると、これは少し直観と相いれないと思いますが、Wrapperの信頼性が非常に向上します。

Wrapperが開始すると、次のように見えるでしょう:

wrapper  | --> Wrapperがコンソールとして開始しました
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |
wrapper  | --------------------------------------------------------------------
wrapper  | Java Service Wrapperに関心をお寄せいただき、ありがとうございます。
wrapper  |
wrapper  | トライアルライセンスキーで完全なフル機能として動作しており、
wrapper  | 何度でも好きなだけ、Java Service Wrapperを動作させたり
wrapper  | 再起動したりできます。Wrapperの各起動は自動的に
wrapper  | 15分後にシャットダウンします。
wrapper  |
wrapper  | この制限つきトライアルライセンスキーは、トライアルライセンスの
wrapper  | リスエストを提出する必要はなく、様々なマシン上で、素早くコンフィギュ
wrapper  | レーションテスト用に便利に使えます。さらに利用時間の延長が必要なら
wrapper  | すぐに1カ月の無料トライアルライセンスを取得することもできます:
wrapper  |   https://wrapper.tanukisoftware.com/trial
wrapper  |
wrapper  | Java Service Wrapper 利用を有効化するライセンスキーが必要です。
wrapper  | ライセンスキーは Java Service Wrapperウェブサイトで購入できます:
wrapper  |   https://wrapper.tanukisoftware.com/purchase
wrapper  |
wrapper  | 開発やテスト運用の目的で利用されているトライアルライセンスキー
wrapper  | のため、デプロイされたシステムの一部として利用できません。
wrapper  | --------------------------------------------------------------------
wrapper  |
wrapper  |
wrapper  | JVM起動中...
wrapper  | コマンド:"C:\Sun\jdk1.6.0_10_x64\bin\java.exe" -Djava.library.path="../lib" \
                      -classpath "../lib/wrapper.jar;../lib/classes" -Dwrapper.key="BBXKL6wk_SGpOV-i1z3E6yTeW1NQr62T" \
                      -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=464 \
                      -Dwrapper.version="x.y.z" -Dwrapper.native_library="wrapper" -Dwrapper.cpu.timeout="10" \
                      -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp HelloWorld
jvm 1    | WrapperManager: 初期化中...
jvm 1    | 接続受信ポート番号: 9000

ログ上部にあるバナーは、一時的にトライアルライセンスを利用しているために表示されています。 長時間トライアルライセンスのリクエスト あるいは 後でライセンスを購入するなどをご案内しています。

その「コマンド:」の長い行はデバッグメッセージ出力で、 Wrapperが生成しているJavaコマンドラインを示していて、問題の解決にとても役に立ちます。 一旦、動作の開始を確認したら、ここで、 [wrapper.java.command.loglevel] プロパティをコメントアウト(コメント記号で無効化)してください。 その他の残りの例は、同じようになっていることを確認してください。

ライセンスを購入された場合には、次のように見えるでしょう:

wrapper  | --> Wrapperがコンソールとして開始しました
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |   {licensee}へライセンスを割り当て
wrapper  |
wrapper  | JVM起動中...
jvm 1    | WrapperManager: 初期化中...
jvm 1    | 接続受信ポート番号: 9000

[CTRL]+[C]のキー操作でいつでもアプリケーションを停止することができます。 Wrapperは、「なぜアプリケーションが停止されたのか」常に記録を取りますので、 次のようなログ記録で確認することができます。

wrapper  | [CTRL]+[C]キー操作 をトラップしました。シャットダウンしています。
wrapper  | <-- Wrapper 停止しました

クラッシュシミュレーション

さて、とてもシンプルな例をあげながら、 Wrapperが様々な障害からどのようにリカバリー(回復)するか見てみましょう。 もう一度Wrapperを開始してください。 次に、Windowsタスクマネージャーを開きます。 [CTRL]+[ALT]+[DEL]のキー操作からWindowsタスクマネージャーを開くことができます。

[プロセス]タブを選び、「java.exe」プロセスを確認してください。 それを選択して[プロセスの終了]ボタンをクリックします。 これで、キレイにシャットダウンする機会を持つことなく、 すぐにJavaプロセスを強制終了することができます。

Javaプロセスが落ちた場合、Wrapperログに次のような記録が見えます。 JVMが落ちたことを検知して、数秒以内にそのJVMを再起動していることに注目してください。

wrapper  | JVMが予想外に終了。
wrapper  | JVM起動中...
jvm 1    | WrapperManager: 初期化中...
jvm 1    | 接続受信ポート番号: 9000

ログファイルを見ると、何回JVMが再起動されたか確認することができます。 これはシステム管理者にとって、とても役に立ちます。 単にログファイルを見直すことで、問題が発生したのかを把握することができます。

サービスとしてHelloWorldServerを動かす

Wrapperのコンフィギュレーションが正しく検証されれば、 次はWrapperをサービスとしてインストールできる段階です。

サービスをインストールする

次のように、Wrapperに「-i」コマンドを使うことで、インストールできます。

注意

インストールの際に、システム管理者の権限が必要ですのでご注意ください。 さらに、Windows 7 や Windows 2008で開始する場合には、 システム特権のあるコンソールから動作させる必要があります。

bin\wrapper.exe -i ..\conf\wrapper.conf

サービスが無事にインストールされると、次のような表示が見えるはずです。

wrapper  | Hello World Serverサービスがインストールされました。

サービスを開始する

その他のWindowsサービス同様に、 Windowsサービスコントロールパネル([コントロールパネル]→[管理ツール]→[サービス])で、このサービスを開始することができます。

あるいは、Windowsの「net start」コマンドでも開始可能です:

net start helloworld

Wrapperバイナリを使って開始することも可能です:

bin\wrapper.exe -t ..\conf\wrapper.conf

この場合、次のように見えるでしょう:

wrapper  | Hello World Server サービスを開始中...
wrapper  | Hello World Server が開始されました。

サービスコントロールパネル、タスクマネージャー、あるいは 「WRAPPER_HOME\logs\wrapper.logログファイルを見ると、 サービスが動作していることを確認することができます。

サービスを停止する

サービスを停止する際には、上記と同様にサービスコントロールパネル、タスクマネージャーで操作するか、あるいは、Wrapperを使います:

bin\wrapper.exe -p ..\conf\wrapper.conf

サービスをアンインストールする

Wrapperは現在、システムのリブート時にWrapperが起動するように設定されています。 これはテストであるため、このサービスを取り外すには、以下のようにします:

bin\wrapper.exe -r ..\conf\wrapper.conf

参照: Wrapper でアプリケーションを起動する