关闭

WebLogic RMI 编程(三)

1009人阅读 评论(0) 收藏 举报

如何实现 WebLogic RMI

构成所有远程对象的基本单元为接口 java.rmi.Remote,它不包含任何方法。可以扩展此“标记”接口(即,它作为标识远程类的标记),以便使用创建远程对象结构的方法存根控件创建自己的远程接口。随后,可使用远程类实现自己的远程接口。此实现会绑定到注册表中的一个名称,客户端或服务器可在注册表中查找对象并远程使用该对象。

如果已经编写了 RMI 类,则可以通过更改远程接口以及扩展此接口的类上的导入语句,将其置于 WebLogic RMI 中。要添加对客户端应用程序的远程调用,请按名称在注册表中查找对象。WebLogic RMI 异常与 java.rmi 异常完全相同,并对其进行了扩展,因此现有接口和实现不必更改异常处理。

 


实现 WebLogic RMI 的步骤

以下部分描述如何实现 WebLogic Server RMI:

创建可以远程调用的类

只需几个步骤,即可编写自己的 WebLogic RMI 类。下面是一个简单示例。

步骤 1. 编写远程接口

可被远程调用的每个类都实现一个远程接口。使用一种 Java 代码文本编辑器,编写符合下列准则的远程接口。

  • 远程接口必须扩展接口 java.rmi.Remote(其中不包含任何方法签名)。在实现接口的每个远程类中包含将实现的方法签名。有关如何编写接口的详细信息,请参阅 Sun Microsystems JavaSoft 教程中的“Creating Interfaces”。
  • 远程接口必须是公共的。否则,客户端在尝试加载实现它的远程对象时将出现错误。
  • 与 JavaSoft RMI 不同,没有必要让接口中的每个方法都在其 throws 块中声明 java.rmi.RemoteException。应用程序引发的异常可以特定于应用程序,并且可以扩展 RuntimeException。WebLogic RMI 为 java.rmi.RemoteException 设置了子类,因此如果已存在 RMI 类,将不必更改异常处理。
  • 远程接口不会包含很多代码。您所需要的只是要在远程类中实现的方法的方法签名。

    下面是远程接口的示例,方法签名为 sayHello()

    package examples.rmi.multihello;

    import java.rmi.*;

    public interface Hello extends java.rmi.Remote {

    String sayHello() throws RemoteException;

    }

对于 JavaSoft 的 RMI,每个实现远程接口的类必须有附带的、预先编译的代理。WebLogic RMI 支持更灵活的运行时代码生成;WebLogic RMI 支持动态代理和动态创建的字节代码(类型正确,但又独立于实现接口的类)。如果类实现单一的远程接口,则编译器生成的代理和字节代码将与远程接口具有相同的名称。如果类实现多个远程接口,则编译生成的代理和字节代码的名称将取决于编译器使用的名称重整。

步骤 2. 实现远程接口

仍使用 Java 代码文本编辑器,编写用于远程调用的类。此类应实现在步骤 1 中编写的远程接口,这意味着需要实现接口中包含的方法签名。目前,WebLogic RMI 中出现的所有代码的生成都取决于这个类文件。

对于 WebLogic RMI,类不需要扩展 UnicastRemoteObject,而 JavaSoft RMI 则要求扩展它。(可以扩展 UnicastRemoteObject,但这不是必需的。)这样便能够保持一个对您的应用程序有意义的类层次。

注意: 在 Weblogic Server 中,Weblogic RMI 和标准 JDK RMI 均可使用。如果使用 Weblogic RMI,则必须将“java weblogic.rmic ...”作为 rmic 编译器使用,并且不得将 RMI 实现作为“java.rmi.server.UnicastRemoteObject”的子类创建。如果使用标准 JDK RMI,则必须将“%JAVA_HOME%/bin/rmic”作为 rmic 编译器使用,并且必须将 RMI 实现类作为“java.rmi.server.UnicastRemoteObject”的子类创建。

类可以实现多个远程接口。类也可以定义非远程接口中的方法,但是不能远程调用这些方法。

此示例将实现一个类,此类创建多个 HelloImpl 并将每个 HelloImpl 都绑定到注册表中的一个唯一的名称。方法 sayHello() 问候用户,并标识已远程调用的对象。

package examples.rmi.multihello;
import java.rmi.*;
public class HelloImpl implements Hello {
  private String name;
  public HelloImpl(String s) throws RemoteException {
    name = s;
  }
  public String sayHello() throws RemoteException {
    return "Hello! From " + name;
  }

接下来,编写一个 main() 方法,以创建远程对象的实例,并通过将其绑定到一个名称(指向对象的实现的 URL)将其注册到 WebLogic RMI 注册表中。需要获取代理以远程使用对象的客户端将能够按名称查找此对象。

下面是 HelloImpl 类的 main() 方法的示例。它将 HelloImpl 对象注册到 WebLogic Server 注册表中的名称 HelloRemoteWorld 下。

  public static void main(String[] argv) {
    // WebLogic RMI 中不需要
    // System.setSecurityManager(new RmiSecurityManager());
    // 但是如果包含此行代码,就应该
    // 使它成为有条件的,如这里所显示:
    // if (System.getSecurityManager() == null)
    //   System.setSecurityManager(new RmiSecurityManager());
    int i = 0;
    try {
      for (i = 0; i < 10; i++) {
        HelloImpl obj = new HelloImpl("MultiHelloServer" + i);
        Context.rebind("//localhost/MultiHelloServer" + i, obj);
	System.out.println("MultiHelloServer" + i + " created.");
      }
      System.out.println("Created and registered " + i +
                         " MultiHelloImpls.");
    }
    catch (Exception e) {
      System.out.println("HelloImpl error: " + e.getMessage());
      e.printStackTrace();
    }
  }

WebLogic RMI 并不要求您设置安全管理器以将安全性集成到应用程序中。安全是由 WebLogic Server 对 SSL 和 ACL 的支持处理的。如果必须设置安全管理器,则可以使用自己的安全管理器,但不要将其安装在 WebLogic Server 中。

步骤 3. 编译 Java 类

使用 javac 或某些其他 Java 编译器编译 .java 文件,以便生成远程接口的 .class 文件以及实现它的类。

步骤 4. 使用 RMI 编译器编译实现类

对远程类运行 WebLogic RMI 编译器 (weblogic.rmic),以便在运行过程中生成动态代理和字节代码。代理是远程对象的客户端代理,它将每个 WebLogic RMI 调用转发到与其匹配的服务器端字节代码,而此字节代码又依次将此调用转发到实际远程对象实现。要运行 weblogic.rmic,请使用命令模式:

  $ java weblogic.rmic nameOfRemoteClass

其中,nameOfRemoteClass 是实现远程接口的类的完整包名。对于前面使用的示例,命令将为:

  $ java weblogic.rmic examples.rmi.hello.HelloImpl

如果在创建存根控件或骨架类时需要保留生成的源代码,请在运行 weblogic.rmic 时设置标志 –keepgenerated。有关可用的命令行选项列表,请参阅 WebLogic RMI 编译器选项

步骤 5. 编写调用远程方法的代码

使用一种 Java 代码文本编辑器,在 WebLogic Server 上编译和安装了远程类、它实现的接口以及其代理和字节代码后,即可为 WebLogic 客户端应用程序添加代码,以便调用远程类中的方法。

通常,只需一行代码:获得对远程对象的引用。使用 Naming.lookup() 方法来完成此任务。下面是一个简短的 WebLogic 客户端应用程序,它使用上一示例中创建的对象。

package mypackage.myclient;
import java.rmi.*;
public class HelloWorld throws Exception {
  // 查找 WebLogic 注册表中的
  // 远程对象
  Hello hi = (Hello)Naming.lookup("HelloRemoteWorld");
  // 远程调用方法
  String message = hi.sayHello();
  System.out.println(message);
}

此示例演示将 Java 应用程序作为客户端使用。

Hello 代码示例

下面是 Hello 接口的完整代码。

package examples.rmi.hello;
import java.rmi.*;
public interface Hello extends java.rmi.Remote {
  String sayHello() throws RemoteException;
}

下面是实现 Hello 接口的 HelloImpl 类的完整代码。

package examples.rmi.hello;
import java.rmi.*;
public class HelloImpl
    // WebLogic RMI 中不需要:
    // 扩展 UnicastRemoteObject
    implements Hello {
  public HelloImpl() throws RemoteException {
    super();
  }
  public String sayHello() throws RemoteException {
    return "Hello Remote World!!";
  }
  public static void main(String[] argv) {
    try {
      HelloImpl obj = new HelloImpl();
      Naming.bind("HelloRemoteWorld", obj);
    }
    catch (Exception e) {
      System.out.println("HelloImpl error: " + e.getMessage());
      e.printStackTrace();
    }
  }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:425264次
    • 积分:4390
    • 等级:
    • 排名:第6803名
    • 原创:72篇
    • 转载:121篇
    • 译文:2篇
    • 评论:38条
    最新评论
    友情链接