是否有相当于CORBA IOR的Java RMI?

时间:2014-01-14 13:18:24

标签: java rmi corba

CORBA具有很好的功能,即每个对远程对象的引用都可以转换为字符串,即可互操作对象引用(IOR),它提取访问remove对象所需的协议,主机,端口等详细信息。可以在电子邮件,文件,数据库等中传递此类IOR,并在完全不同的过程中重新创建对象存根,并且它可以正常工作。

Java RMI中是否存在等效的IOR?

2 个答案:

答案 0 :(得分: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 除了支持通过命名服务器的常规访问外,还可以支持不使用命名服务器的直接访问。对于 RMI 和 IIOP,此 URL 如下所示:

// 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());
    }
}

答案 1 :(得分:0)

不,没有。 RMI远程引用是不透明的存根。您可以在其上调用toString(),并查看各种有趣的内容,但是您无法对字符串执行任何有用的操作。