ステートレスセッション bean

ステートレスセッション 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 の 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;
  }
}

EJB デプロイメントディスクリプタ

ステートレスセッション 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 デプロイメントディスクリプタ

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 を終了
...