トップ 一覧 置換 検索 ヘルプ RSS ログイン

EJBの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!概要
http://www.ibm.com/developerworks/jp/websphere/library/java/ejb_intro/1.html
http://d.hatena.ne.jp/shammer/20110518/1305733286
http://wadahiro.hatenablog.com/entry/20091227/1261917368
http://wadahiro.hatenablog.com/entry/20091226/1261824832
http://kagamihoge.hatenablog.com/entry/20120304/1330829372
https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB


!!仕組み
{{img  1_4.gif}}

!!エンタープライズ Beanの種類
{{img  1_3.gif}}

!!!Homeインターフェイスとリモートインターフェイスの命名規則
:エンタープライズBean:XXXBean.java(.class)
:Homeインターフェース:XXXHome.java(.class)
:Remoteインターフェース:XXX.java(.class)

!!!ローカルインターフェイス
!!注意
http://otndnld.oracle.co.jp/document/products/ds10g/101202/doc_cd/web/B15634-02/access.html#502316
http://www.ibm.com/developerworks/jp/websphere/library/java/j2ee_classloader/1.html
+ローカルインターフェイスは、同一のearファイル内で呼び出しができる。
+同一のearファイルなら、含まれるwarファイル(アプリケーション)が別でも呼び出しできる。
+EJBは、複数のEARファイル間、異なるEARファイルにデプロイされたアプリケーション間で通信を行うことはできない。あるEJBが、異なるEARファイルにデプロイされているEJBにアクセスする唯一の方法は、EJBをクライアントの親として宣言することです。子のみが親の中でメソッドを起動できます。
+クラスローダはearファイル毎に異なっている(場合によってはwarファイル毎にも異なる)
+クラスローダはearファイル毎のlibをロードしたクラスローダを親として、warファイルをロードする
+ローカルインターフェイスは ear内のlibに置く設計にする


!!サンプル
!LocalCall
{{code Java,
package test;

import javax.ejb.Local;
import javax.ejb.Remote;

@Local
public interface LocalCall {
	 public void sayHello();
	 public void sayHello(String msg);
}
}}

!LocalCallBean
{{code Java,
package test;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
* Session Bean implementation class LocalCall
*/
@Stateless
public class LocalCallBean implements LocalCall {
  
  /**
  * Default constructor. 
  */
  public LocalCallBean() {
    // TODO Auto-generated constructor stub
  }
  
  public void sayHello()
  {
    System.out.println("Hello, EJB 3.0. Local!!!!");
  }
  
  public void sayHello(String msg)
  {
    System.out.println("Hello, EJB 3.0. Local!!!! " + msg);
  }
  
}
}}

!呼び出し
基本的には @EJBアノテーションだけでいい。
別な呼び方として、
 InitialContext ctx = new InitialContext();
 LocalCall bean = (LocalCall) (ctx.lookup("java:global/test/ServletTest/LocalCallBean!test.LocalCall"));
なこともできる。

{{code Java,
package test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class LocalCall
*/
@WebServlet("/LocalCall")
public class LocalCallTest extends HttpServlet {
  @EJB
  LocalCall localBean;
  
  private static final long serialVersionUID = 1L;
  
  /**
  * @see HttpServlet#HttpServlet()
  */
  public LocalCallTest() {
    super();
    // TODO Auto-generated constructor stub
  }
  
  /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    localBean.sayHello("local Call test");
    
    try {
      InitialContext ctx = new InitialContext();
      //LocalCall bean = (LocalCall) (ctx.lookup("java:global/ServletTest/LocalCallBean!test.LocalCall"));
      LocalCall bean = (LocalCall) (ctx.lookup("java:global/test/ServletTest/LocalCallBean!test.LocalCall"));
      System.out.println(bean);
      bean.sayHello("local Call test 2");
    } catch (Exception e){
      e.printStackTrace();
    }
  }
  
  /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
  }
  
}
}}

!!注意
もし、インジェクションの候補が複数見つかった場合はエラーになるので注意。
例えば、
 @Stateless
 public class LocalCallBean implements LocalCall {
 
 @Stateless
 public class LocalCall2Bean implements LocalCall {
が存在する場合、
 @EJB
 LocalCall localBean;
はLocalCallBeanとLocalCall2Beanのどちらをインジェクションしてよいか不明になるのでエラーになる。


!!!リモートインターフェイス
!!サンプル
!RemoteCall
{{code Java,
package test;

import javax.ejb.Remote;

@Remote
public interface RemoteCall {
	 public void sayHello();
}
}}

!RemoteCallBean
{{code Java,
package test;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
* Session Bean implementation class RemoteCall
*/
@Stateless
public class RemoteCallBean implements RemoteCall {
  
  /**
  * Default constructor. 
  */
  public RemoteCallBean() {
    // TODO Auto-generated constructor stub
  }
  
  public void sayHello()
  {
    System.out.println("Hello, EJB 3.0.");
  }
  
}
}}

!クライアント(呼び出しプログラム)【サーバがglassfhishの場合】
glassfishの場合は実行時に、gf-client.jarにクラスパスを通すこと。
 java -cp  ../build/classes:/home/centos/glassfish-4.0/glassfish/lib/gf-client.jar:/home/centos/glassfish-4.0/glassfish/modules/glassfish-naming.jar:/home/centos/temp/jboss-as-7.1.1.Final/modules/javax/ejb/api/main/jboss-ejb-api_3.1_spec-1.0.1.Final.jar test.RemoteRun 

{{code Java,
package test;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;

public class RemoteRun 
{
 
  public static void main(String[]args)throws Exception
  {
    Properties props=new Properties();  
    props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
    props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
    props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
    props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");//ur server ip  
    props.setProperty("org.omg.CORBA.ORBInitialPort","3700"); //default is 3700  
    
    InitialContext ctx = new InitialContext(props);
    RemoteCall bean = (RemoteCall) ctx.lookup("test.RemoteCall");
        
    bean.sayHello();
  }
}
}}

!クライアント(呼び出しプログラム)【サーバがjbossの場合】
jbossの場合は実行時に、jboss-client.jarにクラスパスを通すこと。
 java -cp  ../build/classes:/home/centos/temp/jboss-as-7.1.1.Final/modules/javax/ejb/api/main/jboss-ejb-api_3.1_spec-1.0.1.Final.jar:/home/centos/temp/jboss-as-7.1.1.Final/bin/client/jboss-client.jar test.RemoteRun

{{code Java,
package test;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class RemoteRun 
{
 
  public static void main(String[]args)throws Exception
  {
 
    Properties props=new Properties();  
    props.setProperty("java.naming.factory.initial","org.jboss.naming.remote.client.InitialContextFactory");
    props.setProperty("java.naming.provider.url", "remote://localhost:4447");
    props.setProperty("java.naming.factory.url.pkgs", "org.jboss.ejb.client.naming");
    props.setProperty("java.naming.security.principal", "remote");
    props.setProperty("java.naming.security.credentials", "password");
    props.put("jboss.naming.client.ejb.context", true);
    
    InitialContext ctx = new InitialContext(props);
    RemoteCall bean = (RemoteCall) (ctx.lookup("ejb:/ServletTest/RemoteCallBean!test.RemoteCall"));
    // ステイトフルの場合は ejb:/ServletTest/RemoteCallBean!test.RemoteCall?stateful とする
    
    bean.sayHello();
    
  }
}
}}


{{category2 プログラミング言語,Java}}