`
ihuashao
  • 浏览: 4874375 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

websphere ejb 远程/本地调用总结

阅读更多


1:本地调用
前提:
(1)被调用者实现了LOCAL接口
(2)调用者和被调用者应该在同一EJB模块打包文件(ear)內,由于是本地调用,也就是说调用者和被调用者应运行于同一个ejb容器内,所以,想用类似main函数调用的企图都是不能成功的(因为main函数不可能运行于ejb容器)。
(3)调用者的部署描述(ejb-jar.xml)中有关于被调用者的Local ref的描述。

示例如下:

比如我有一个无状态sessionBean(被访问者):MapSessionBean,一个访问用的sessionBean:AccessBean

其中AccessBean的ejb-jar.xml应有被调用者的Local ref描述,否则,不能进行本地调用:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEejb-jarPUBLIC"-//SunMicrosystems,Inc.//DTDEnterpriseJavaBeans2.0//EN""http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jarid="ejb-jar_ID">
<display-name>TestEJB</display-name>
<enterprise-beans>
<sessionid="MapSession">
<ejb-name>MapSession</ejb-name>
<home>co.test.bean.MapSessionHome</home>
<remote>co.test.bean.MapSession</remote>
<local-home>co.test.bean.MapSessionLocalHome</local-home>
<local>co.test.bean.MapSessionLocal</local>
<ejb-class>co.test.bean.MapSessionBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-local-refid="EJBLocalRef_1165387097531">
<ejb-ref-name>ejb/MapSession</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>co.test.bean.MapSessionLocalHome</local-home>
<local>co.test.bean.MapSessionLocal</local>
<ejb-link>MapSession</ejb-link>
</ejb-local-ref>
</session>
<sessionid="AccessBean">
<ejb-name>AccessBean</ejb-name>
<home>co.test.bean.AccessBeanHome</home>
<remote>co.test.bean.AccessBean</remote>
<local-home>co.test.bean.AccessBeanLocalHome</local-home>
<local>co.test.bean.AccessBeanLocal</local>
<ejb-class>co.test.bean.AccessBeanBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-local-refid="EJBLocalRef_1165393609046">
<ejb-ref-name>ejb/MapSession</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>co.test.bean.MapSessionLocalHome</local-home>
<local>co.test.bean.MapSessionLocal</local>
<ejb-link>MapSession</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
</ejb-jar>

本地调用代码如下:

publicvoidinvoke()
...{
MapSessionLocalHomemapSessionLocalHome
=null;
MapSessionLocalmapSessionLocal
=null;
InitialContextinitContext
=null;
finalStringJNDIName="java:comp/env/ejb/MapSession";
try...{
System.out.println(
"ininvoke()!!!!!!!");
initContext
=newInitialContext();
Objectobj
=initContext.lookup(JNDIName);
mapSessionLocalHome
=(MapSessionLocalHome)obj;
mapSessionLocal
=mapSessionLocalHome.create();
Personperson
=newPerson("lcl",555);
mapSessionLocal.setMapValue(
"key1",person);

PersontempPerson
=(Person)mapSessionLocal.getMapValue("key1");
tempPerson.setName(
"wangwu");
tempPerson.setAge(
88);
PersonchangedPerson
=(Person)mapSessionLocal.getMapValue("key1");
System.out.println(
"afterchanged:"+changedPerson.getName()+"---"+changedPerson.getAge());

}

catch(Exceptione)
...{
e.printStackTrace();
}


}

值得一提的是,在本地调用中,对一个object的操作,是在同一内存块中进行的。具体到上面的代码,tempPerson的改变,已经影响到了changedPerson的值。

2:远程方法调用:
前提:被调用者实现了REMOTE接口,适用于不在同一模块中的ejb,servlet.

publicstaticvoidmain(String[]args)
...{

MapSessionHomemapSessionHome
=null;
MapSessionmapSession
=null;
InitialContextinitContext
=null;

finalStringJNDIName="ejb/co/test/bean/MapSessionHome";
try...{
System.out.println(
"inMapSessionClient!!!!!!!");
initContext
=newInitialContext();
Objectobj
=initContext.lookup(JNDIName);

mapSessionHome
=
(MapSessionHome)PortableRemoteObject.narrow(
obj,
MapSessionHome.
class);
mapSession
=mapSessionHome.create();
Personperson1
=newPerson("zhangsan",100);

mapSession.setMapValue(
"key1",person1);
PersontempPerson
=(Person)mapSession.getMapValue("key1");

tempPerson.setName(
"lisi");
tempPerson.setAge(
500);
System.out.println(
"beforechanged:"+tempPerson.getName()+"---"+tempPerson.getAge());

PersonchangedPerson
=(Person)mapSession.getMapValue("key1");
System.out.println(
"afterchanged:"+changedPerson.getName()+"---"+changedPerson.getAge());

}
catch(Exceptione)...{
e.printStackTrace();
System.exit(
0);
}

}

值得一提的是,在远程调用中,对一个object的操作,经过了corba处理,是不在同一内存块中进行的。具体到上面的代码,tempPerson的改变,不影响changedPerson的值(其实理所当然,一个是远程的对象,你个是本地内存对象)。

3:远程调用:适用于不在同一机器的远程调用:
对于websphere:

InitialFactory:(INITIAL_CONTEXT_FACTORY):com.ibm.websphere.naming.WsnInitialContextFactory
ProviderURL:(PROVIDER_URL):iiop://serverip:
2809/

其中:server ip为ejb容器ip地址.必须注意:在websphere服务器的配置中,有一项orb bootstrap setting的配置,它的默认配置如下:
Port:2809
hostname:localhost
其中,hostname必须改为server的ip地址,
hostname:192.168.0.81
否则,远程调用不能成功.
调用代码如下:

publicstaticvoidmain(String[]args)
...{
System.out.println(
"inMapSessionRemoteTest");
MapSessionHomemapSessionHome
=null;
MapSessionmapSession
=null;
StringJNDIName
="ejb/co/test/bean/MapSessionHome";
Propertiesp
=newProperties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
p.put(Context.PROVIDER_URL,
"iiop://192.168.0.81:2809/");
InitialContextinitContext;
try
...{
initContext
=newInitialContext(p);
Objectobj
=initContext.lookup(JNDIName);
mapSessionHome
=(MapSessionHome)PortableRemoteObject.narrow(
obj,
MapSessionHome.
class);
mapSession
=mapSessionHome.create();
Personperson1
=newPerson("zhangsan",100);
mapSession.setMapValue(
"key1",person1);
PersontempPerson
=(Person)mapSession.getMapValue("key1");
tempPerson.setName(
"lisi");
tempPerson.setAge(
500);
System.out.println(
"beforechanged:"+tempPerson.getName()+"---"+tempPerson.getAge());
PersonchangedPerson
=(Person)mapSession.getMapValue("key1");
System.out.println(
"afterchanged:"+changedPerson.getName()+"---"+changedPerson.getAge());
}

catch(Exceptione)
...{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}


}


分享到:
评论

相关推荐

    websphere,ejb教程

    你还将学习EJB的生命周期管理、事务处理、安全性、远程方法调用和容器服务等内容。 **Mybatis+Spring整合** Mybatis是一个轻量级的持久层框架,它简化了数据库操作。而Spring框架则是一个全面的Java企业应用解决...

    \websphere部署EJB3.docx

    6. **跨容器调用远程EJB**: 如果EJB在不同的容器中,可以通过JNDI查找来访问。设置环境属性,包括`INITIAL_CONTEXT_FACTORY`、`PROVIDER_URL`和`URL_PKG_PREFIXES`,然后创建`InitialContext`实例,通过`lookup`...

    EJB 基于Java的远程方法调用(RMI)技术

    ### EJB 基于Java的远程方法调用(RMI)技术 #### 一、EJB概述 **Enterprise JavaBeans (EJB)** 是一种基于Java的...此外,通过RMI技术的支持,EJB能够实现高效的远程调用,使得跨系统的组件交互变得更加简单高效。

    ejb调用详解

    本文将深入探讨如何在WebSphere环境中远程调用EJB组件,同时介绍ejb3.0版本的一些关键特性,以及 ejb 开发实例和相关框架。 **一、EJB 3.0简介** EJB 3.0是EJB规范的一个重大改革,引入了更加轻量级和简化的设计,...

    WebSphere环境下EJB编程

    - 接口分为了远程接口(Remote Interface)和本地接口(Local Interface),远程接口允许远程客户端调用,本地接口则只允许在同一JVM内的组件调用。 5. **EJB与WebSphere的集成** - WebSphere支持EJB 3.x及更高...

    websphere6 ejb2.0

    客户端可以通过远程接口(RMI或JNDI)或者本地接口来调用EJB方法。WebSphere提供了一套完整的API和服务来支持这些调用,确保了跨网络的透明性和性能。 9. **安全性**: WebSphere 6支持EJB的安全特性,如角色基础...

    ejb教程第4版

    5. **客户端调用**:Websphere提供了多种方式调用EJB,包括远程接口调用(Remote EJB)和本地接口调用(Local EJB)。远程接口允许跨网络调用,而本地接口适用于在同一JVM内的调用。开发者需要在客户端代码中创建EJB...

    EJB原理剖析电子书

    1. **客户端发起请求**:客户端通过调用本地Stub上的方法来发起远程调用。 2. **Stub处理请求**:Stub捕获调用并转换为网络消息,通过网络将消息发送到远程服务器。 3. **Skeleton接收请求**:远程服务器上的...

    EJB2.0开发.rar_EJB2.0 pdf_ejb_ejb 2_ejb2.0_websphere

    - **Local接口**(EJB 2.1新增):仅在服务器内部使用的接口,无需远程通信,提高了性能。 - **生命周期方法**:包括 ejbCreate(), ejbActivate(), ejbPassivate(), ejbRemove() 等,用于管理Bean的生命周期。 3....

    ejb原理详细说明,一个很容易理解的例子

    1. **定义远程接口**:定义一个实现了`EJBObject`接口的接口,该接口声明了客户端可以远程调用的方法。 ```java public interface AddCount extends EJBObject { public int addCount(int a, int b) throws ...

    EJB工作原理

    - 客户端创建`Person_Stub`对象,作为远程调用的代理,它通过Socket与服务端的`Person_Skeleton`对象进行通信。 - `Person_Stub`通过Socket向服务端发送方法名和参数。 - 服务端接收到请求后,由`Person_Skeleton...

    EJB3最新总结

    3. **客户端访问**:通过远程接口调用 EJB 的方法。 #### 八、总结 EJB3.0 通过引入 POJO 支持、简化 API 和增强性能等方面的重大改进,成为构建企业级应用程序的强大工具。对于需要高性能、可伸缩性和易于维护的...

    EJB方面介绍

    EJB基于Java远程方法调用(RMI)技术,可以跨进程甚至跨计算机访问。EJB必须部署在专门的容器(如IBM WebSphere、Oracle WebLogic等)中,客户端通过容器间接访问EJB组件。EJB容器负责管理EJB组件的生命周期,并提供...

    ejb2的资料,作者雨夜。

    远程调用是通过RMI-JRMP协议进行的,对于非Java客户端,如C++,则使用Corba的IIOP协议。 创建一个EJB需要完成以下步骤: 1. **定义远程接口(Remote Interface)**:继承自EJBObject,它定义了客户端可以调用的...

    Java EJB 经典面试题 面试时被问过几个

    而EJB则是Java的分布式组件,基于RMI实现远程方法调用,可以跨进程、跨计算机访问。EJB必须部署在应用服务器中,如Websphere、WebLogic,客户端通过容器间接访问EJB组件,而不是直接与组件交互。 96、EJB实现的技术...

    WebSphere下的所有jar文件名和路径

    12. **rmic.jar**:位于相同的目录下,是Java远程方法调用(RMI)的编译器,用于生成RMI所需的存根和骨架代码。 以上列举的JAR文件仅仅是WebSphere庞大生态系统中的一部分,但它们各自扮演着关键角色,共同支撑起...

    EJB工作原理学习笔记.pdf

    远程方法调用(RMI)是EJB的基础之一。RMI使得在一个Java虚拟机(JVM)上的对象能够调用另一个JVM上的对象的方法,就好像它们在同一个JVM中一样。这种机制是EJB实现分布式计算的关键。 **1. RMI的核心概念** - **...

    EJB初学者常有的十一个疑惑

    - 必须部署在特定的容器(如WebSphere、WebLogic等)中,由容器负责创建和管理EJB组件。 - 客户端通过容器间接访问EJB组件,容器充当了EJB组件的代理。 - **用途**:处理复杂的业务逻辑、事务管理和安全性等。 ##...

Global site tag (gtag.js) - Google Analytics