stateless session beans
DESCRIPTION
Stateless Session Beans. EJB 3.0 コース 第 4 回 2006 年 8 月 4 日. ここでの目標. Stateless Session Bean の概要を理解する。. Stateless Session Beans. Session Beans (1). クライアントが必要に応じて呼び出す処理をまとめた もの クライアントの特定のセッションに対応 セッション開始と同時に生成され、セッション終了時に消滅. Session Beans (2). Stateless Session Beans - PowerPoint PPT PresentationTRANSCRIPT
1
Stateless Session BeansEJB 3.0 コース
第 4 回2006 年 8 月 4 日
2
ここでの目標 Stateless Session Bean の概要を理解す
る。
3
Stateless Session Beans
4
Session Beans (1) クライアントが必要に応じて呼び出す処
理をまとめたもの クライアントの特定のセッションに対応 セッション開始と同時に生成され、セッ
ション終了時に消滅
5
Session Beans (2) Stateless Session Beans
インスタンスに固有のフィールドがないため内部状態を持たず、ユーティリティクラスのように振る舞う
Stateful Session Beans 内部状態を持っている
6
サンプルアプリケーション Hello サンプルアプリケーション Java EE サーバ側 (EJB)
Hello.java HelloImpl.java
クライアント側 HelloClient.java
7
インタフェースの作成
8
HelloWorld.java (1)
import javax.ejb.Remote;
@Remotepublic interface Hello {
public String sayHello(String name);}
9
Hello.java (2) Stateless Session Beans が公開するメ
ソッドを定義しているインタフェース 従来の EJB では、 EJB オブジェクトイン
タフェースを継承する必要があった EJB 3.0 では、 POJI + Annotation のスタ
イルとなる
10
@Remote このインタフェースは、 Remote (= 別の
マシン)で実行される可能性がある @Remote アノテーションを付加するこ
とで、この EJB の機能を別のマシンから呼びだすことができるようになる
具体的には、 RMI/IIOP が用いられる
@Remote public interface Hello {…}
11
@Local 同一の Java Virtual Machine からしか動
かさない場合、 @Local アノテーションを付加する
@Local public interface Hello {…}
12
@Remoteと@Local 何もアノテーションを付けなかった場合、
@Local を付けるのと同じことになる
public interface Hello {…}
13
Stateless Session Beansの作成
14
HelloImpl.java (1)import javax.ejb.Stateless;
@Statelesspublic class HelloImpl implements Hello {
public String sayHello(String name) {return "Hello, " + name + "!";
}}
15
HelloImpl.java (2)@Stateless Stateless Session Bean 本体 Stateless Session Bean であることを示
すために、 @Stateless アノテーションを付加する
16
HelloImpl.java (3) 従来の EJB では
SessionBean インタフェースを実装 ejbCreate, ejbRemove メソッドなどを用意
EJB 3.0 では、 Hello インタフェースを実装した POJO になっている
17
クライアントプログラム (1)JNDI の利用
18
考え方 クライアントプログラムから Hello イン
タフェースを呼び出す必要がある。 でも、どうやって?
19
HelloClient.java
Context context = new InitialContext();hello = (Hello)context.lookup("Hello");String message =
hello.sayHello(args[0]);System.out.println(message);
20
JNDI Java で ディレクトリサービス (LDAP な
ど ) にアクセスするための API 抽象的な「名前」をキーにしてオブジェ
クトを取得できる。 JDBC, EJB, JavaMail などでよく利用され
る。
21
JNDI からHello オブジェクトを取得
// Context ( ディレクトリ )// InitailContext ( ルート )Context context = new InitialContext();// 名前に対応する Hello を取得// 利用できる名前は次のコマンドで調べる// asadmin list-jndi-entrieshello = (Hello)context.lookup("Hello");
22
メソッドの実行
hello.sayHello(args[0]);
23
サンプルアプリケーションの実行 (1)
24
サンプルアプリケーションの実行 (1) 環境変数の設定
GlassFish のインストール先 → JAVAEE_HOME %JAVAEE_HOME%¥bin に PATH を通す
GlassFish の起動 asadmin start-domain
サンプルアプリケーションのコンパイル cd hello-jndi javac -classpath %JAVAEE_HOME%¥lib¥javaee.jar *.ja
va
25
サンプルアプリケーションの実行 (2) Jar ファイルの作成と配備 ( デプロイ )
jar cvf hello.jar Hello.class HelloImpl.class copy hello.jar %JAVAEE_HOME%¥domains¥domain1
¥autodeploy クライアントプログラムの実行
java -classpath %JAVAEE_HOME%¥lib/javaee.jar;%JAVAEE_HOME%¥lib¥appserv-rt.jar;. HelloClient tomoharu
26
クライアントプログラム (2)Dependency Injection
27
考え方 JNDI を使ったクライアントでは、「名
前」をプログラムに記述していた。 「名前」はコンテナ環境に依存する Dependency Injection を使って解決した
い
28
HelloClient.java
@EJB static Hello hello;public static void main(String[] args) {
String message =hello.sayHello(args[0]);
System.out.println(message);}
29
@EJB 該当する EJB を注入する Annotation
@EJB static Hello hello;
コンテナに依存する情報がソースコードから消えた
実行するにはクライアントコンテナが必要になる (DI を実行するため )
30
サンプルアプリケーションの実行 (2)
31
クライアントの実行
appclient HelloClient tomoharu
appclient コマンドは、クライアントコンテナを起動してアプリケーションを実行するためのコマンド このコマンドによって、 @EJB への依存性注
入が行われる
32
課題
33
課題 ドル建ての金額を引数に与えたら、円に
換算して出力するような dollarToYen メソッドを持つ Stateless Session Bean をつくる。
34
課題のクライアントプログラム例
@EJB static Converter converter;BigDecimal dollar =
new BigDecimal(25);BigDecimal yen =
converter.dollarToYen(dollar);System.out.println(yen);