GlassFish v2.1.1 と GlassFish v3.0.1 の機能比較

GlassFish v2.1とGlassFish v3.0.1の機能比較(英語版)がこちらに記載されていますが、日本語で情報共有したいと思います。

GlassFish v 2.1.1 と v3.0.1 は共に本番環境で今すぐ利用可能なアプリケーションサーバです。またサポートが必要な場合、Oracle から正式サポートを受ける事ができます。
どちらの製品を選択するかは製品が持つ機能/仕様を元に検討して頂きたいのですが、仮に高可用性の機能が必要な場合は、Java EE 5 の仕様に完全準拠した GlassFish v2.1.1を選択してください。また Java EE 6 で開発を行いたい場合、たとえば、Web アプリケーションのかんたん開発(JSF2,Servlet3.0)、EJB 3.1、Webサービス(RESTful/Jersey)、jRuby, Grails, Jython 等のスクリプト言語を使用したい場合は、GlassFish v3.0.1 を選択して頂ければと思います。

また、GlassFish v3.0.1 はパブリッククラウド環境にも今すぐ適用可能で、実際にこれを使用して Amazon EC2 上でサービスを提供開始している企業もあります。下記をご参照ください。
GlassFish v3.0.1 と MySQL を利用し Amazon EC2 上でサービスを提供する事例(海外)

最後に、今年末に提供予定の GlassFish v3.1 では GlassFish v2.1.1 のように高可用性機能も提供される予定ですので、是非楽しみにしていてください。

機能比較 GlassFish
v 2.1.x
GlassFish
v 3.0.x
リリースされた日程 v 2.1.1 の リリースは 2009 年 10 月 v 3.0.1 のリリースは 2010 年 6 月
Oracleによる有償サポートの有無 有(●) 有(●)
マルチプラットフォームのサポート

例:OS
: Solaris, Oracle Enterprise Linux, RedHat Enterprise Linux, SLES,
Ubunts, Windows, MaxOS X, HP-UX, AIX, Oracle VM, Solaris Container

JVM : JRockit, HotSpot VM

v2.1.1で正式サポートされている環境のリストはこちら
supported
platforms
v3.0.xで正式サポートされている環境のリストはこちら

supported
platforms
サポートするJava EE のバージョン
Java EE 仕様への対応 Java EE 5 に準拠 Java EE 6に準拠
(Java EE 5 アプリケーションも動作可能
Web Application and Service Technologies
Java
Web Technologies
Servlet 2.5
JSP 2.1, JSF 1.2
Servlet 3.0
JSP 2.2, JSF 2.0
Metro
Web Services Stack
.NET 3.0
Web サービスとの相互運用
.NET 3.5
Web サービスとの相互運用
Jersey / JAX-RS (RESTful Web Services) JAX-RS 1.0 JAX-RS 1.1
管理関連
GUIの管理コンソールとCLIツールの提供 有(●) 有(●)
JMXによる管理 有(●) 有(●)
ノードエージェントとクラスタ管理機能 有(●) 無(X)
アップグレードツール
(更新ツール/updatecenter)
有 (●) 有(●)
RESTful 管理APIの提供 無(X) 有(●)
Java EE 6 Web Profile 版の提供 無(X) 有(●)
拡張モニタリング機能
(btrace, dtraceのサポート)
無(X) 有(●)
アプリケーションクライアント
アプリケーションクライアントコンテナの提供 有(●) 有(●)
Java WebStartのサポート 有(●) 有(●)
Enterprise Application Technologies
Java DB, JDBC Connection Pooling Java DB 10.4.2.1 Java DB 10.5.3.0
JTA 1.1/JTS 1.0 有(●) 有(●)
J2EE Connector Architecture Connectors
1.5
Connectors
1.6
Enterprise JavaBeans (EJB) EJB
3.0
EJB
3.1
JMS 1.1 有(●) 有(●)
Java Pertistence API (JPA) JPA 1.0
(TopLink)
JPA 2.0
(EclipseLink)
スクリプト言語対応
jRuby on Rails のWebアーカイブ(.war)の配備が可能 有(●) 有(●)
ネィティブ jRuby on Rails アプリケーションの配備
(Servlet コンテナ上の動作は不要)
無(X) 有(●)
jRuby のランタイムスレッドプールの動的リサイズ 無(X) 有(●)
Groovy/Grails のサポート 無(X) 有(●) [4]
Jython/Djangoの動作

(現在は v3.01で動作は可能だがOracleによるサポートは未サポート、将来正式サポート予定)

無(X) 有(●) [4]
開発ツール
NetBeans IDE 有(●)[6] 有(●)[6]
Eclipse IDE 有(●) 有(●)
高速再配備−アプリケーション再配備時のセッション情報の保持 無(X) 有(●)
アップデートセンター(更新ツール) 有(●) 有(●)
アップデートセンターの管理コンソールへの統合 無(X) 有(●)
Java EEアプリケーションの検証ツール

Appilcation Verification Kit (AVK)

有(●) 無(X)
IPSパッケージツール対応 無(X) 有(●)
Framework Technologies
Grizzly (Java NIO)の対応バージョン 1.0.34 1.9.18
Comet (HTTP Push)のサポート 有(●) 有(●)
CORBAのサポート 有(●) 有(●)
OSGiベースのモジュールアーキテクチャ 無(X) 有(●)
組み込み可能な GlassFish/EJB
コンテナのサポート
無(X) 有(●)
管理機能(GUI/CLI)の拡張性 無(X) 有(●)
システム/パフォーマンス
クラスタリング機能 有(●) 有(●)
mod_jk で可能
ロードバランサプラグインの提供 有(●) 無(X)
管理コンソールからのロードバランサプラグイン設定 有(●) 無(X)
高可用性 有(●) 無(X)
他技術の統合/連携
アィデンティティ管理製品、シングルサインオン製品(OpenSSO)、SOA製品(OpenESB)との連携/統合 有(●) 無(X)

2010年6月24日 at 2:41 午後

GlassFish v3.1 の各種仕様公開

次期バージョンである GlassFish v3.1 の開発仕様が公開されました。GlassFish v3.1 の各種機能に関するご意見、ご要望等がある場合は
レビューテンプレート
に従ってお寄せください。

※ 過去、日本人利用者からも仕様変更要求を頂いたことがありますので、どなたでも気軽にご意見を頂ければと思います。

GlassFish v3.1 に含まれる全ての機能仕様書はこちらから参照できます。
また、本日の時点で GlassFish v3.1 の マイルストーン1 がリリースされており、
入手可能です。

GlassFish v3.1 は 2010年12月のリリースに向けてこれから本格的に開発が進んでまいります。より良い製品にするため皆様からの基調なフィードバックをたくさん頂ければと思います。

2010年6月2日 at 11:39 午前

Oracle Software Hardware Complete

今日から Oracle の社員として新たに出発します。Oracle の社員の皆様これからどうぞ宜しくお願いします。またいつもブログを見て下さっている皆様今後ともどうぞ宜しくお願いします。

ちなみに、初日の今日は、新しい社員証をもらったり、健康保険証を交換したり事務的な手続きや、マシンのセットアップ等をしていてほぼ一日が終わりました。またこれから立て続きにミーティングがセットされているので暫くばたばたしそうですが、相乗効果が発揮できるように勤めてまいりたいと思っています。

さて、話は変わるのですが、
Oracle では今 映画「IRONMAN 2」とタイアップし、「サンのストレージとサーバー技術が加わったことで、オラクルのソリューションが完璧になった」というメッセージを発信しています。下記の画像は壁紙として入手できる画像の縮小版です。またリンクより TV コマーシャルの内容も見る事ができるようになっています。是非一度新生オラクルが発信するメッセージをご覧ください。

「Iron Man 2. Oracle. Software. Hardware. Complete.」の詳細はこちら

2010年6月1日 at 7:33 午後

さよなら Sun


先ほど、日本Sunの会社概要を確認したのですが、日本 Sun が設立されたのは、1986年3月5日なんですね。私がまだ中学生の頃だったようです。そして今日を持って日本 Sun の活動は終了し、明日、日本 Sun と 日本 Oracle との統合が完了します。

私が初めて Sun 製品に接したのは大学時代に研究室においてあった、SS 5/20 あたりだったと思います。また、ある日友人が「よっしー、すごいのがあるので見てくれ」と言われ見たのが、HotJava Browser 上で踊る Duke でした。


(当時のロゴ)

当時 Perl で CGI のプログラム書きに没頭していた私は、すげー画面が音を出しながら動いているといって驚いたのをとても良く覚えています。そして Java についてもっと知りたい、学びたいと思うようになりマスターへの進学を考えたのもこの頃でした。その後、マスターの研究で Java のテスト技術について研究を行い、前職でもJava に関するプロジェクトに多く携わってきました。

こうして Sun という会社に憧れを持った私は、いつか Sun で Java に関わる仕事をするんだと考えていたのですが、そのチャンスがめぐって来たのが 2001年8月 でした、それから約9年この会社で色々な経験をさせてもらいましたが、今の状況になったとしても、Sun の入社は間違っていなかったと思っています。もちろん、会社が統合される事は残念ですが、Sun で出会った数多くの優秀な仲間との出会いは私に取ってかけがえのない財産で、私の一生の宝になると信じています。また社外でも、多くの技術者からここまで愛された会社も少ないのではないかと思います、このような会社で働けた事を心から誇りに思っています。

ありがとう Sun 。

2010年5月31日 at 6:15 午後 5件のコメント

「GlassFish v3 で実感!! エンタープライズ Java の進化」資料公開

Java Hot Topic セミナーのプレゼン資料とデモを公開します。

今回の発表のポイントは、Java EE 6 になり開発が如何に楽になったか、アプリケーションサーバのインストールも起動も如何にかんたんで高速になったのかという点に集中して説明を致しました。原稿は合計 120ページ程ありますが、全てを発表したわけではなく、抜粋して説明しました。特に JPA 2.0 については日本でまだあまり資料がないので参考にして頂けるのではないかと思います。


「GlassFish v3 で実感!! エンタープライズ Java の進化」プレゼン資料 (PDFの入手)

Java EE 6 のかんたん開発デモビデオの入手

GlassFish v3 のかんたんインストールデモビデオの入手

2010年5月30日 at 8:33 午後

Java Hot Topic セミナー終了

昨日(5/29)、Java ホットトピックセミナーを開催しました。



今回は土曜日の開催にも関わらず多くの皆様にご参加頂きまして
誠にありがとうございました。またアナウンスをしてたった1日で定員に達してしまったため、参加できなかった方には大変申し訳ございませんでした。

このイベントは 5/17 に(大渕さん、片貝さん、私の3人)企画を始めたのですが、企画当初は本当に開催ができるのか全く予断を許さない状況でした。当初 5/31(月) に開催しようとしていたのですが、会場の確保ができず、それ以外の日程も検討したのですが、各人のスケジュールがあわず駄目で一時は開催断念まで考えていました。しかし思い切って土曜日にしよう、それなら開催できるという事が判明し週末になりました。週末開催のため、どの位の方に参加して頂けるか不安な部分もありましたが、申し込み開始当初の登録状況を確認し不安は払拭致しました。開催まで1週間を切った中での緊急開催の告知となり申し訳ございませんでした。またこのような状況の中ご登録・ご参加頂いた Sun/Java ファンの皆様、本当にありがとうございました。

最後に、日々状況が変わる中で特に櫻庭さんには大変ご迷惑をお掛けしました。とてもお忙しい中、発表に関して快諾して頂いた他、開催実現に向け最初から最後までとても手厚いサポートを頂きました。本当にありがとうございました。
また、他のエバンジェリスト(町田さん、戸島さん、相澤さん、畠中さん)の皆様にも会場の準備から受付等お手伝い頂き本当にありがとうございました。今回開催できたのはサポート頂いた全ての方々のサポートのおかげで実現できました。Sun の Java エバンジェリストグループの一員として活動ができ本当に良かったです。ありがとうございました。

PS.
1週間で Sun のノベルティを色々な所からかき集めて来たのですが皆様ちゃんとグッズゲットできました?あれだけあれば1人1つは入手できたのではないかと思うのですが。
(狭い場所で提供する事になり申し訳ありませんでした。)

懇親会にも多くの皆様にご参加頂きました!!ありがとうございました。


(画像を押下すると拡大できます。)

2010年5月30日 at 8:07 午後 1件のコメント

Java Hot Topic セミナー緊急開催決定

今日は Java の勉強会開催に関する緊急告知をいたします。

本セミナーの受付は大変好評につき締め切りました。
ご登録頂いた皆様、誠にありがとうございました。

キャンセル待ちの手順:


件名を「ホットトピックセミナー キャンセル待ち」として本文に
「お名前」「ご所属」をご記入の上、以下までご連絡ください。
Mail: hottopics-seminar-japan@sun.com
※ キャンセル待ちの受付については確認メールはお送りしません。
※ 空きが出ましたら、個別にメールをお送りします。キャンセル状況
のお問い合わせには対応できませんのでご注意ください。


来る 2010 年 5 月 29 日 (今週土曜日) に Java の Hot Topic セミナーを緊急開催する事にしました。今回の Java Hot Topic セミナーはご参加頂いた皆様に、もれなく何らかの Sun ノベルティグッズをプレゼントする予定です。
(例:GlassFish Tシャツ、Java リング、Duke マウス、Sun ノート、Sun 時計等先ほどまで色々と大量に見つけ出してきましたので、かならず何かお渡しできると思います。)
今週末の開催という事で直前のご案内となり誠に申しわけございませんが、どうぞスケジュールをご調整の上ご参加頂ければ幸いです。

発表内容の詳細は後ほど決まり次第ご連絡いたします。


開催概要■ 3時間で学ぶ Java Hot Topic 2010
■ 日程2010 年 5 月 29 日 (土)
13:00 開場、13:30 セミナー開始、16:30 頃終了予定
発表内容
1. クロージャあらため、Project Lambda
Java in the Box 主筆
櫻庭 祐一 氏
2.Scala 入門 (仮)
町田 修一 氏
3.GlassFish v3 で実感!!エンタープライズ Java の進化
GlassFish エバンジェリスト
寺田 佳央
4. NetBeans 最新情報
Java エバンジェリスト
片貝 正紀
■ 会場サン・マイクロシステムズ株式会社 用賀本社27階セミナールーム田園都市線用賀駅改札を出てすぐ右側がSBS ビルの入り口です。ビルと駅は地下でつながっています。エレベーターにて27階まで直接お越しください。
■ 費用無料(事前登録制)

■ 主催
サン・マイクロシステムズ株式会社
■ お申込み 
件名を「ホットトピックセミナー参加」として本文に「お名前」「ご所属」をご記入の上、以下までお申し込み下さい。Mail: hottopics-seminar-japan@sun.com


今回はできるだけ多くの方に参加していただきたいと考えておりますが、会場規模の都合上、定員になり次第締め切らせていただきます。
一度申し込みをした後仮に、スケジュールの都合上どうしても参加ができなくなった場合、他の方を繰り上げ当選にしたいと考えておりますので、大変恐れ入りますが欠席される際は上記アドレスまで欠席のご連絡を頂けないでしょうか。

最後に余談ではありますが、私にとって「 Sun 」のエンジニアとして最後の発表になるかと思います(会社を辞めるわけではありませんが)。Sun の Java エバンジェリストとして活動して来た数年間を思い出すと色々感慨深いものがありますが、今回は Sun/Java/GlassFish を応援してくださった皆様へ感謝とお礼を込めて開催したいと考えております。

ちなみに、日本では Oracle と正式統合が完了していない為、私の口から今後の Oracle 製品と既存 Sun 製品に関する話題については申し上げる事ができませんので、どうぞご了承ください。

2010年5月24日 at 3:41 午後

Oracle Welcome Event の資料公開

先日開催された Oracle Welcome Event の資料が公開されたようです。
(こちらから入手)
Oracle のサイトにログイン後、各資料を入手してください。

2010年4月27日 at 2:37 午後

EJB 3.1 の組み込み可能コンテナ

前回のエントリで、EJB 3.1 の新機能概要を紹介しました。今回は EJB 3.1 の新機能の一つである組み込みコンテナを使用し、EJB の単体テストをかんたんに行う方法を紹介します。

ここでは NetBeans 6.8 と GlassFish v3 を利用して説明しますが、NetBeans 6.8 で「 EJB モジュール」のプロジェクトを作成するとデフォルトで GlassFish v3 の組み込みコンテナが利用できるようになっています。ですので、特に面倒な設定は必要なく JUnit のテストコードの記述に集中できるようになっています。今までは EJB の単体テストを行うためにデプロイして Global JNDI 名を利用してテストを行ったりしていたかと思いますが、この方法を利用すると直接アプリケーションサーバにデプロイしなくてもすむため非常に便利です。

それでは実際に EJB 3.1 の組み込みコンテナを利用してみましょう。
NetBeans 6.8 を使用して「EJB モジュール」の新規プロジェクトを作成します。メニューより「新規プロジェクト」を選択してください。すると下記のウィンドウが表示されます。ここで、「Java EE」→「EJB モジュール」を選択し「次へ>」ボタンを押下します。

次に、プロジェクト名、プロジェクトの場所、プロジェクトフォルダ等の項目を入力し「次へ>」ボタンを押下します。

次に、この EJB モジュールを配備するアプリケーションサーバの選択(GlassFish v3)、Java EE のバージョン(Java EE 6)を選択し「完了(F)」ボタンを押下します。

「完了(F)」ボタンを押下すると、NetBeans のプロジェクトに下記のようなプロジェクトが作成されます。ここでプロジェクトのツリーを展開すると「ソースパッケージ」、「テストパッケージ」、「ライブラリ」、「テストライブラリ」等が表示されます。この中で「テストライブラリ」のツリーに注目してください。「GlassFish v3 (埋め込み可能コンテナ)」→「glassfish-embedded-static-shell.jar」というファイルが組み込まれている事を確認できます。このライブラリはとても重要で、これを利用しEJB の組み込みコンテナを利用できるようになります。

それでは、実際に EJB コンポーネントを作成してみましょう。今回はかんたんなサンプルとして、ステートレス Session Bean を1つ作成します。

実装コードは下記を記載します。

EJB コンポーネントを作成しましたので、次に JUnit のテストコードを記載します。NetBeans のメニューより、「新規」→「JUnit テスト …」を選択してください。メニュー中に表示されない場合は、「その他…」を選択した後「JUnit テスト …」を選択してください。

JUnit のテスト用コードを記述するクラス名、パッケージ等を定義します。

次に、JUnit のバージョンを選択し、「選択(S)」ボタンを押下します。

クラスの雛形が自動生成されますので、テスト用のメソッドを実装します。

記載するコードを下記に記載します。

@Test
    public void testSayHello() {
        Map p = new HashMap();
        p.put("<strong>org.glassfish.ejb.embedded.glassfish.instance.root</strong>",
                "<strong>/Applications/GlassFish/glassfishv3-webprofile/glassfish/domains/domain1</strong>");
        <span style="color:blue;"><strong>EJBContainer container = EJBContainer.createEJBContainer(p);</strong></span>
        try{
            Hello hello = (Hello)<strong>container.getContext().lookup("java:global/classes/Hello");</strong>
            System.out.println(hello.sayHello());
        }catch(Exception e){
           e.printStackTrace();
        }
       container.close();
   }

このコード中で重要なポイントは、EJBContainer.createEJBContainer()を呼び出す所です。EJBContainer クラスは、組み込み可能な EJB コンテナ上で EJB コンポーネントを実行するためのクラスです。スタティックメソッドの createEJBContainer() を実行すると組み込み可能 EJB コンテナのインスタンスの作成と初期化を行います。引数 Map 中で設定プロパティを記載する事ができます。
今回、GlassFish の組み込み可能コンテナを利用しますので、org.glassfish.ejb.embedded.glassfish.instance.root に GlassFish のインスタンスのルート(通常 DAS のドメインの場所)を指定して初期化と起動を行います。EJB コンテナの初期化が完了した後、JNDI のルックアップで EJB コンポーネントを取得し適宜評価プログラムを記載することができるようになります。

テスト用のコードを記載した後、テストを実行してみましょう。プロジェクトのメニューより「テスト」を選択実行してください。

テストを実行すると下記のようなテスト結果が得られます。

さて、上記でかんたんなテストは完了しましたが、もう一つ JPA-EJB を使った DB連携の EJBコンポーネントを作成しテストをしてみましょう。まず、メニューより「新規」→「データベースからのエンティティクラス…」を選択して Entity Bean を作成しましょう。

データソース(jdbc/sample)を選択し、「使用可能な表(T)」から DB 上に存在するテーブルを選択し、追加します。ここでは自分で作成した Person テービルを利用しています。

次に、ワーニングが表示されている箇所に注目してください。現在のプロジェクトには持続性ユニットが存在しないため作成してくださいとメッセージが表示されています。そこで「持続性ユニットを作成…」ボタンを押下して作成します。

「持続性ユニット名」、「持続性プロバイダ」、「データソース」を選択し「作成」ボタンを押下します。

持続性ユニットを作成すると、ワーニングが消えますので「次へ>」ボタンを押下します。

最後に、データベースのテーブルと Entity Bean のマッピングに関する設定を行い「完了(F)」ボタンを押下します。

上記で、DB のPERSON テーブルから、ファイル名 Person.java の Entity Bean が自動生成されます。自動生成されるコードは下記のようなコードです。

package test;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "PERSON")
@NamedQueries({
    @NamedQuery(name = "Person.findAll", query = "SELECT p FROM Person p"),
    @NamedQuery(name = "Person.findById", query = "SELECT p FROM Person p WHERE p.id = :id"),
    @NamedQuery(name = "Person.findByName", query = "SELECT p FROM Person p WHERE p.name = :name"),
    @NamedQuery(name = "Person.findByAge", query = "SELECT p FROM Person p WHERE p.age = :age"),
    @NamedQuery(name = "Person.findByAddress1", query = "SELECT p FROM Person p WHERE p.address1 = :address1"),
    @NamedQuery(name = "Person.findByTelephone", query = "SELECT p FROM Person p WHERE p.telephone = :telephone")})
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @Basic(optional = false)
    @Column(name = "NAME")
    private String name;
    @Basic(optional = false)
   @Column(name = "AGE")
    private long age;
    @Basic(optional = false)
    @Column(name = "ADDRESS1")
    private String address1;
    @Basic(optional = false)
    @Column(name = "TELEPHONE")
    private String telephone;
    public Person() {
    }
    public Person(Long id) {
        this.id = id;
    }

    public Person(Long id, String name, long age, String address1, String telephone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address1 = address1;
        this.telephone = telephone;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
     }

    public long getAge() {
       return age;
    }

    public void setAge(long age) {
        this.age = age;
    }

    public String getAddress1() {
        return address1;
    }

    public void setAddress1(String address1) {
        this.address1 = address1;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

     @Override
     public boolean equals(Object object) {
         // TODO: Warning - this method won't work in the case the id fields are not set
         if (!(object instanceof Person)) {
             return false;
         }
         Person other = (Person) object;
         if ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {
             return false;
         }
         return true;
     }

     @Override
     public String toString() {
         return "test.Person[id=" + id + "]";
     }

}

Entity Bean を作成しましたのでこの Entity Bean を扱う Session Bean を作成します。メニューより「セッション Bean…」を 選択してください。

今回はステートレス Session Bean である PersonController を作成します。「EJB 名(N)」、「プロジェクト名」、「場所」、「パッケージ」、「セッションのタイプ」、「インタフェースを作成」それぞれを入力/選択し「完了(F)」ボタンを押下します。

PersonController には下記のコードを記載してください。

package test;
import javax.ejb.Stateless;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class PersonController {

     @PersistenceContext(unitName="EmbeddedEJBPU")
     private EntityManager em;
     public List&lt;Person&gt; findAllPersons(){
         //Entity(Person)クラスの @NamedQuery の記載に基づき検索
         Query query = em.createNamedQuery("Person.findAll");
         return (List&lt;Person&gt;) query.getResultList();
     }
     public Person createPerson(Person person){
         em.persist(person);
         return person;
     }
}

Session Bean を作成しましたので、最後に JUnit 用のテストコードを記述してみましょう。先ほどと同様に EJBContainer.creaateEJBContainer() を呼び出し、PersonContoroller のオブジェクトを取得した後、PersonController オブジェクト内のメソッドを呼び出してみましょう。

ここで、実装するコードは下記のようになります。

@Test
public void testGetPersonCount() {
       Map p = new HashMap();
       p.put("org.glassfish.ejb.embedded.glassfish.instance.root",
               "/Applications/GlassFish/glassfishv3-webprofile/glassfish/domains/domain1");
       EJBContainer container = EJBContainer.createEJBContainer(p);
       try{
           PersonController pController = (PersonController)container.getContext().
                   lookup("java:global/classes/PersonController");
            List persons = pController.findAllPersons();
           Iterator iterator = persons.iterator();
            while (iterator.hasNext()) {
                Person person = (Person)iterator.next();
                System.out.println("Person name: " + person.getName());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

テストコードを記載した後、「テスト」を実行してください。

先ほどと同様、DB アクセス後、テーブルを参照し情報を取得する事も問題なくできました。後は個々のアプリケーションに応じて詳細なテストコードを記載して頂くことができます。

以上のように EJB 3.1 で提供された組み込みコンテナ機能を使うと EJB コンポーネントに対する単体テストがとてもかんたんになります。今後はこの組み込みコンテナの機能を使い EJB のテストを楽に行ってください。

※補足:
実行した際に吐き出されるコンソールのメッセージを下記に表示します。

2010/04/08 17:01:13 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates
情報: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate
2010/04/08 17:01:13 com.sun.common.util.logging.LoggingConfigImpl openPropFile
情報: Cannot read logging.properties file.
2010/04/08 17:01:13 com.sun.enterprise.web.WebContainer configureHost
致命的: WEB0355: network-listener [http-listener-2] referenced by virtual server [server] does not exist
2010/04/08 17:01:13 com.sun.enterprise.web.WebContainer configureHost
致命的: WEB0355: network-listener [http-listener-1] referenced by virtual server [server] does not exist
2010/04/08 17:01:13 com.sun.enterprise.web.WebContainer createHosts
情報: Created virtual server server
2010/04/08 17:01:13 com.sun.enterprise.web.WebContainer configureHost
致命的: WEB0355: network-listener [admin-listener] referenced by virtual server [__asadmin] does not exist
2010/04/08 17:01:13 com.sun.enterprise.web.WebContainer createHosts
情報: Created virtual server __asadmin
2010/04/08 17:01:14 com.sun.enterprise.web.WebContainer loadSystemDefaultWebModules
情報: Virtual server server loaded system default web module
2010/04/08 17:01:17 com.sun.enterprise.v3.services.impl.WebContainerStarter startWebContainer
情報: Done with starting web container
2010/04/08 17:01:17 com.sun.enterprise.v3.server.AppServerStartup run
情報: GlassFish v3 (74.2) startup time : Embedded(1291ms) startup services(4389ms) total(5680ms)
2010/04/08 17:01:17 org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run
情報: JMXStartupService: JMXConnector system is disabled, skipping.
2010/04/08 17:01:17 AppServerStartup run
情報: [Thread[GlassFish Kernel Main Thread,5,main]] started
2010/04/08 17:01:19 com.sun.enterprise.security.SecurityLifecycle &lt;init&gt;
情報: security.secmgroff
2010/04/08 17:01:19 com.sun.enterprise.security.ssl.SSLUtils checkCertificateDates
致命的: java_security.expired_certificate
2010/04/08 17:01:19 com.sun.enterprise.security.SecurityLifecycle onInitialization
情報: Security startup service called
2010/04/08 17:01:19 com.sun.enterprise.security.PolicyLoader loadPolicy
情報: policy.loading
2010/04/08 17:01:19 com.sun.enterprise.security.auth.realm.Realm doInstantiate
情報: Realm admin-realm of classtype com.sun.enterprise.security.auth.realm.file.FileRealm successfully created.
2010/04/08 17:01:19 com.sun.enterprise.security.auth.realm.Realm doInstantiate
情報: Realm file of classtype com.sun.enterprise.security.auth.realm.file.FileRealm successfully created.
2010/04/08 17:01:19 com.sun.enterprise.security.auth.realm.Realm doInstantiate
情報: Realm certificate of classtype com.sun.enterprise.security.auth.realm.certificate.CertificateRealm successfully created.
2010/04/08 17:01:19 com.sun.enterprise.security.SecurityLifecycle onInitialization
情報: Security service(s) started successfully….
2010/04/08 17:01:20 org.hibernate.validator.util.Version &lt;clinit&gt;
情報: Hibernate Validator bean-validator-3.0-JBoss-4.0.2
2010/04/08 17:01:20 org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
情報: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
2010/04/08 17:01:21 com.sun.ejb.containers.BaseContainer initializeHome
情報: Portable JNDI names for EJB PersonController : [java:global/classes/PersonController, java:global/classes/PersonController!test.PersonController]
2010/04/08 17:01:21 com.sun.ejb.containers.BaseContainer initializeHome
情報: Portable JNDI names for EJB Hello : [java:global/classes/Hello, java:global/classes/Hello!test.Hello]
2010/04/08 17:01:21 org.jboss.weld.bootstrap.WeldBootstrap &lt;clinit&gt;
情報: WELD-000900 1.0.0 (SP4)
2010/04/08 17:01:21 org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
情報: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
nullID: /Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/ CLASSES: [class test.exceptions.IllegalOrphanException, class test.exceptions.NonexistentEntityException, class test.exceptions.PreexistingEntityException, class test.exceptions.RollbackFailureException, class test.Hello, class test.Person, class test.PersonController]

Hello Embedded TEST
2010/04/08 17:01:22 com.sun.enterprise.connectors.service.ResourceAdapterAdminServiceImpl sendStopToResourceAdapter
情報: ra.stop-successful
2010/04/08 17:01:22 org.glassfish.admin.mbeanserver.JMXStartupService shutdown
情報: JMXStartupService and JMXConnectors have been shut down.
2010/04/08 17:01:22 com.sun.enterprise.v3.server.AppServerStartup stop
情報: Shutdown procedure finished
2010/04/08 17:01:22 AppServerStartup run
情報: [Thread[GlassFish Kernel Main Thread,5,main]] exiting
2010/04/08 17:01:23 com.sun.enterprise.module.impl.HK2Factory initialize
警告: Singleton already initialized as com.sun.enterprise.module.impl.HK2Factory@66e1f8f
2010/04/08 17:01:23 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates
情報: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate
2010/04/08 17:01:23 com.sun.common.util.logging.LoggingConfigImpl openPropFile
情報: Cannot read logging.properties file.
2010/04/08 17:01:23 com.sun.enterprise.web.WebContainer configureHost
致命的: WEB0355: network-listener [http-listener-2] referenced by virtual server [server] does not exist
2010/04/08 17:01:23 com.sun.enterprise.web.WebContainer configureHost
致命的: WEB0355: network-listener [http-listener-1] referenced by virtual server [server] does not exist
2010/04/08 17:01:23 com.sun.enterprise.web.WebContainer createHosts
情報: Created virtual server server
2010/04/08 17:01:23 com.sun.enterprise.web.WebContainer configureHost
致命的: WEB0355: network-listener [admin-listener] referenced by virtual server [__asadmin] does not exist
2010/04/08 17:01:23 com.sun.enterprise.web.WebContainer createHosts
情報: Created virtual server __asadmin
2010/04/08 17:01:23 com.sun.enterprise.web.WebContainer loadSystemDefaultWebModules
情報: Virtual server server loaded system default web module
2010/04/08 17:01:23 com.sun.enterprise.v3.services.impl.WebContainerStarter startWebContainer
情報: Done with starting web container
2010/04/08 17:01:23 com.sun.enterprise.v3.server.AppServerStartup run
情報: GlassFish v3 (74.2) startup time : Embedded(747ms) startup services(315ms) total(1062ms)
2010/04/08 17:01:23 org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run
情報: JMXStartupService: JMXConnector system is disabled, skipping.
2010/04/08 17:01:23 AppServerStartup run
情報: [Thread[GlassFish Kernel Main Thread,5,main]] started
2010/04/08 17:01:24 com.sun.enterprise.security.SecurityLifecycle &lt;init&gt;
情報: security.secmgroff
2010/04/08 17:01:24 com.sun.enterprise.security.ssl.SSLUtils checkCertificateDates
致命的: java_security.expired_certificate
2010/04/08 17:01:24 com.sun.enterprise.security.SecurityLifecycle onInitialization
情報: Security startup service called
2010/04/08 17:01:24 com.sun.enterprise.security.SecurityLifecycle onInitialization
情報: Security service(s) started successfully….
2010/04/08 17:01:25 com.sun.ejb.containers.BaseContainer initializeHome
情報: Portable JNDI names for EJB PersonController : [java:global/classes/PersonController, java:global/classes/PersonController!test.PersonController]
2010/04/08 17:01:25 com.sun.ejb.containers.BaseContainer initializeHome
情報: Portable JNDI names for EJB Hello : [java:global/classes/Hello, java:global/classes/Hello!test.Hello]
2010/04/08 17:01:25 org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
情報: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
nullID: /Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/ CLASSES: [class test.exceptions.IllegalOrphanException, class test.exceptions.NonexistentEntityException, class test.exceptions.PreexistingEntityException, class test.exceptions.RollbackFailureException, class test.Hello, class test.Person, class test.PersonController]

2010/04/08 17:01:25 org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
情報: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
2010/04/08 17:01:25 org.eclipse.persistence.session.file:/Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/_EmbeddedableTestPU
情報: EclipseLink, version: Eclipse Persistence Services – 2.0.0.v20091127-r5931
2010/04/08 17:01:27 org.eclipse.persistence.session.file:/Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/_EmbeddedableTestPU
情報: file:/Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/_EmbeddedableTestPU login successful
Person name: 山田 太郎
Person name: 山田 花子
Person name: 坂本 龍馬
Person name: 徳川 家康
Person name: 織田 信長
Person name: 豊臣 秀吉
Person name: 聖徳太子

2010/04/08 17:01:28 org.eclipse.persistence.session.file:/Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/_EmbeddedableTestPU
情報: file:/Users/yt133043/NetBeansProjects/EmbeddedableTest/build/classes/_EmbeddedableTestPU logout successful
2010/04/08 17:01:28 com.sun.enterprise.connectors.service.ResourceAdapterAdminServiceImpl sendStopToResourceAdapter
情報: ra.stop-successful
2010/04/08 17:01:28 org.glassfish.admin.mbeanserver.JMXStartupService shutdown
情報: JMXStartupService and JMXConnectors have been shut down.
2010/04/08 17:01:28 com.sun.enterprise.v3.server.AppServerStartup stop
情報: Shutdown procedure finished
2010/04/08 17:01:28 AppServerStartup run
情報: [Thread[GlassFish Kernel Main Thread,5,main]] exiting

2010年4月8日 at 5:20 午後

EJB 3.1 の新機能概要

EJB 3.1 の新機能をプレゼン形式でまとめてみました。
かんたんに概要を紹介します。

EJB 3.0 から EJB 3.1 になり、かんたん開発に向けて多くの改善が施されています。まず、パッケージの簡略化が挙げられます。今までアプリケーションの種類に応じて .ear, .war 等のアーカイブにまとめる必要がありましたが、EJB コンポーネントも .war に含めることができるようになったため開発時の手間が大幅に削減されます。また、EJB 3.1 Lite が提供されフル Java EE の機能の一部の機能だけを利用できるようになったため、フル Java EE の機能が必要ないお客様にとっては不要なメモリリソースを消費せずに運用できる等のメリットがあります。

次のポイントはローカルビジネスインタフェースの実装が必要なくなった点です。これは開発者の生産性が向上するだけではなく、修正の手間も大幅に削減してくれます。例えば、過去に実装したクラスにおいて、特定のメソッドに対する引数や返り値の変更が必要になった場合を想定してください。今まではインタフェースのメソッド定義と実装クラスのメソッド定義を両方変更しなければなりませんでしたが、インタフェースの定義が必要がなくなったため、実装クラスのメソッド定義を変更するだけでよくなります。

次に、移植可能な Global JNDI 名では、今までベンダー独自に実装していた Global の JNDI 名が仕様の中で標準化されましたので、今後アプリケーションを他のアプリケーションサーバへ移行したいような場合、Global JNDI 名を変更する必要がなくなり移植性が高まります。

また、Java SE に組み込み可能な EJB コンテナ は開発時におけるテストの手間を大幅に削減してくれるようになります。今までは EJB のアプリケーションをテストする際、アプリケーションサーバにデプロイして Global 経由でアクセスする等の必要がありました。これは別の Java VM のプロセスとして稼働するためデバッグ等も困難でしたが、EJB 3.1 では Java SE のプロセス内に EJB コンテナをロードして実行する事ができるようになるため、同一 Java プロセス内で処理ができる他、EJB の単体テスト等がしやすくなります。

その他の追加機能として、Singleton Session Beans が追加された事が挙げられます。これはアプリケーション間で同一の情報を扱いたい場合に有効です。今までは独自に Singleton のクラスを作成して運用しなければなりませんでしたが、クラスタ環境のように複数台で実現するためには苦労していたかと思います。なぜなら異なる JVM プロセスの間で Sigleton のインスタンスを共有させる事は面倒だったからです。しかしEJB 3.1で提供する Singleton Session Bean はコンテナを跨ぐ環境においても唯一のインスタンスが保障されるため、こういった実装の手間が必要なく、アノテーションの追加だけで利用できるようになります。その他、タイマーサービスや非同期処理もそれぞれアノテーションを利用して簡単に実装できるようになっています。

最後に、
EJB といえば実装が難しい、設定も面倒という時代は今や過去の事で、今では実装がとてもかんたんになっています。また便利な機能をデフォルトで数多く持っている便利なフレームワークですので、今一度EJB を見直し利用をご検討ください。



























2010年4月7日 at 8:32 午後

Older Posts Newer Posts


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2026年3月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

カテゴリー

clustermap

ブログ統計情報

  • 1,314,742 hits

Feeds

アーカイブ