【问题标题】:Is there a Java RMI equivalent of a CORBA IOR?是否有相当于 CORBA IOR 的 Java RMI?
【发布时间】:2014-02-02 13:44:14
【问题描述】:

CORBA 有一个很好的特性,即对远程对象的每个引用都可以转换为字符串,即互操作对象引用 (IOR),它抽象了访问删除对象所需的协议、主机、端口等细节。可以在电子邮件、文件、数据库等中传递此类 IOR,并在完全不同的进程中重新创建对象存根,它可以工作。

Java RMI 中是否有 IOR 的等价物?

【问题讨论】:

    标签: java rmi corba


    【解决方案1】:

    RMI protocol(实际的协议叫JRMP,RMI是一个可以使用其他协议的API,但为了方便通信我还是用RMI这个词)是基于Java序列化的,传输RMI远程引用作为序列化对象,就像通过 RMI 传输的其他数据一样。 Java序列化格式本身是specified,所以可以跨不同的JVM实现使用。

    因此,CORBA IOR 的 RMI 等价物是 RMI 远程引用的序列化表示。由于 CORBA IOR 具有文本表示,因此它不是严格等价的,但可以将二进制引入文本编码,例如 Base64。

    使用它的一个例子是 JMX。 JMX 可以在不同的协议上工作,包括 RMI 和 IIOP,defines an URL format 除了支持通过命名服务器的常规访问外,还可以支持不使用命名服务器的直接访问。下面是这个 URL 在 RMI 和 IIOP 中的样子:

    // JRMP encoded form
    service:jmx:rmi://localhost/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjE2LjE5Mi4xMjAuMTI5AAANcQAAAAAAAAAIAOgIQgAAAPlXjcJugAEAeA==
    
    // IIOP encoded form
    service:jmx:iiop://localhost/ior/IOR:000000000000003b524d493a6a617661782e6d616e6167656d656e742e72656d6f74652e726d692e524d495365727665723a303030303030303030303030303030300000000000010000000000000068000102000000000f31362e3139322e3132302e31323900000d93000000000019afabcb0000000002578f08b80000000800000000000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100
    

    这是一个如何使用它的示例。在这个示例中,我们将启动一个基于 RMI 的 JMX 服务器并获取其编码的 RMI 引用,然后我们对其进行解码和反序列化。 (这只是为了演示,JMX 客户端会自动完成所有这些。)

    import sun.management.jmxremote.ConnectorBootstrap;
    
    import javax.management.remote.JMXConnectorServer;
    import javax.management.remote.rmi.RMIServer;
    import java.io.ByteArrayInputStream;
    import java.io.ObjectInputStream;
    import java.util.Base64;
    
    public class Console1 {
        public static void main(String[] args) throws Exception {
            JMXConnectorServer jmxConnectorServer = ConnectorBootstrap.startLocalConnectorServer();
            String encodedJmxRmiReference = jmxConnectorServer.getAddress().getURLPath().substring("/stub/".length());
            ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(encodedJmxRmiReference)));
            RMIServer jmxRmiReference = (RMIServer) in.readObject();
            System.out.println(jmxRmiReference.getVersion());
        }
    }
    

    【讨论】:

      【解决方案2】:

      不,没有。 RMI 远程引用是一个不透明的存根。你可以在上面调用 toString(),看到各种有趣的东西,但是你不能对字符串做任何有用的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多