ejb - ジェイスクール – 新宿でjavaを勉強するならジェ …vol8][s_tanahashi... ·...
TRANSCRIPT
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 BatchJavaMail
JCA
DI/CDI/EJB JTA
JSP/JSTL JPA EL Servlet
WebSocket JAX-RS JSF
Bean V
alidation
Managed B
ean
Com
mon A
nnota
tion
Inte
rcepto
rs
Concurr
ency U
tilities
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 BeanWebユーザー
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)」というデータベース・アクセス方法により、簡潔に行えるようになった。
※以降はEJB3.2について説明する。
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」のインストール手順は、
以下を参照のこと。http://myhappiness.hatenablog.com/entry/2013/02/20/015511
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コンテナ
プール
クライアント
@EJBMyStateless 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コンテナ
プール
クライアント
@EJBMyStateful bean;
リクエストとEJBのインスタンスに固定の関係があり、保持される
クライアント
@EJBMyStateful bean;
クライアント
@EJBMyStateful bean;
ステートフルセッションBean②
ステートフルセッションBeanは、ライフサイクルをもつ。
クライアント
@EJBMyStateful 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
@Startup
public 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 = ・・・以下略・・・
}
非同期処理を行う(付与しない場合は同期処理)
まとめ
現状のEJB3.2では、トランザクション管理をコンテナで自動で行ったり、タイマーや非同期処理を行ったりする処理を、アノテーションを付与するだけで簡単に行えるようになっていることがわかりました。
Java EEには、EJB以外にもいろいろな技術があるようですので、もっと勉強してみたいと思います。
参考文献
Java EE7 徹底入門
標準 Javaフレームワークによる高信頼性Webシステム
の構築
EJBの仕組みを知ろう
http://www.itmedia.co.jp/enterprise/0401/30/epn11.html