在 JBoss 中实现 CORBA 接口

Posted

技术标签:

【中文标题】在 JBoss 中实现 CORBA 接口【英文标题】:Implementing CORBA interface in JBoss 【发布时间】:2011-02-23 15:47:54 【问题描述】:

我正在寻找有关如何通过 CORBA 访问 EJB(或底层 MBean)的教程或任何其他信息。

这就是我找到的全部内容:http://www.jboss.org/jbossiiop

我有一个现有的 CORBA 服务器(基于 java,但非标准),我想让它调用我的 JBoss MBean。此 MBean 已使用 EJB (v2.1) 通过 RMI 公开。

当前的 AppServer 目标版本是 jboss-eap-4.3。


编辑:我希望我的问题太模糊而无法得到回答,所以这里有一个更新:

我希望在 JBoss 中运行的 EJB 注册到在远程单独服务器上运行的 Corba ORB。至少我认为我会。现有的 CORBA 客户端通过我试图通过 JBoss EJB 实现的定义的 IDL/接口连接到服务。此时,所述客户端连接到同一接口的多个实例,以通过该接口拉取信息并管理本地(同一进程)服务。我希望将 JBoss EJB 作为此 CORBA IDL 的另一个实现加入。

我对 CORBA 的理解一开始就生疏且薄弱,所以我没有走得太远。我可以很容易地在 JBoss 中运行 ORB,但我不清楚如何设置绑定以便“旧版”CORBA ORB 可以找到它。我可以更改 JBoss 实现的任何部分来完成这项工作,但是更改其他服务器很困难。

有没有办法让 EJB 向远程服务器(ala jndi)注册自己? 现有客户端是否能够在不添加 jboss 特定类的情况下连接到 Jacorb?

【问题讨论】:

这不是太模糊,只是你可能用一只手就能数出***上的CORBA开发人员的数量。 @skaffman 在我掌握了 CORBA 之后,我必须找到一个 Ada 问题。 【参考方案1】:

简而言之,你必须实现一个适配器,在 Jboss 中部署它,向远程 NamingService 注册它。在您的适配器实现中,您调用您的 MBean。

现在更详细 你有一个 CORBA idl,你生成存根和骨架。

interface Stock 
    int getQuote( in string company);
;

您提供必要的实施

public class StockImpl extends StockPOA 
  public int getQuote(String company) 
     //forward a call to MBean here
  

您执行通常的 CORBA 注册工作。类似:

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(...);
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

poa.the_POAManager().activate();

NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));

NameComponent [] name = new NameComponent[1];

org.omg.CORBA.Object o = poa.servant_to_reference( new StockImpl(orb,poa));
name[0] = new NameComponent( "Stock", "server");
nc.bind(name, o);

orb.run();

现在您的对象已在远程 NamingService 中注册,并且可以通过 CORBA 访问。

您必须在 JBOSS 类路径中包含 CORBA jar。

【讨论】:

谢谢!这行得通。我希望使用 JBoss CORBA 机制(基于反射)并避免使用 idlj 以保持 CORBA 的缺陷。我可能最终会使用反射重新实现某些东西,以避免为每个 MBean 编写新的 CORBA 适配器。【参考方案2】:

    Corba orb 是一个套接字侦听器,因此最好使用 JBoss 控制下的那个,即标准 orb:

    ObjectName ORB_NAME = ObjectNameFactory.create("jboss:service=CorbaORB"); ORB orb = (ORB)server.getAttribute(ORB_NAME, "ORB");

    要自动启动您的 Corba 服务,请在 JBoss 服务 mbean 中执行此操作: http://community.jboss.org/wiki/examplehelloworldservice

    为避免编译 IDL,您可以使用动态调用接口。 看看 Axis2 CORBA 模块是如何做到的:http://wso2.org/library/2807

    如果您使用 JBoss “all”配置,则在类路径中不需要 Orb,这包括 Corba。

【讨论】:

以上是关于在 JBoss 中实现 CORBA 接口的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中实现接口与显式实现接口 [重复]

如何配置 JBoss AS7.1.1 以引用 CORBA Remote-Bean

在 VBA 中实现接口的事件

是否可以在 GraphQL 中实现多个接口?

扩展三个在Java中实现接口的类

在同步对象中实现异步接口