読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

Embedded GlassFishで困った時にやってたこと

AdventCalendar GlassFish

この記事は「GlassFish Advent Calendar 2013」の19日目の記事となります。

昨日はHASUNUMA Kenjiさん(@btnrouge)による「管理コンソールは本当にJSF 2.xで構築されているのか?」でした。

明日もHASUNUMA Kenjiさん(@btnrouge)です(^^;お疲れ様です。

Embedded GlassFish

Embedded GlassFishとは何ぞや?ということについては、既に@btnrougeさんが4日目の記事で「GlassFish Embedded Serverのご紹介」を書かれていますので、そちらを参照して頂くのが良いと思います。

また、以前に自分が書いた「オフライン機能をEmbedded GlassFishで実現できるか?」の中でも日本語で参考になるサイトを紹介してるので、その辺りも含めて興味ある方は参照頂ければと思います。

思ったように動かないとき

@btnrougeさんが「GlassFish Embedded Serverのご紹介」で書いているように、構成管理がしっかりしていればほとんどエラーになることはないのではないかなと思います。

ただ、自分が最近とある技術調査をしたとき(内容としては、Java EE6で構築したシステムをオフラインで動かすために、warをEmbedded GlassFishでデプロイして動かすようなもの)、細かい所でショボイミスしたり、思ったように動かなくてハマったりしました。そのときに行っていたことを整理してみます。

CommandResultを確認する

Embedded GlassFishでは管理コンソールがみえないので、asadminコマンドを実行するためのCommandRunnerクラスが用意されています。

glassfish.getCommandRunner().run(
    "create-jdbc-connection-pool",
    "--driverclassname=com.microsoft.sqlserver.jdbc.SQLServerDataSource",
    "--datasourceclassname=com.microsoft.sqlserver.jdbc.SQLServerDataSource",
    "--restype=javax.sql.DataSource",
    "--property",
    "portNumber=1433:databaseName=HogeHoge:serverName=XX.XX.XX.XXX",
    "hogehogePool"
);

上記はJDBCのコネクションプールを生成するコマンドを実行したものですが、こんな風に結構長くなったりして、しょぼいスペルミスしたりとかもあったり…(^^;

サンプルではあまり戻り値が気にされてないことが多いのですが、runの戻り値がCommandResultクラスとなっていて

CommandResult result = glassfish.getCommandRunner().run(
    "create-jdbc-connection-pool",
    "--driverclassname=com.microsoft.sqlserver.jdbc.SQLServerDataSource",
    "--datasourceclassname=com.microsoft.sqlserver.jdbc.SQLServerDataSource",
    "--restype=javax.sql.DataSource",
    "--property",
    "portNumber=1433:databaseName=HogeHoge:serverName=XX.XX.XX.XXX",
    "hogehogePool"
);

//結果を標準出力してみる
System.out.println(result.getOutput());
System.out.println(result.getFailureCause());
System.out.println(result.getExitStatus());

上記が成功すると

PlainTextActionReporterSUCCESSJDBC connection pool hogehogePool created successfully.
null
SUCCESS

みたいな出力となります。

最後にコールしたgetExitStatus()の戻り値はExitStatusクラスで

  • CommandResult.ExitStatus.SUCCESS
  • CommandResult.ExitStatus.WARNING
  • CommandResult.ExitStatus.FAILURE

等の値判定で細かく分岐することもできます。

試しに「create-jdbc-connection-pool」のコマンド名を間違えてみます。「create-jdbc-connection-poola」みたいな(^^;l

そうすると

Exception while executing command.
java.lang.NullPointerException
FAILURE

と失敗が明確にわかります。

propertyの指定で誤ったシンタックスを入れたりすると

PlainTextActionReporterFAILUREjava.lang.IllegalArgumentException: Invalid property syntax, missing property value: aDescription: create-jdbc-connection-pool commandInvalid property syntax, missing property value: a
Usage: //長いので省略
java.lang.IllegalArgumentException: Invalid property syntax, missing property value: a
FAILURE

みたいな感じです。

詳細なログを出す

上記の設定でasadmin関連の処理は無事に成功して、Embedded GlassFishが起動できて、最後にデプロイ!すると上手くいかない、なんてケースもありました。

デプロイの実行内容で詳細な内容をみたい場合は、以下のようなログ記述を入れると簡単に確認できます。

Logger.getLogger("").getHandlers()[0].setLevel(Level.SEVERE);
Logger.getLogger("javax.enterprise.system.tools.deployment").setLevel(Level.SEVERE);
Logger.getLogger("javax.enterprise.system").setLevel(Level.SEVERE);

元ネタは以下ですが、Embedded GlassFishのドキュメントにも書いてありました。

Changing Log Levels in Embedded GlassFish

ログをファイルに書き出したい

先の設定で詳細なログが標準出力されますが、相当な量になるのでみえません(^^;
やっぱファイルでみたい、という場合には、動いているJavaのlogging.propertiesを一時的に変えるのが手っ取り早かったり。
(インストールされたJREJDKの\lib\logging.properties)

handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler

最後にハマったパターン

自分が試したシステムでは、最後の最後に「アプリケーションは起動時に正しく初期化されず、ファクトリが見つかりませんでした: javax.faces.context.FacesContextFactory」というエラーが出て、何が悪いのかわからずハマってました。

以下のStackOverflowの返信の中にEmbedded GlassFishで同じIssueを持っている人がいました。

Exception: could not find Factory: javax.faces.context.FacesContextFactory

上記からリンクもされてますが、以下参考情報。

Using JSF 1.2 with Facelets on Google App Engine for Java

とりあえずweb.xml

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

を入れることで動くようになったのですが、イマイチすっきりしない感じも。

でも、とりあえず、Embedded GlassFishApache Derbyを組み合わせることで、一度クライアント・サーバ構成で作ったJava EE6のWebアプリケーションをオフラインでも簡単に使える状態が作れました(^^)

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村