📄 3.html
字号:
这个技术实现了JNDI底层的与客户无关性。客户只需要使用JNDI的API就可以了。</p>
<p><br>
五、EJB到CORBA的映射:</p>
<p> EJB和CORBA之间有许多的联系。有三点很重要:</p>
<p> 用ORB实现EJB容器/服务。</p>
<p><br>
将原有系统放到EJB中间层的综合能力。</p>
<p><br>
从非java组件的客户,访问EJB的能力。</p>
<p><br>
EJB规范目前只涉及到这三个方面。</p>
<p> CORBA是实现EJB下层组织的很适合而且很自然的平台。CORBA提供了所有的EJB规范与CORBA核心规范或者与CORBA核心服务之间的相关的东西。</p>
<p>持分布式:CORBA核心和CORBA命名服务</p>
<p><br>
支持事务:CORBA对象的事务服务</p>
<p><br>
支持安全:CORBA的安全规范,包括IIOP-over-SSL</p>
<p><br>
另外:CORBA允许非JAVA组件与应用程序的结合。这些组件可以是原来的系统或程序,将它们插入到不同的客户中去。后端系统能够很容易的用OTS和任何能够与IDL映射的程序设计语言结合在一起。这需要容器提供OTS和IIOP的APIs。</p>
<p><br>
EJB规范允许非JAVA客户访问enterprise bean,也提供了EJB到CORBA的映射。EJB/CORBA映射的目的是:</p>
<p> 支持用任何CORBA支持的程序设计语言编写的客户端和基于CORBA的EJB服务上的enterprise
bean的结合。</p>
<p><br>
使客户程序在相同的事务处理中与CORBA对象或者enterprise
bean相结合。</p>
<p><br>
支持在涉及到不同代理商提供的多个客户端在基于CORBA的EJB服务器上运行时的分布式事务。</p>
<p><br>
映射是基于java-to-IDL映射的。其规范包括了如下几个方面:分布式关系的映射,命名约定的映射,事务处理的映射,安全的映射。下面的部分,我们将解释每一个映射。因为映射用了新的IDL特性,这些特性在OMG的Object-by-Value规范中介绍。与其它语言的结合需要与CORBA2.3ORB规范兼容。</p>
<p><br>
分布式的映射:</p>
<p> enterprise bean有两个可以远程访问的接口:remote接口和home接口。IDL规范中有这样的JAVA/IDL到这些接口的映射。EJB规范中定义的基类也是以同样的方式映射到IDL中的。</p>
<p> 例如:让我们看看下面的IDL接口,这是ATM那个例子。是一个enterprise
会话bean。有一个方法在accounts之间转帐。也可以抛出资金不足的异常。通过JAVA/IDL映射其home接口和remote接口。我们得到如下的IDL接口:</p>
<p><br>
Module transaction{</p>
<p>Module ejb{</p>
<p>Valuetype InsufficientFundsException: ::java::lang::Exception{};</p>
<p><br>
Exception InsufficientFundsEx{</p>
<p>::transcation::ejb::InsufficientFundsException value;</p>
<p>};</p>
<p><br>
interface Atm: ::javax::ejb::EJBObject{</p>
<p>void transfer(in string arg[], in string arg1, in float arg2)</p>
<p>raise(::transaction::ejb::InsufficientFundsEx);</p>
<p>};</p>
<p><br>
interface AtmHome: ::javax.:ejb::EJBHome{</p>
<p>::transaction::ejb::Atm create{}</p>
<p>raise(::javax::ejb::CreateEx);</p>
<p>};</p>
<p>};</p>
<p>};</p>
<p><br>
命名映射:</p>
<p> 基于CORBA的EJB运行时环境如果要想让所有的CORBA客户都能够访问enterprise
bean,就必须使用CORBA命名服务来发布enterprise bean的home接口。运行时能够直接使用CORBA的命名服务,或者通过JNDI及其到CORBA命名服务的标准映射来间接的使用。</p>
<p> JNDI命名用一个字符串表示成如下形式:“directory1/directory2/…/directotyN/objectName”。CORBA的命名服务将名字定义成一系列的名字组件:</p>
<p>Typedef string Istring;</p>
<p>Struct NameComponet{</p>
<p>Istring id;</p>
<p>Istring kind;</p>
<p>};</p>
<p>typedef sequence <NameCompoent> Name;</p>
<p> 每一个由”/”分开的JNDI字符串名字都被映射成一个名字组件。最左边的组件就是CORBA命名服务名字的第一个入口。</p>
<p>JNDI字符串名字与一些命名上下文有关。我们把这样的上下文叫做JNDI根部上下文。JNDI根部上下文相当于CORBA的命名服务的初始化上下文。CORBA命名服务的名字与CORBA的初始化上下文有关。</p>
<p>通过在ORB的虚拟对象上面调用resolv_initial_reference(“NameService”),CORBA应用程序能够得到初始的CORBA命名服务的上下文。CORBA命名服务并没有指定如何组织命名上下文,这样,根上下文的概念就不起作用了。ORB的初始化通过resolve_initial_reference()来决定上下文。</p>
<p>例如:一个C++的客户端能够定位我们的ATM会话bean的home接口。这个ATM
bean已经用JNDI字符串“transaction/corbaEjb/atm”注册。首先,我们得到初始的命名上下文。</p>
<p>oject_ptr obj = orb->resolve_initial_references(“NameService”);</p>
<p>NameContext initialNameContext = NameingContext.narrow(obj);</p>
<p>if (initialNameingContext == NULL) {</p>
<p>cerr <<”Could not initial naming context” <<endl;</p>
<p>exit(1);</p>
<p>}</p>
<p>然后,我们产生了一个CORBA命名服务的名字并且根据上面所说的对它进行初始化。</p>
<p>Name name = new Name(1);</p>
<p>name[0].id=”atm”;</p>
<p>name[0].kind=””;</p>
<p>现在我们解决了初始化命名服务的名字问题。假定我们成功的进行了初始化,我们也有了enterprise
bean名字域上的上下文。我们将CORBA对象范围缩小到所需要的类型,并且,确信这样的缩小是成功的。</p>
<p>Object_ptr obj=initialNamingContext->resolve(name);</p>
<p>AtmSessionHome_ptr atmSessionHome = AtmSessionHome.narrow(obj);</p>
<p>if (atmSessionHome == NULL){</p>
<p>cerr<<”Could not narrow to ATMSessionHome” <<endl;</p>
<p>exit(1);</p>
<p>}</p>
<p><br>
事务处理的映射:</p>
<p>基于CORBA的enterprise bean运行时环境需要使CORBA的客户端参加到涉及enterprise
bean的事务处理中来,就必须使用CORBA的OTS(Object Transaction
Service)来进行事务控制。</p>
<p>当enterprise bean配置好之后,能够根据不同的事务服务方针进行安装。方针是定义在配置描述器中的。</p>
<p>事务性的enterprise bean有如下的定义规则:CORBA客户通过IDL接口产生的stub来调用enterprise
bean的remote接口和home接口。如果涉及到事务处理,它使用CORBA
OTS提供的接口。</p>
<p>例如:一个C++的客户能够调用ATM会话bean:</p>
<p>try{</p>
<p>…</p>
<p>//obtain transaction current</p>
<p>Object_ptr obj = orb->resolve_initial_reference(“Current”);</p>
<p>Current current = Current.narrow(obj);</p>
<p>if(current==NULL){</p>
<p>cerr<<”Could not resolve current ”<<endl;</p>
<p>exit(1);</p>
<p>}</p>
<p>//execute transaction</p>
<p>try{</p>
<p>current->begin();</p>
<p>atmSession->transfer(“checking”,”saving”,100.00);</p>
<p>current->commit(0);</p>
<p>}catch(…){</p>
<p>current->rollback();</p>
<p>}</p>
<p>}catch(…){</p>
<p>……</p>
<p>}</p>
<p><br>
安全的映射:</p>
<p>EJB规范的安全方面主要考虑的是控制enterprise bean的访问权限。CORBA规定了一些方法来定义标识符,包括如下的方面:</p>
<p>Plain IIOP(简单的IIOP方式):CORBA的主要接口在1998年早期并没有被接受。主要的接口用来确定客户的标识。但是,CORBA安全服务的作者却实现了不同的途径:GIOP。GIOP规范包括了一个叫服务上下文的组件,其实是一个元素为值对的数组。其标识符是CORBA的long型的,值是十进制的序列。服务上下文的入口可以用来标识调用者。</p>
<p><br>
Secure IIOP(可靠的IIOP方式):CORBA的安全规范为身份定义了一个不透明的数据类型。身份的实际类型是由所选择的安全机制所决定的。例如:GSS
Kerberos,SPKM,或者CSI-ECMA。</p>
<p><br>
IIOP over SSL:SSL(加密套接字协议层)用X.509来来证明服务器或者是客户的身份。当服务器需要客户的身份验证的时候,服务器使用这个证书作为客户的身份验证。<br>
</p>
</td>
</tr>
</td>
</tr>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -