Posts filed under ‘未分類’

Java EE 6 & GlassFish v3 の概要

先日開催した、ダイセミの発表資料を公開します。

普段は

ここに書いたように、プレゼン発表をする際に原稿をおこすことは殆どないのですが、ダイセミはいつもの人前でのプレゼンと違い、目の前のパソコンに向かって説明を行うので、私としてはとてもやり辛いプレゼン環境です。そこでダイセミ用には原稿を作成しておりました。(以前のJavaSEの時もダイセミ用には原稿を作成しました。)
せっかく文章を作成しており、これを捨てるのももったいないので、原稿をそのままここに掲載します。自分の発表用の元ネタとして作成しているので口語表現でおかしな部分もあるかと思いますが、プレゼンをめくる際に、この原稿を読み進めていただければわかりやすいかと思いますので、どうぞご活用ください。

Page 1
************************************************************
今日は、GlassFishで実感、エンタープライズ Java の進化と題してJava EE 6 と GlassFish v3 の新機能をそれぞれ紹介したいと思います。資料が若干多いため足早に説明をしますが1時間程どうぞ宜しくお願いします。
************************************************************

Page 2
************************************************************
本日のアジェンダは下記のような流れで進めたいと思います。
************************************************************

Page 3,4
************************************************************
はじめに、もう一度 Java EE を見直してみませんか?
************************************************************

Page 5
************************************************************
Java EE の開発にこのようなイメージを持っていませんか?Java EE は XML の設定が困難、設定が膨大、パッケージも面倒、動作させるアプリケーションサーバも重い。。。。。
************************************************************

Page 6
************************************************************
皆様、もし今このようなイメージをお持ちでしたら、そのイメージを是非一新してください。今日、皆様にお伝えしたいメッセージはこのページに凝縮されていいます。Java EE 6 になり Java EE 5 から比べてもさらに簡単開発が進化しました。また、Java EE 6 のアプリケーションの動作環境であるアプリケーションサーバ、GlassFish v3はとても簡単ですし、とても軽量です。もう Tomcat を使う必要はどこにもありません。さらに、今年の年末にリリース予定の GlassFish v3.1 はクラスタ機能を持ち本番環境向けの機能も提供します。
************************************************************

Page 7
************************************************************
さて、それでは実際にそれぞれの概要について説明していきたいと思います。まず、始めに Java EE 6 の概要を紹介します。Java EE 6 は昨年末に正式リリースされました。
************************************************************

Page 8
************************************************************
まず、Java EE 6 のテーマについて紹介します。今回は時間の関係上 JavaEEに含まれる全ての機能/仕様を紹介することはできません。これらの中から重要となるポイントだけをピックアップして紹介して行きたいと思います。

テーマはここに記載するように、拡張性、プロファイル対応、Pruning、より進んだかんたん開発の4点が挙げられます。
************************************************************

Page 9
************************************************************
拡張性についてですが、Servlet 3.0 や JSF 等においては設定ファイルの記載がオプション化され、それぞれ設定ファイルで記載してた内容をプログラミング上でアノテーションを使用して記載する事が
できるようになりました。また仮に web.xml の設定をした場合でもweb.xml の内容が巨大化して可読性が悪くなった場合、各フレームワーク毎に設定ファイルを分け web-fragment.xml を記載し設定ができるようになったため、拡張性が高くなりフレームワーク管理が容易になりました。
************************************************************

Page 10
************************************************************
続いてプロファイルですが、Java EE 6 から新たにプロファイルと呼ばれる概念が導入されました。これは Java EE の全ての機能を提供するのではなく必要な技術を用途に応じて選択し、全ての Java EE の機能のサブセットを提供する事ができるようになりました。例えば、将来的には電話会社向けのプロファイルといった物も提供されるかもしれません。

今回、Java EE 6 のリリース時に最初に提供されるプロファイルはこちらに記載した2点になります。一つは Web プロファイルで、 Web の開発に特化した物、そして Enterprise Platform と呼ばれる、今までと同じJava EE のフルセットを提供するものが用意されています。
************************************************************

Page 11
************************************************************
Web プロファイルについて、含まれる技術をこちらに記載しています。この中に含まれるものは、基本的な Web アプリケーション開発に必要とされる技術だけをピックアップした物です。 この中に EJB Lite と記載していますが、これも EJB の全ての機能ではなく一部の機能だけを含むものです。例えば、EJB Lite にはメッセージドリブンビーン等は含まれません。Java EE の全てではなく Web の開発に特化したサブセットだと認識してください。

このプロファイルの導入メリットは不必要な機能を含まない事により無駄なリソースを消費しなくて済むといったメリット等があります。
************************************************************

Page 12
************************************************************
続いて、Pruning について紹介します。Java EE 6 で初めて仕様の削減を行う事が計画されました。今まで、Java EE は巨大化の一歩をたどって来た歴史がありますが、ここで仕様として古くなった物、使われなくなった API を整理し新しく置き換わった仕様があれば、そちらに移行して頂くようにこのような取り組みを行っています。例えば、JAX-RPC は JAX-WSへ Entity Bean は JPA と便利で扱い易くなった仕様へ移行していただく事を推奨します。

ただし、いきなり使えなくすると既存のアプリケーションに対して非常に大きな影響がでます。ですので、影響を極力すくなくするため、まずは削減候補をオプション化し、さらに次のバージョンで削除するという2段階のプロセスを経て削除するという安全策が講じられております。

現時点で、削減候補の仕様を多用されているお客様は削減候補となった仕様に置き換わる技術への移行をおすすめ致します。
************************************************************

Page 13
************************************************************
続いて Servlet 3.0 について紹介します。Servlet 3.0 は JSR-315 で仕様が制定されましたが、特徴としてここに挙げるようなポイントがあります。中でもマルチパート対応としてファイルがアップロードできる機能が標準仕様に盛り込まれた他、非同期 Servletを実装する事ができるようになったため、Comet等で実現していた Server Push の技術を Servlet で実現できるようになりました。

重要なポイントは、Java SE 5 の言語仕様で追加されたアノテーションベースの宣言的プログラミングモデルを採用し、ジェネリクス等を扱い型の安全性等も強化された点が挙げられます。
************************************************************

Page 14
************************************************************
Servlet 3.0 で指定可能なアノテーションをこのページに記載します。プログラム上でアノテーションを記載した場合でも設定を上書きしたい場合は、web.xml に記載する事で上書きができます。
************************************************************

Page 15
************************************************************
このページでは実際の Servlet 3.0 のサンプルコードを記載しています。この例の赤文字の部分に記載したように、Servlet 2.5 までは web.xml に記載していた内容をプログラム上で記述する事ができるようになっています。
************************************************************

Page 16
************************************************************
続いて、EJB 3.1 について紹介します。EJB 3.1 は JSR-318 で制定されました。

特徴は、こちらに示すようなポイントが挙げられます。EJB 3.1 の個々の特徴に関する詳細は最後に紹介する参考 URLの私のブログで参照して頂ければと思います。
************************************************************

Page 17
************************************************************
ここでは、EJB 3.1 の内便利になった機能を紹介します。その1つはパッケージングが簡略化された事です。今まで EJB は ear ファイルにまとめたり、web 関連モジュールは war にまとめたりとパッケージングするのがとても面倒でした。
************************************************************

Page 18
************************************************************
EJB 3.1 からはパッケージングがとても簡単になり、EJB クラスも単一の war ファイルへ含める事が可能になりました。もちろん今までのようにパッケージングして頂いても問題はございません。また、配備記述子もオプション化されたため、開発者にとっての負担が大幅に軽減されています。
************************************************************

Page 19
************************************************************
また、EJB 3.1 から EJB 3.1 Lite と呼ばれるサブセットを提供しWeb Profile で利用できるようになっています。ここに記載されているようにLite に含まれる機能だけで十分な場合は、Web Profile 版を利用する事ができます。一方、MDBやタイマーサービス等 Full に含まれる機能を利用したい場合は、Enterprise Platform 版を利用してください。

このようにニーズに応じて不要な物を含ませない事ができるようになったのは、Java EE 6 の特徴の一つです。
************************************************************

Page 20
************************************************************
続いて、Bean Validation について紹介します。この仕様は、JSFとJPAに統合されており、ManagedBeanやEntityクラス内で利用することができます。JSFとの統合では、たとえば、コンポーネントに対するバリデーションの結果、メッセージをJSFコンポーネント内に表示させることも可能です。

これらのバリデーションもアノテーションを使用して簡単に記述する事ができます。また、すでに提供されているバリデーション以外にも、カスタムバリデーターを作成することもできます。
たとえば、Emailアドレスの記載内容をチェックするカスタムバリデータを独自に作成することができます。
************************************************************

Page 20
************************************************************
続いて、JPA 2.0 について紹介します。Java Persistence API 通称 JPA はJava EE 5 では EJB 内に含まれていましたが、JPA 2.0 からは Java SE 内からも利用ができるように、仕様が独立しました。JPA 2.0 で提供される機能は基本的には JPA 1.0 プラスα、なのですが、これは実際に JPA 1.0 を使用しているお客様からのフィードバックの元に追加された便利な機能を含んでいます。例えば Entity クラスの作成方法によってより柔軟なデータベーステーブルのモデリングができるようになった他、SQL 分ライクな JPQL についても新しい構文が追加されております。
その他便利な機能が多く含まれますので、こちらも別途私のブログに詳細に記述したプレゼンを用意していますので、ご参照ください。
************************************************************

Page 21
************************************************************
今日は、JPA 2.0 で追加された新機能の内 Criteria API をご紹介します。JPA 1.0 では JPQL という SQL 分ライクな文字列を記載して データベースのクエリーを実行するしか方法はありませんでしたが、Criteria API はJPQL の代わりにプログラミング上でクエリを記載する事ができるようになりました。

文字列で記載する場合、クエリ文字列の記載ミス等があった場合、プログラミング中にはそのミスには気付かず、実行時に初めてランタイムエラーが発生しミスに気付きます。

開発時において、もしくは運用時も実行しなければエラーに気付かないのは非常に危険です。このようなランタイムエラーを極力さける事ができるのがCriteria API と Metamodel API の併用です。全てのデータベースに対するクエリーを Java プログラムだけで記載できるため、コンパイル時もしくは、統合開発環境が開発時にエラーを教えてくれます。そこで、ランタイムエラーが発生する前にミスに気付く事ができとても便利です。
************************************************************

Page 23
************************************************************
次は JSF2.0です。
JSF2.0の特徴ですが、大きなところで、Faceletsが採用され点があげられます。このため、JSPに代わりXHTMLによるビューの記述ができるようになりました。またこれにより、テンプレートの作成も簡単にできるようになりました。

また、かんたん開発の一環として、faces-config.xmlがオプション化されました。ManegedBeanをアノテーション化したり、JSFの各ページ間のナビゲーションを改良し、ボタンやリンク名からXHTMLファイル名をマッピングするようになりました。

その他、リソースフォルダを標準化したり、Ajax対応/ブックマーク可能なURLなどの機能が追加されています。
************************************************************

Page 24
************************************************************
最後にDIについて紹介します。従来のDIに追加して、CDIという機能が追加されました。これは、CDI: Context and Dependency Injection for Java EE の略で、当初はJSR299でWebBeansという名称で仕様作成されていました。CDIでは、Java EE 5よりもより汎用的にDIを利用することができるようになっています。

新たなアノテーションとして、@Injectで注入するフィールドを定義します。また、独自のインジェクションポイントを自由に定義することも可能です。

CDIでは、EJB SssionBeanやJSFのManagedBean、CDIコンテナがモジュール内で見つけたBeanクラスをInject対象とすることができます。このCDI機能は、起動時のクラスロードによる負荷があるため、デフォルトでは無効となっております。有効かするためには beans.xmlというファイルを定義し有効化されます。beans.xmlは空のファイルでもかまいません。

以上で、足早に、Java EE6 の新機能について紹介してきましたが、いずれの機能もよりかんたん開発をめざして改良が施されておりますので、Java EE は理解するのも難しい、コーディングするのも難しい、パッケージングするのも大変等といった過去の悪しきイメージは取り除いていただき、今一度このかんたんになった Java EE 6 を是非試して頂ければと思います。
************************************************************

Page 25, 26
************************************************************
続いて、GlassFish v3 について概要を紹介しますGlassFish v3 は Java EE 6 の参照実装で世界で初めてJava EE 6 の仕様に完全に準拠したサーバとして提供しております。

このアプリケーションサーバは、非常に軽量で起動もとても高速です。また、Java EE 6 のプロファイルに対応し、Web Profile 版、Enterprise Platform 版のそれぞれを提供しています。

過去のバージョンに比べ、アーキテクチャも刷新され、OSGi のモジュールサブシステムが新たに導入されました。

簡単な操作という観点では、インストールも zip 版を提供しているのでunzip するだけですぐ使える環境を用意することもできます。

また、あらたに JRockit Java VM を正式サポートするようになりました。
************************************************************

Page 27
************************************************************
起動時間が高速という事なのですが、これは実際にインストールして試して頂きたいのですが、私が普段使用している Mac OS/Xでは約4秒程でアプリケーションサーバが起動します。非常に軽量なコンテナで、アプリケーションサーバは重いというイメージを払拭するサーバです。

開発時にはアプリケーションサーバを頻繁に再起動する場合がありますが、このアプリケーションサーバは非常に高速で起動/再起動ができますので開発時の待ち時間を大幅に減少する事ができます。また運用時においても再起動による待ち時間を大幅に減少する事ができます。
************************************************************

Page 28
************************************************************
かんたん開発では、今世の中で有名な統合開発環境はサポートしており、統合開発環境と連携して開発がとても楽になります。
************************************************************

Page 29
************************************************************
また、これは GlassFish が持つ機能なのですが、アプリケーションの再配備の時に以前のセッションを保持したまま再配備ができる機能を提供していますので、アプリケーション開発においては非常に便利です。例えばログインをするようなアプリケーションを構築している場合、ある一部を修正して再配備するだけで、もう一度ログインから行わなければなりませんでしたがセッションを持続するおかげで再ログインする必要がなくなります。
************************************************************

Page 30
************************************************************
また、かんたんな管理機能として Web ブラウザからアクセスできる GUI の 管理画面を用意していますので、直感的に理解しやすいインタフェースを利用して簡単に管理を行う事ができます。その他、v3 から RESTful インタフェースを利用した管理もできるようになっています。
************************************************************

Page 31
************************************************************
つづいて、GlassFish は非同期 I/O に対応したサーバとして実装されております。

今までの Web Server/Application Server はマルチスレッドの同期I/O(Blocking I/O)として実装された物が主流でした。

同期 I/O 型のサーバの処理内容を左の絵を使って説明します。仮にサーバがスレッドプール内に3つのスレッドを保持している状態で、同時に5個のリクエストが来た事を想定してください。この時各処理はリクエスト毎にブロックされているため、残り2つのリクエストはキューに溜まったままになり、他のスレッドの処理が終わらないと処理する事ができません。これを右側の非同期 I/O のサーバを使った場合、各処理をブロックしないで処理ができるので少ないスレッドで数多くのリクエストを
さばく事ができるようになります。

リクエスト数が少ない場合は、マルチスレッド型のサーバの方がパフォーマンスがよいですが、リクエスト数が多くなればなる程、非同期 I/O の方がパフォーマンスがよくなります。
************************************************************

Page 32
************************************************************
続いて、GlassFish のアーキテクチャについて紹介します。今日は、詳細を説明する事はできませんが、OSGi のモジュールサブシステム上でアプリケーションサーバが動作している事をご理解ください。

このOSGi モジュールサブシステム導入のメリットは、アプリケーションサーバを再起動する必要がなく、追加モジュールをアプリケーションサーバに追加できたりもしくは不要になった機能を停止/削除する事ができるようになる点です。

また、OSGi の導入により GlassFish 自身を利用者の皆様のご自身でご自由に拡張できるようになったのも一つのポイントです。

GlassFish では自由に拡張できるように、管理機能を拡張したい開発者のためにAPI を公開していますので、拡張可能なアプリケーションサーバといえます。
************************************************************

Page 33
************************************************************
次に 組み込み可能コンテナについて紹介します。GlassFish の組み込み可能コンテナの機能を使って
GlassFish の持つ機能を、他の Java アプリケーションから利用できるようになりました。

例えば、GlassFish をインストールしたり設定せずに、GlassFish のライブラリをコピーするだけで、自分が独自に作成した Javaアプリケーション内でGlassFish の Web サーバ機能を使ったり、内部的にアプリケーションをデプロイして GlassFish のドメイン管理機能を使わずに限定したサービスだけを提供する事もできます。

また、開発時に有効なのは、EJB のテストが非常に楽になる点です。今ままで EJB の単体テストを行う際には、作成した EJB を一度アプリケーションサーバにデプロイした後、リモートからアクセスする等してテストを行っていたかと思います。
しかし、組み込みコンテナを使うと、JUnit のテストコード中でコンテナを起動させ同一 JavaVM のプロセス内で EJB のテストを行う事ができるようになりEJB の単体テストが大幅に楽になります。
************************************************************

Page 34
************************************************************
JUnitのテストコードのサンプルを記載します。赤文字で記載したように、プログラム中で EJB コンテナを起動し、JNDI のルックアップだけでテストができるようになりとても便利です。

以上で GlassFish v3.0 の概要説明は終わりです。
************************************************************

Page 35
************************************************************
最後に GlassFish の今後について若干触れておきたいと思います。
************************************************************

Page 36
************************************************************
今後についてですが、
まず、GlassFish v3.1 というものが今年の年末にリリースされる予定です。これは、複数台のマシンで稼働/管理ができるクラスタ機能を持つものでまた高可用性機能も提供する予定です。また Coherence にも対応する予定です。

次に、来年以降 v3.2 で v3.1 に対する改良版を提供する予定です。このバージョンでは次期 Java EE の 7 のアーリアクセス機能も提供する予定です。

最後に、GlassFish v4 では Java EE 7 に対応した物をリリースする予定です
************************************************************

Page 37
************************************************************
GlassFish v3.1 ではクラスタ対応がメインの機能ですが、その他、HTML5のWebSocket 対応等も含まれます。
************************************************************

Page 38
************************************************************
次に、GlassFish v3.1のクラスタ機能を紹介したいのですが、その前に既存の v2.1 のクラスタ機能についてかんたんに紹介します。v2.1 では分散されたマシン上にノードエージェントと呼ばれるエージェントプロセスを必ず導入する必要がありました。このノードエージェント経由でサービスの起動/停止等のライフサイクルの管理を行っていました。
************************************************************

Page 39
************************************************************
一方、GlassFish v3.1ではノードエージェントの代わりに 各マシン上で SSHD のデーモンプロセスを起動し SSH 経由でサービスの起動/停止等を行うように変更されました。これにより以前にくらべ軽量に命令を実行させる事ができるようになります。
************************************************************

Page 40
************************************************************
最後に、ざっと GlassFish の特徴について紹介します。
後ほど、私のブログで本資料を公開しますので、詳細は後ほどご確認ください。
************************************************************

Page 41
************************************************************
参考情報は下記の通りです。
私のブログの URL はここに記載している yoshio3.com になります。
************************************************************

Page 41
************************************************************
まとめます。
Java EE 6 でさらに簡単開発がすすみました。XML による設定ファイルの編集はすくなくなりました。また、組み込みコンテナを使って EJB の単体テストも簡単になります。また、GlasssFIsh はとても軽量です。インストールもとても簡単です。Tomcat をまだ使っている方は是非 GlassFish を試してみてください。

今後でてくる GlassFish ではクラスタ機能も提供する予定です。

以上で本日の私からの発表は以上です。
どうもご清聴ありがとうございました。
************************************************************

2010年9月1日 at 4:12 午後 1件のコメント

夏休み!!

ちょっと、現実逃避です。

先週、忙しかった仕事も一段落したので、先週の金曜日に有給取得(夏休み)して1泊2日で福島に行ってきました。今週の木・金も夏休みを頂く予定です。もう暦的には夏も終わりかぁ。(まだまだ暑いけど。)




さて仕事、仕事。

2010年8月31日 at 4:35 午後

先進的アプリケーションサーバ GlassFish v3 のご紹介

本日の Oracle Sun Technology Update イベントで発表時に使用したファイルを公開します。

今日の発表はGlassFish v3 の概要ではなく、一歩踏み込んだアーキテクチャ紹介(モジュールサブシステム)等を行いました。GlassFish v2 からさらに進化した GlassFish v3 を是非ご覧ください。

2010年8月19日 at 5:13 午後

Java とはなんぞや?Oracleダイセミ発表資料公開

先日、オラクルのダイレクトセミナーで Java に関する超入門を発表しました。普段は EE 周りしか人前で話をすることはないですし、また今更ながらの Java とはなんぞや的なネタだったので、普段とは異なり少し緊張しながら発表しました。
プレゼン資料は、Java の過去の歴史から現在までを写真を交えながら説明しているので、まさしく初学者にとって Java って何?を理解するにはよいかもしれません。

ちなみに、この資料は元 Sun の Java エバンジェリスト山口浩さんが以前作成された資料を元に作成しています。山口さんありがとうございます。

PS.
さて、目黒雅叙園のイベントが明日に迫りましたがご安心ください。発表用の原稿は既にできて提出しています。Twitter でもつぶやきましたが、明日の発表は GlassFish v3 の概要的な紹介は少なく、もう少し踏み込んだ GlassFish のアーキテクチャやモジュールサブシステム(OSGi/HK2)の紹介、また GlassFish がモジュールサブシステム上で動くメリット、v3 のGrizzly の振る舞い等を説明する予定です。
また v3.1 の機能についても若干説明する予定です。
どうぞお楽しみにしてください。

追記:(8/20)
************************************************************
櫻庭さんからP27のヒープ領域についてご指摘をいただきました。P 27 のNew領域に Eden領域とFrom/Toを記載していますが、Eden領域を記載したのであれば、From/Toを記載するのではなく、Suvivor領域と記載すべきでした。
櫻庭さん適切なご指摘をいただきましてありがとうございました。
************************************************************

2010年8月18日 at 4:12 午前 1件のコメント

mediacast.sun.com 7/29 に閉鎖

http://mediacast.sun.com/ のサイトが US 時間の 7/29で完全閉鎖されるようです。

私のブログからもこのサイトへ数多くのコンテンツをアップロードしていますが、僅々で資料、サンプル等が必要な方は今すぐダウンロードの程宜しくお願いします。
別途ファイルのアップロード先等が決まれば、そちらへ張り替える予定ですが、現時点でどこへアップすべきか私が分かっていないので、7/29 以降は mediacast のコンテンツは入手できなくなります。

過去に私が作成した資料へのリンク
どうぞ宜しくお願いします。

PS.
私が mediacast にアップした資料の中ではGrizzly のプレゼン資料が最もダウンロードされているようでした。

mediacast には海外のエンジニアも有用な情報を数多くアップしているので、このようなサイトが無くなるのはとても残念です。自動でどちらかにマージしてくれれば良かったんですけどね。

2010年7月26日 at 2:41 午後 2件のコメント

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 午前

「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件のコメント

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 午後

Older Posts Newer Posts


Java Champion & Evangelist

Translate

ご注意

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

カレンダー

2026年3月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

カテゴリー

clustermap

ブログ統計情報

  • 1,314,666 hits

Feeds

アーカイブ