EJB (Enterprise Java Beans) 棚橋沙弥香
テーマ選定の背景 現在携わっている Java 開発案件で EJB が使われておりますが 私自身が EJB を扱うのが初めてで知らない技術でしたので 勉強してみたいと思い 今回はこのテーマを選定しました
目次 EJBとは 1 EJBの利点 2 EJBの歴史 3 EJBの開発環境の作成 4 5 Enterprise Bean 6 非同期処理の実装
Bean Validation Managed Bean Common Annotation Interceptors Concurrency Utilities EJB とは 1 EJB(Enterprise Java Beans) は Java EE フレームワークに含まれる機能の 1 つ Java EE は 企業システムのアプリケーション開発に必要なさまざまな機能を 1 つにまとめた包括仕様の総称 WebSocket JAX-RS JSF JSP/JSTL JPA EL Servlet DI/CDI/EJB JPA JMS Batch JTA Java Mail JCA Java EE 7
EJB とは 2 EJB は アプリケーションサーバー上で動作する Java のプログラムのうち 特に ビジネスロジック を担当する部品を指す WEB アプリケーションを稼働させる WEBコンテナ JSP サーブレット JSP サーブレット JSP サーブレット データ処理を依頼 結果 EJB コンテナ Enterprise Bean Enterprise Bean Enterprise Bean を管理し 動作させる DB の読み書き データベース データストア層 ユーザー プレゼンテーション層 アプリケーションサーバー ビジネスロジック層 EJB の規約に則った特別な Bean
目次 EJBとは 1 EJBの利点 2 EJBの歴史 3 EJBの開発環境の作成 4 5 Enterprise Bean 6 非同期処理の実装
EJB の利点 1 EJB コンテナが トランザクションの制御や EJB として記述したクラスのインスタンスの生成 / 実行と破棄といったシステムレベルのサービスを提供してくれるため 開発者はビジネスロジックの構築に集中できる
EJB のトランザクション管理 EJB では 何も指定しなくても メソッドを実行するとトランザクションを利用するようになっている 何も指定しなかった場合は 以下の状態になっている トランザクションをEJBコンテナ管理に任せる トランザクションがない場合は開始され ある場合はそのトランザクションを引き継ぐ 別途 @TransactionManagement アノテーション @TransactionAttribute アノテーションにより トランザクション仕様を指定することもできる
EJB の利点 2 EJB では プレゼンテーション層の差し替えが行えるため アプリケーションをさまざまな方法で利用できる HTML WEB コンテナ EJB コンテナ Webユーザー XML JSP サーブレット JSP サーブレット JSP サーブレット Enterprise Bean Enterprise Bean データベース Web サーバー Java アプリケーション アプリケーションサーバー
EJB の利点 3 Java EE 準拠のアプリケーションサーバー上であればどこでも動く 商用アプリケーションサーバーの多くでは EJB の拡張機能を提供している Java EE 準拠のアプリケーションサーバーの例として GlassFish JBoss WebSphere WebLogic などがある
目次 EJBとは 1 EJBの利点 2 EJBの歴史 3 EJBの開発環境の作成 4 5 Enterprise Bean 6 非同期処理の実装
EJB の誕生 EJB は元々 OMG の CORBA や Sun の RMI といった 分散オブジェクトに由来する技術であり RMI をベースにビジネスロジックを実装するコンポーネントとして誕生した Java の誕生から 3 年後の 1998 年頃に登場している CORBA 様々なプラットフォームでの分散処理の連携を実現するための基本仕様 RMI ネットワークを通じてプログラム同士が通信を行ない 異なる コンピューター上にあるオブジェクト ( リモートオブジェクト ) の メソッドを呼び出すための技法
欠点が多かった EJB2.1 以前 EJB は EJB2.1 以前は 複雑で扱いにくいと批判されていた 通常の Java プログラミングにはない規約が多数あり 開発者はその規約をよく知っていることが必要で 開発やメンテナンスがしにくかった トランザクションやセキュリティといった EJB の実行時情報を XML の設定ファイルに記述する必要があった EJB のコンポーネントは, アプリケーションサーバー上に配置しなければ実際に動かせなかったため 単体テストを行いにくかった
大きく改良されたEJB3.0 EJB3.0(2007年 )では 以前のバージョンに比べ アノテーションが利用できるようになり プログラミング が格段に簡単になった 主な特徴は以下の通り EJBのコンポーネントをJavaオブジェクトとして記述で きるようになった XMLによる設定は不要になった EJBのコンポーネントを簡単に呼び出せるようになった Javaオブジェクトとデータベース間のデータ変換を JPA(Java Persistence API) というデータベース アクセス方法により 簡潔に行えるようになった 以降はEJB3.2について説明する
目次 EJBとは 1 EJBの利点 2 EJBの歴史 3 EJBの開発環境の作成 4 5 Enterprise Bean 6 非同期処理の実装
EJB 開発環境の作成 1 EJB の開発は JBoss Developer Studio で行える JBoss Developer Studio は JBOSS による Java EE アプリケーションを構築するための統合開発環境 JBoss Developer Studio のインストーラは 以下のサイトからダウンロードできる http://developers.redhat.com/products/devstudio/download/ Installer の WithEAP のリンクを選択 devstudio-( ハ ーシ ョン )-installer-eap.jar が インストーラ
EJB 開発環境の作成 2 JBoss Developer Studio の動作には Oracle JDK 1.8.0 をインストールしておく必要がある JBoss Developer Studio のダウンロードには JBoss Community のアカウントが必要である JBoss Developer Studio の利用は 無償で行える JBoss Developer Studio のインストール手順は 以下を参照のこと http://myhappiness.hatenablog.com/entry/2013/02/20/015511
EJB 開発環境の作成 3 JBoss Developer Studio を起動すると 以下のような画面が起動する
目次 EJBとは 1 EJBの利点 2 EJBの歴史 3 EJBの開発環境の作成 4 5 Enterprise Bean 6 非同期処理の実装
Enterprise Bean の種類 セッション Bean ビジネスロジックを実装するための Enterprise Bean 詳しくは後述する メッセージドリブン Bean(MDB) キューまたはトピックからメッセージを受け取ることで 起動する 用途が限定的な Enterprise Bean アプリケーション A 送信 メッセージ キューまたはトピック アプリケーション B MDB 受信 Enterprise Bean
セッション Bean の種類 ステートレスセッション Bean ステート ( 状態 ) をもたないセッション Bean Web ページのオンライン処理と相性が良い ステートフルセッション Bean ステート ( 状態 ) をもつセッション Bean クライアント毎にインスタンスが作成される シングルトン アプリケーション上に 1 つだけ存在するセッション Bean タイマー 時間を指定して起動する部品
ステートレスセッション Bean ステート ( 状態 ) をもたないセッション Bean EJB クライアントからの呼び出しの量に応じて作成される 最もよく利用される EJB リクエストと EJB のインスタンスに固定の関係はなく 呼ばれた数だけ利用される クライアント @EJB MyStateless bean; 足りなければ作る EJB コンテナ アプリケーションサーバー 処理が終われば戻され 再利用される プール
ステートレスセッション Bean の定義例 import javax.ejb.stateless; @Stateless public class MyStatelessBean { public String sayhello(){ return Hello EJB!! ; } } ステートレスセッション Bean として取り扱う
ステートレスセッション Bean の 呼出例 import javax.ejb.ejb; Servlet 関連の import 句や処理は省略している public class CallEJBServlet extends HttpServlet { @EJB 呼び出すEJBを定義 MyStateless bean; } @Override protected void doget(httpservletrequest request,httpservletresponse response) throws ServletException, IOException { String msg = bean.sayhello(); } EJBのメソッドを呼び出す
ステートレスセッション Bean の サンプル作成 ステートレスセッション Bean のサンプル作成は 以下のように行った 1. 動的 Web プロジェクト (Dynamic Web Project) を新規作成する 2. 通常の Java クラスとして ステートレスセッション Bean(MyStatelessBean.java) を作成する 3. 2. の結果を表示するための JSP を作成する 4. サーブレットクラス (CallEJBServlet.java) を作成し 2. のクラスを呼び出し 3. の JSP に遷移する処理を記述する
ステートレスセッション Bean の サンプル実行 ステートレスセッション Bean のサンプル実行は 以下のように行った 1. サーバービュー (Servers) に JBOSS サーバーが表示されていることを確認する 2. 1. の JBOSS サーバーに 作成した動的 Web プロジェクトを追加する 3. 1. の JBOSS サーバーを起動する 4. Web ブラウザから 以下の URL でアクセスする http://localhost:8080/( 動的 Web フ ロシ ェクト名 )/( サーフ レットアクセスハ ス )
ステートフルセッション Bean1 ステート ( 状態 ) をもつセッション Bean 画面遷移に紐付く情報などを保持する クライアント毎にインスタンスが作成される クライアント @EJB MyStateful bean; クライアント @EJB MyStateful bean; クライアント @EJB MyStateful bean; リクエストと EJB のインスタンスに固定の関係があり 保持される EJB コンテナ アプリケーションサーバー プール
ステートフルセッション Bean2 ステートフルセッション Bean は ライフサイクルをもつ セッション Bean のインスタンスに対する呼び出しが一定時間ないと 非活性化される クライアント @EJB MyStateful bean; 2. 活性化 /3. 非活性化 1. 生成 4. 破棄 EJB コンテナ アプリケーションサーバー プール
ステートフルセッション Bean3 ステートフルセッション Bean は ライフサイクルのコールバックメソッドをもつ アノテーション名 呼ばれるタイミング @PostConstruct コンストラクタが呼ばれた後 @PostActive 活性化された後 @PrePassivate 非活性化される前 @PreDestroy 破棄される前 @Remove 破棄を行う際 (@PreDestroyの後)
ステートフルセッション Bean の定義例 import javax.ejb.stateful; import javax.annotation.postconstruct; import java.util.logging.* 呼び出し 作成 実行手順はステートレスセッション Bean の場合と同じ @Stateful public class MyStatefulBean { } public String sayhello(){ } return Hello EJB!! ; @PostConstruct public void calledpostconstruct(){ } logger.log(level.info, "PostConstruct called."); private static final Logger = 以下略 ステートフルセッション Bean として取り扱う ライフサイクルのコールバックメソッド利用例
シングルトンセッション Bean と定義例 アプリケーション上に 1 つだけ存在するセッション Bean をシングルトンセッション Bean という import javax.ejb.singleton; import javax.ejb.startup; 呼び出し 作成 実行手順はステートレスセッション Bean の場合と同じ @Singleton @Startup public class MySingletonBean{ } 以下略 シングルトンセッション Bean として取り扱う デプロイされたアプリケーションが有効化されたタイミングで すぐオブジェクトを生成する
タイマー 時間に関係する処理や 定期的な処理をアプリケーションサーバー上で実装したい場合に タイマーを利用できる 例えば 以下のような場合に用いる 時間帯によって挙動を変えるために内部の設定を変更する 定期的に外部システムから情報を取得したり システムの外部に提供する アプリケーションの情報を定期的に出力する
タイマーの定義例 import javax.annotation.postconstruct; import javax.ejb.*; import java.util.logging.*; @Singleton @Startup public class LogTimer{ } @PostConstruct @Schedule(hour= 9, minute= 0-10, second= 0 ) public void mytimer(){ } 9:00~9:10 まで 1 分刻みでログ出力を行う logger.log(level.info, LogTimer called."); private static final Logger = 以下略 サーバーを起動したタイミングでセッション Bean が生成され mytimer メソッドが実行されるようになる
目次 EJBとは 1 EJBの利点 2 EJBの歴史 3 EJBの開発環境の作成 4 5 Enterprise Bean 6 非同期処理の実装
同期処理と非同期処理 非同期処理は あるタスクが実行をしている際に 他のタスクが別の処理を実行できるが 同期処理は実行できない
非同期処理の定義例 import javax.ejb.stateless; import javax.ejb.asynchronous; import java.util.logging,*; @Stateless public class MyAsyncBean { } @Asynchronous public void sendmail (){ } 非同期処理を行う ( 付与しない場合は同期処理 ) logger.log(level.info, sending mail started. ); private static final Logger = 以下略
まとめ 現状の EJB3.2 では トランザクション管理をコンテナで自動で行ったり タイマーや非同期処理を行ったりする処理を アノテーションを付与するだけで簡単に行えるようになっていることがわかりました Java EE には EJB 以外にもいろいろな技術があるようですので もっと勉強してみたいと思います
参考文献 Java EE7 徹底入門 標準 Java フレームワークによる高信頼性 Web システム の構築 EJB の仕組みを知ろう http://www.itmedia.co.jp/enterprise/0401/30/epn11.html