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
© Copyright 2026 ExpyDoc