FROM:
关于Java Socket编程的详细介绍
-------------------------------------------------------------------------------
FROM:EJB2.0
远程接口&本地接口
FROM:http://www.blogjava.net/relax/archive/2005/12/02/22267.html
EJB remote interface(javax.ejb.EJBObject)和remote home interface(javax.ejb.EJBHome)在本质上是Java RMI接口。远程客户端运用接口和与Java RMI-IIOP兼容的参数与EJBs通讯。参数和方法的结果值在同一个容器中传递,或者跨网络传递到远程容器。
相反,EJB local interface(javax.ejb.EJBLocalObject)和local home interface(javax.ejb.EJBLocalHome)不是Java RMI接口,它们是EJB 2.0的新功能。本地客户端——如其它EJBs,运用相同JVM中传递的参数直接与EJBs通讯。这种技术消除了网络潜在的问题、参数复制的问题以及需要与Java RMI-IIOP兼容的问题。
也意味着,EJB客户端可以运用一个更轻量级的编程模式来访问服务。该方法很适合细粒度的(fine-grained)方法调用,因为作为EJB实例的位于同一个JVM中的EJB客户端可以用本地接口来避免不必要的费用。(网络传输)
引进本地客户端产生的另一个显著的变化就是类型的转换。
当ejb的服务端和客户端在一个JVM的时候,为了提高jndi查询效率,并且提高方法调用效率,本地调用可以不走TCP/IP ,这样可以明显提高调用的效率。
所有的EJB实例在运用前必须转换到它们恰当的接口类型,所以,有时侯,在运用远程客户端时,要保证Java RMI-IIOP的兼容性,你必须在转换EJB实例前运用java.rmi.PortableRemoteObject.narrow()来缩小(narrow)它。
但本地客户端可以直接把EJB实例转换成local home interface类型,如下面的代码片段:
InitialContext initCtx = new
InitialContext();
ExampleLocalHome exampleLocalHome =
(ExampleLocalHome)initCtx.lookup("java:comp/
env/ejb/Example"); |
从local home创建了EJB实例:
ExampleLocal exampleLocal = exampleLocalHome.create(); |
<ejb-jar> <enterprise-beans> <session> <ejb-name>...</ejb-name> <local-home>...</local-home> <local>...</local> <ejb-link>...</ejb-link> ... </session> </enterprise-beans> <assembly-descriptor> ... </assembly-descriptor> </ejb-jar>
远程调用:
*以下方法是作用是:通过传递环境属性选择JNDI驱动和服务器的网络位置,
并连接到JNDI树。
这是采用weblogic做EJB容器时,远程调用EJB的固定初始化模式
*/
private InitialContext getInitialContext() throws Exception {
//EJB容器的地址
String url = "t3://image:7001";
String user = null;
String password = null;
Properties properties;
properties = new Properties();//
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, url);
if (user != null) {
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS,
password == null ? "" : password);
}
return new javax.naming.InitialContext(properties);
}
}
Object obj=ctx.lookup("SayHello");
//获得远程EJB组件的home接口的引用
testhello.SayHelloHome home=(testhello.SayHelloHome)PortableRemoteObject.narrow (obj,testhello.SayHelloHome.class);
//获得远程EJB组件的remote接口的引用
testhello.SayHello hello=home.create();
String name="test";
String sayString=hello.sayHello(name);//执行
使用本地接口:http://8366.iteye.com/blog/555828
问题: