5.5. 为远程 Jakarta Enterprise Beans 调用配置 IIOP
JBoss EAP 支持对 JBoss EAP 上部署的 Jakarta 企业 Bean 进行基于 CORBA/IIOP 的访问。
<iiop> 元素用于启用 IIOP、CORBA(调用 Jakarta Enterprise Beans)。此元素的存在意味着安装了 iiop-openjdk 子系统。<iiop> 元素包括以下两个属性:
-
默认启用:如果情况如此,则所有带有企业 Bean 2.x 主接口的 Jakarta Enterprise Beans 都通过 IIOP 公开。否则,必须通过jboss-ejb3.xml显式启用它们。 -
Use-qualified-name:如果为true,则 Jakarta Enterprise Beans 与其绑定至 CORBA 命名上下文,其中包含部署的应用程序和模块名称,如myear/myejbjar/MyBean。如果这是false,则默认绑定名称就是 bean 名称。
尽管 Jakarta Enterprise Beans 3 远程调用通常不需要 RemoteHome 接口,但任何使用 IIOP 公开的 Jakarta Enterprise Beans 3 bean 都需要此接口。然后,您必须使用 jboss-ejb3.xml 文件启用 IIOP,或在 standalone-full.xml 配置文件中为所有 Jakarta Enterprise Beanss 启用 IIOP。
启用 IIOP
要启用 IIOP,您必须安装 IIOP OpenJDK ORB 子系统,ejb 3 子系统配置中有 <iiop/> 元素。发行版 附带的 standalone-full.xml 配置启用了这两个配置。
IIOP 在服务器配置文件的 iiop-openjdk 子系统中配置。
<subsystem xmlns="urn:jboss:domain:iiop-openjdk:2.1">
使用以下管理 CLI 命令访问和更新 iiop-openjdk 子系统:
/subsystem=iiop-openjdk
IIOP 元素采用控制服务器默认行为的两个属性。
<subsystem xmlns="urn:jboss:domain:ejb3:5.0"> ... <iiop enable-by-default="false" use-qualified-name="false"/> ... </subsystem>
以下管理 CLI 命令在 ejb3 子系统中添加 <iiop> 元素 :
/subsystem=ejb3/service=iiop:add(enable-by-default=false, use-qualified-name=false)
使用 IIOP 创建 Communicates 的 Jakarta Enterprise Beans
以下示例演示了如何从客户端进行远程 IIOP 调用:
在服务器上创建一个企业 Bean 2 Bean:
@Remote(IIOPRemote.class) @RemoteHome(IIOPBeanHome.class) @Stateless public class IIOPBean { public String sayHello() throws RemoteException { return "hello"; } }创建具有强制方法
create()的主页实施。客户端调用这个方法来获取远程接口的代理来调用业务方法:public interface IIOPBeanHome extends EJBHome { public IIOPRemote create() throws RemoteException; }为远程连接企业 Bean 创建一个远程接口:
public interface IIOPRemote extends EJBObject { String sayHello() throws RemoteException; }通过在
META-INF 中创建描述符文件:jboss-ejb3.xml 来引入用于远程调用的 Bean<?xml version="1.0" encoding="UTF-8"?> <jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:iiop="urn:iiop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-spec-2_0.xsd urn:iiop jboss-ejb-iiop_1_0.xsd" version="3.1" impl-version="2.0"> <assembly-descriptor> <iiop:iiop> <ejb-name>*</ejb-name> </iiop:iiop> </assembly-descriptor> </jboss:ejb-jar>注意现在,打包的 Bean 以及 JAR 文件中的描述符已准备好部署到 JBoss EAP 容器。
在客户端创建上下文:
System.setProperty("com.sun.CORBA.ORBUseDynamicStub", "true"); final Properties props = new Properties(); props.put(Context.PROVIDER_URL, "corbaloc::localhost:3528/JBoss/Naming/root"); props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.iiop.naming:org.jboss.naming.client"); props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"); props.put(Context.OBJECT_FACTORIES, "org.jboss.tm.iiop.client.IIOPClientUserTransactionObjectFactory");注意客户端需要将
wildfly iiop openjdk库添加到其类路径中。客户端可能还需要将org.wildfly:wildfly-iiop-openjdk构件添加为 Maven 依赖项。使用 context lookup 来缩小对
IIOPBeanHome主目录的引用范围。然后,调用 home 接口create()方法来访问远程接口,允许您调用其方法:try { Context context = new InitialContext(props); final Object iiopObj = context.lookup(IIOPBean.class.getSimpleName()); final IIOPBeanHome beanHome = (IIOPBeanHome) PortableRemoteObject.narrow(iiopObj, IIOPBeanHome.class); final IIOPRemote bean = beanHome.create(); System.out.println("Bean saying: " + bean.sayHello()); } catch (Exception e) { e.printStackTrace(); }