设为首页 收藏本站
查看: 705|回复: 0

[经验分享] WebLogic RMI 编程(三)

[复制链接]

尚未签到

发表于 2017-2-14 12:01:54 | 显示全部楼层 |阅读模式

如何实现 WebLogic RMI


构成所有远程对象的基本单元为接口 java.rmi.Remote,它不包含任何方法。可以扩展此“标记”接口(即,它作为标识远程类的标记),以便使用创建远程对象结构的方法存根控件创建自己的远程接口。随后,可使用远程类实现自己的远程接口。此实现会绑定到注册表中的一个名称,客户端或服务器可在注册表中查找对象并远程使用该对象。
如果已经编写了 RMI 类,则可以通过更改远程接口以及扩展此接口的类上的导入语句,将其置于 WebLogic RMI 中。要添加对客户端应用程序的远程调用,请按名称在注册表中查找对象。WebLogic RMI 异常与 java.rmi 异常完全相同,并对其进行了扩展,因此现有接口和实现不必更改异常处理。



实现 WebLogic RMI 的步骤


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



  • 创建可以远程调用的类
    步骤 1. 编写远程接口
    步骤 2. 实现远程接口
    步骤 3. 编译 Java 类
    步骤 4. 使用 RMI 编译器编译实现类
    步骤 5. 编写调用远程方法的代码


  • Hello 代码示例




创建可以远程调用的类


只需几个步骤,即可编写自己的 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();



    }



  }



}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-342082-1-1.html 上篇帖子: weblogic DeploymentException 下篇帖子: 创建 WebLogic 配置/域
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表