!!!概要 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}}