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