概要
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
- ローカルインターフェイスは、同一のearファイル内で呼び出しができる。
- 同一のearファイルなら、含まれるwarファイル(アプリケーション)が別でも呼び出しできる。
- EJBは、複数のEARファイル間、異なるEARファイルにデプロイされたアプリケーション間で通信を行うことはできない。あるEJBが、異なるEARファイルにデプロイされているEJBにアクセスする唯一の方法は、EJBをクライアントの親として宣言することです。子のみが親の中でメソッドを起動できます。
- クラスローダはearファイル毎に異なっている(場合によってはwarファイル毎にも異なる)
- クラスローダはearファイル毎のlibをロードしたクラスローダを親として、warファイルをロードする
- ローカルインターフェイスは ear内のlibに置く設計にする
サンプル
LocalCall
1 |
package test; import javax.ejb.Local; import javax.ejb.Remote; @Local public interface LocalCall { public void sayHello(); public void sayHello(String msg); } |
LocalCallBean
1 |
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 |
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 |
package test; import javax.ejb.Remote; @Remote public interface RemoteCall { public void sayHello(); } |
RemoteCallBean
1 |
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 |
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 |
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]
[通知用URL]
Tweet
最終更新時間:2016年09月23日 22時31分18秒