Stateless Session Beans

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