EJB
(Enterprise Java Beans)
棚橋沙弥香
テーマ選定の背景
現在携わっているJava開発案件で、EJBが使われ
ておりますが、私自身がEJBを扱うのが初めてで
知らない技術でしたので、勉強してみたいと思い、
今回はこのテーマを選定しました。
1 • EJBとは
2 • EJBの利点
3 • EJBの歴史
4 • EJBの開発環境の作成
5 • Enterprise Bean
6
• 非同期処理の実装
目次
EJBとは①
EJB(Enterprise Java Beans)は、Java EEフレームワーク
に含まれる機能の1つ。
Java EEは、企業システムのアプリケーション開発に
必要なさまざまな機能を1つにまとめた包括仕様の総称。
JPA JMS Batch JavaMail JCA
DI/CDI/EJB JTA JSP/JSTL JPA EL Servlet WebSocket JAX-RS JSF Bea n V al id ati on M anag ed Bea n Co m m on Annot ati on Inte rce p tors Co nc urrenc y Ut ili ti es Java EE 7
アプリケーションサーバー
EJBとは②
EJBは、アプリケーションサーバー上で動作するJavaの プログラムのうち、特に「ビジネスロジック」を担当す る部品を指す。 データ ベース プレゼンテーション層 ビジネスロジック層 データ ストア層 ユーザー データ 処理を 依頼 結果 DBの 読み 書き WEBコンテナ JSP・サーブレット ・・・ JSP・サーブレット JSP・サーブレット EJBコンテナ Enterprise Bean ・・・ Enterprise Bean Enterprise Beanを管理し、 動作させる EJBの規約に 則った特別な Bean WEBア プリケー ションを 稼働させ る1 • EJBとは
2 • EJBの利点
3 • EJBの歴史
4 • EJBの開発環境の作成
5 • Enterprise Bean
6
• 非同期処理の実装
目次
EJBの利点①
EJBコンテナが、トランザクションの制御や、EJBとして
記述したクラスのインスタンスの生成/実行と破棄と
いったシステムレベルのサービスを提供してくれるため、 開発者はビジネスロジックの構築に集中できる。
EJBのトランザクション管理
EJBでは、何も指定しなくても、メソッドを実行すると トランザクションを利用するようになっている。 何も指定しなかった場合は、以下の状態になっている。 ・トランザクションをEJBコンテナ管理に任せる。 ・トランザクションがない場合は開始され、 ある場合はそのトランザクションを引き継ぐ。 別途、@TransactionManagementアノテーション、 @TransactionAttributeアノテーションにより、 トランザクション仕様を指定することもできる。アプリケーションサーバー
EJBの利点②
EJBでは、プレゼンテーション層の差し替えが行えるため、 アプリケーションをさまざまな方法で利用できる。 WEBコンテナ JSP・サーブレット ・・・ JSP・サーブレット JSP・サーブレット EJBコンテナ Enterprise Bean ・・・ Enterprise Bean Webユーザー HTML Webサーバー XML データ ベース Javaアプリ ケーションEJBの利点③
Java EE準拠のアプリケーションサーバー上であれば どこでも動く。商用アプリケーションサーバーの多く では、EJBの拡張機能を提供している。 ・・・ Java EE準拠のアプリケーションサーバーの例として、 GlassFish、JBoss、WebSphere、WebLogic などがある。1 • EJBとは
2 • EJBの利点
3 • EJBの歴史
4 • EJBの開発環境の作成
5 • Enterprise Bean
6
• 非同期処理の実装
目次
EJBの誕生
EJBは元々、OMGのCORBAやSunのRMIといった 分散オブジェクトに由来する技術であり、RMIをベースに ビジネスロジックを実装するコンポーネントとして誕生した。 Javaの誕生から3年後の1998年頃に登場している。 ・CORBA 様々なプラットフォームでの分散処理の連携を実現するための基本仕様 ・RMI ネットワークを通じてプログラム同士が通信を行ない、異なる コンピューター上にあるオブジェクト(リモートオブジェクト)の メソッドを呼び出すための技法欠点が多かったEJB2.1以前
EJBは、EJB2.1以前は、複雑で扱いにくいと批判されていた。 通常のJavaプログラミングにはない規約が多数あり、 開発者はその規約をよく知っていることが必要で、開発 やメンテナンスがしにくかった。 EJBのコンポーネントは,アプリケーションサーバー上に 配置しなければ実際に動かせなかったため、単体テストを 行いにくかった。 トランザクションやセキュリティといったEJBの実行時 情報を、XMLの設定ファイルに記述する必要があった。大きく改良されたEJB3.0
EJB3.0(2007年~)では、以前のバージョンに比べ、 アノテーションが利用できるようになり、プログラミング が格段に簡単になった。主な特徴は以下の通り。 EJBのコンポーネントをJavaオブジェクトとして記述で きるようになった。XMLによる設定は不要になった。 EJBのコンポーネントを簡単に呼び出せるようになった。 Javaオブジェクトとデータベース間のデータ変換を、「JPA(Java Persistence API)」というデータベース・ アクセス方法により、簡潔に行えるようになった。
1 • EJBとは
2 • EJBの利点
3 • EJBの歴史
4 • EJBの開発環境の作成
5 • Enterprise Bean
6
• 非同期処理の実装
目次
EJB開発環境の作成①
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開発環境の作成②
「JBoss Developer Studio」の動作には、Oracle JDK
1.8.0をインストールしておく必要がある。
「JBoss Developer Studio」のダウンロードには、
JBoss Communityのアカウントが必要である。
「JBoss Developer Studio」の利用は、無償で行える。
「JBoss Developer Studio」のインストール手順は、
以下を参照のこと。
EJB開発環境の作成③
「JBoss Developer Studio」を起動すると、以下のような 画面が起動する。
1 • EJBとは
2 • EJBの利点
3 • EJBの歴史
4 • EJBの開発環境の作成
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;public class CallEJBServlet extends HttpServlet { @EJB
MyStateless bean; @Override
protected void doGet(HttpServletRequest request ,HttpServletResponse response)
throws ServletException, IOException { String msg = bean.sayHello(); } } EJBのメソッドを呼び出す 呼び出すEJBを定義 ※Servlet関連のimport句や処理は 省略している
ステートレスセッションBeanの
サンプル作成
ステートレスセッションBeanのサンプル作成は、
以下のように行った。
1. 動的Webプロジェクト(Dynamic Web Project)を 新規作成する。 2. 通常のJavaクラスとして、ステートレスセッション Bean(MyStatelessBean.java)を作成する。 4. サーブレットクラス(CallEJBServlet.java)を作成し、 2.のクラスを呼び出し、3.のJSPに遷移する処理を 記述する。 3. 2.の結果を表示するためのJSPを作成する。
ステートレスセッションBeanの
サンプル実行
ステートレスセッションBeanのサンプル実行は、 以下のように行った。 1. サーバービュー(Servers)に、JBOSSサーバーが表示 されていることを確認する。 2. 1.のJBOSSサーバーに、作成した動的Webプロジェクト を追加する。 3. 1.のJBOSSサーバーを起動する。 4. Webブラウザから、以下のURLでアクセスする。 http://localhost:8080/(動的Webプロジェクト名)/(サーブレットアクセスパス)ステートフルセッション
Bean①
ステート(状態)をもつセッションBean。 画面遷移に紐付く情報などを保持する。 クライアント毎にインスタンスが作成される。 アプリケーションサーバー EJBコンテナ プール クライアント @EJB MyStateful bean; リクエストとEJBのインスタンス に固定の関係があり、保持される クライアント @EJB MyStateful bean; クライアント @EJB MyStateful bean;ステートフルセッション
Bean②
ステートフルセッションBeanは、ライフサイクルをもつ。 クライアント @EJB MyStateful bean; アプリケーションサーバー EJBコンテナ プール 1.生成 2.活性化/3.非活性化 4.破棄 セッションBeanのインスタンスに 対する呼び出しが一定時間ないと、 非活性化される。ステートフルセッション
Bean③
アノテーション名 呼ばれるタイミング @PostConstruct コンストラクタが呼ばれた後 @PostActive 活性化された後 @PrePassivate 非活性化される前 @PreDestroy 破棄される前 @Remove 破棄を行う際(@PreDestroyの後) ステートフルセッションBeanは、ライフサイクルの コールバックメソッドをもつ。ステートフルセッション
Beanの定義例
import javax.ejb.Stateful;import javax.annotation.PostConstruct; import java.util.logging.*
@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の場合と同じ
シングルトンセッション
Beanと定義例
import javax.ejb.Singleton; import javax.ejb.Startup; @Singleton
@Startup
public class MySingletonBean{ ・・・以下略・・・ } シングルトンセッション Beanとして取り扱う アプリケーション上に1つだけ存在するセッションBeanを シングルトンセッションBeanという。 デプロイされたアプリケーション が有効化されたタイミングで、 すぐオブジェクトを生成する ※呼び出し・作成・実行手順 はステートレスセッション Beanの場合と同じ
タイマー
時間に関係する処理や、定期的な処理をアプリケーション サーバー上で実装したい場合に、タイマーを利用できる。 例えば、以下のような場合に用いる。 ・時間帯によって挙動を変えるために内部の設定を変更する。 ・定期的に外部システムから情報を取得したり、 システムの外部に提供する。 ・アプリケーションの情報を定期的に出力する。タイマーの定義例
import javax.annotation.PostConstruct; import javax.ejb.*; import java.util.logging.*; @Singleton @Startuppublic class LogTimer{ @PostConstruct
@Schedule(hour=“9”, minute=“0-10”, second=“0”) public void myTimer(){
logger.log(Level.INFO, “LogTimer called."); }
private static final Logger = ・・・以下略・・・ } 9:00~9:10まで、1分刻みで ログ出力を行う ※サーバーを起動したタイミングで セッションBeanが生成され、 myTimerメソッドが実行されるよう になる
1 • EJBとは
2 • EJBの利点
3 • EJBの歴史
4 • EJBの開発環境の作成
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 = ・・・以下略・・・ }
非同期処理を行う