2009年11月30日

GlassFishでEJB3

世の中的にはもうEJB3.1に注目しているとこなのでしょうね。
個人的には、実際の案件でEJBを使用したのはまだJavaEEなんてろくに知らない時期に右も左もわからないままベテランさんについて右へ習え状態でいくつか「書いたことがある」程度。それもEJB3よりまえの、なんだかよくわからないものを沢山書かなくてはならないやつでですね。EJB3になってDIやらAOPやらで一つのパラダイムシフトであったのだろうと思うのですが、その辺はあまり実務でも使うことがなくてここまで来てしまいました。
と言うわけで、まずはいくつか手習いをやって感覚をつかんでおきますか、とばかりに簡単にやってみました。

環境はNetbeans6.7.1で、Glassfish2.1でやっています。まずは有りがちな足し算のEJBを用意して、クライアントアプリケーションから呼び出してみる感じにしてみたのですけど、プロジェクトを新規作成して、いろいろウィザードに沿ってやっていけば大体ひな型はできてしまうし、その後もIDEがいろいろサポートをしてくれるので特に躓くところは有りませんでした。

その後、EJB Timerサービスを使うサンプルを書いてみたのですが、これがどうもうまくいきません。Glassfishの起動中のログにはTimerクラスが見つからないといった旨のエラーが出力されているのですが、正直そんなこと言われても…という感じで。
いろいろ調べていると、Timerに関連するクラスを自動生成する過程でExceptionが発生しているのではないかというような記事を見つけました。その過程でテーブルへの依存があり、データソースとして特定のテーブルにアクセスできる必要があるようなのですが、そのあたりを手動でこなして行ったら起動に成功したというような内容でした。変な話です。めんどくさいなーと思いながら管理コンソールを眺めていたら、EJB TimerServiceの設定項目の中にデータソースの設定があることに気づきました。デフォルトでは空になっています。一方でJDBIデータソースを調べるとTimerServiceと名のつくデータソースがあります。これでいいのかさっぱりわかりませんが、このJNDI名をEJB TimerServiceの設定欄に書いてやるとGlassfishの起動時のログにはTimerServiceの起動に成功したような旨のログを出力されるようになりました。

ただ肝心の私が書いたサンプルのほうはまだどうも動いているような雰囲気ではありません。アプリケーションクライアントから実行された10秒後に標準出力にメッセージを出力するような内容なのですが、アプリケーションクライアントが問題なく実行完了しているのに、メッセージは出力されていないようです。ただTimerの標準出力がどこに出るものかよくわかっていないので、特定のFileに出力するように直してまた試してみようと思います。