ステートレスセッション bean は、単一メソッド呼び出しの範囲内でビジネスロジックを管理します。各呼び出し間のステートは維持しません。ステートレスセッション bean の連続的な呼び出しは、bean のインスタンスプールからの個別のインスタンスによって処理できます。
ステートレスセッション bean のホームインターフェイスは、リモートまたはローカルのホームインターフェイスを返す create
メソッドを定義します。create
メソッドにはパラメータがなく、RemoteException
(リモートホームインターフェイスのみ) および CreateException
を返します。
次のコードは、ステートレスセッション bean のホームインターフェイスを示しています。
import java.rmi.*;
import javax.ejb.*; public interface SimpleHome extends EJBHome { // create メソッドは、Simple を返します。 public Simple create() throws RemoteException, CreateException; }
ステートレスセッション bean のコンポーネントインターフェイスは、クライアントから呼び出されるビジネスメソッドを定義します。リモートコンポーネントインターフェイスで定義されるメソッドの場合、常に RemoteException
を返す必要があり、また、すべてのコンポーネントインターフェイスのメソッドが、bean 実装内の対応するビジネスメソッドから返された例外を返す必要があります。
次のコードは、ステートレスセッション bean のリモートコンポーネントインターフェイスを示しています。
import java.rmi.*;
import javax.ejb.*; public interface Simple extends EJBObject { public String getMessage() throws RemoteException; }
ステートレスセッション bean の bean 実装には、setSessionContext
、必要なコールバックメソッド、およびビジネスメソッドが含まれます。リモート bean のメソッドはすべて RemoteException
を投げる必要があり、ejbCreate
メソッドはRemoteException
および CreateException
を投げる必要があります。
次のコードは、ステートレスセッション bean の bean 実装を示しています。
import java.rmi.*;
import javax.ejb.*; public class SimpleBean implements SessionBean { private SessionContext context; // これはビジネスメソッドです。 public String getMessage() throws RemoteException { String thisMessage = "Habari Yako"; return thisMessage; } // 次はコールバックメソッドで、 // SessionBean インターフェイスにあります。 public void ejbCreate() throws RemoteException, CreateException { } public void ejbRemove() throws RemoteException { } public void ejbActivate() throws RemoteException { } public void ejbPassivate() throws RemoteException { } // コンテキスト変数を設定します。 public void setSessionContext(SessionContext context) throws RemoteException { this.context = context; } }
ステートレスセッション bean の基本的なデプロイメントディスクリプタには、session
要素内に要素が含まれます。後で、アプリケーションアセンブラにより、assembly-descriptor
要素内に追加仕様が作成されます。
次のサンプルは、ステートレスセッション bean の基本的なデプロイメントディスクリプタの要素を示しています。
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ ejb-jar_2_0.dtd"> <ejb-jar> <description>EJB の簡単なテスト</description> <enterprise-beans> <session> <display-name>Simple</display-name> <ejb-name>Simple</ejb-name> <home>SimpleHome</home> <remote>Simple</remote> <ejb-class>SimpleBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> </assembly-descriptor> </ejb-jar>
メモ: デプロイメントディスクリプタは、既存のものをコピーするか、直接コーディングするか、XDoclet サービスを使用するか、またはエンタープライズデプロイウィザードを使用して生成できます。
jrun-ejb-jar.xml ファイルには、JRun 特有のデプロイ設定が含まれます。詳細については、『JRun アセンブルとデプロイガイド』を参照してください。
次のサンプルは、ステートレスセッション bean の JRun EJB デプロイメントディスクリプタを示しています。
<?xml version="1.0"?>
<!DOCTYPE jrun-ejb-jar PUBLIC '-//Macromedia, Inc.//DTD jrun-ejb-jar 4.0//EN' 'http://jrun.macromedia.com/dtds/jrun-ejb-jar.dtd'> <jrun-ejb-jar> <enterprise-beans> <session> <ejb-name>Simple</ejb-name> <jndi-name>Simple</jndi-name> </session> </enterprise-beans> </jrun-ejb-jar>
次のサーブレット例は、ステートレスセッション bean へのリモートクライアントアクセスを示しています。
import javax.servlet.*;
import javax.servlet.http.*; import java.io.*; import java.rmi.*; import java.rmi.*; import java.util.*; import javax.naming.*; import javax.ejb.*; ... try { // 1: コンテキストを取得します。 Properties props = new Properties(); props.put(Context.INITIAL_CONTEXT_FACTORY, "jrun.naming.JRunContextFactory"); props.put(Context.PROVIDER_URL, "remoteservername:2918"); Context ctx = new InitialContext(props); // ローカルクライアントは、空の InitialContext を使用できます。 // Context ctx = new InitialContext(); out.println("<br>新規 Context の取得"); // 2: 特定の EJBHome を検索して絞り込み、キャストします。 out.println("<br>Simple の作成"); Object o = ctx.lookup("Simple"); SimpleHome home = (SimpleHome) PortableRemoteObject.narrow(o, SimpleHome.class); // 3: 特定の EJBObject を作成します。 Simple test = home.create(); if (test != null) out.println("<br>リモート EJBObject の完成"); else out.println("<br>返された null の作成"); // 4: EJB でメソッドを実行します。 String s = test.getMessage(); out.println("<br>EJB メッセージ:" + s); } // try を終了 catch (Exception e) { out.println("<br>" + e); e.printStackTrace(); } // catch を終了 ...