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 2024 ExpyDoc