トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF 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


 仕組み


 エンタープライズ Beanの種類


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

  1. ローカルインターフェイスは、同一のearファイル内で呼び出しができる。
  2. 同一のearファイルなら、含まれるwarファイル(アプリケーション)が別でも呼び出しできる。
  3. EJBは、複数のEARファイル間、異なるEARファイルにデプロイされたアプリケーション間で通信を行うことはできない。あるEJBが、異なるEARファイルにデプロイされているEJBにアクセスする唯一の方法は、EJBをクライアントの親として宣言することです。子のみが親の中でメソッドを起動できます。
  4. クラスローダはearファイル毎に異なっている(場合によってはwarファイル毎にも異なる)
  5. クラスローダはearファイル毎のlibをロードしたクラスローダを親として、warファイルをロードする
  6. ローカルインターフェイスは ear内のlibに置く設計にする


 サンプル

LocalCall

1
2
3
4
5
6
7
8
9
10
package test;

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

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

LocalCallBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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"));

なこともできる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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

1
2
3
4
5
6
7
8
package test;

import javax.ejb.Remote;

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

RemoteCallBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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();
    
  }
}


[カテゴリ: プログラミング言語 > Java]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2016年09月23日 22時31分18秒