概要
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秒