四年前也是 Java 的 fans,也曾如火如荼的追求着 sun,追求着 java. 当然 RMI 肯定不会放过,但到目前为止还没有在任何一个项目中用过,昨天听了一个 java 老师的课,本来不去想听,可想想我交了这么多 money,最后还是去。最叫人恶心的是他讲的 RMI 一点实用价值都没有,而且有的理论也不对。真的误导人啊,学术理论和实践是不能够分离的,老师是这样的,只能靠学生自己动手丰衣足食了。昨天晚上用了一点时间,从新研究了一下 RMI。举个例子作为 RMI 学习的终结吧。 在写这篇文章前也访问了中国电信的高级工程师,根据他的介绍,RMI 有很多实现方式,而且现在他发 RMI(Remote Method Invocation,远程方法调用)是Java提供的一种用于实现分布式计算的技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在本文中,我们将深入理解RMI的基本概念,以及如何通过一个简化示例来实现RMI应用。 RMI的核心在于远程接口,它定义了可以在远程对象上调用的方法。例如,在提供的代码中,`IRMI`接口定义了一个名为`invoke`的远程方法,接受一个实现了`ITask`接口的对象作为参数。这个接口的实现,`IRMIImpl`,继承自`UnicastRemoteObject`,这是RMI提供的基类,用于创建和管理远程对象。`invoke`方法会在服务器端执行,并调用传入的任务对象的`doWork`方法。 `ITask`接口代表了可以被远程执行的任务,而`TaskImpl`是它的具体实现。当客户端调用远程方法时,实际上是将一个`TaskImpl`实例传递给服务器,服务器再在其上执行`doWork`方法,返回结果。 在RMI中,远程对象的创建和注册通常是通过`UnicastRemoteObject`的子类实现的。在`IRMIImpl`构造函数中,调用了`super()`,这会自动导出远程对象并处理必要的网络通信。 服务器端启动RMI服务时,通常会使用`Naming.rebind()`方法将远程对象注册到RMI注册表,使得客户端可以通过名称查找并调用。但在给定的例子中,没有显示启动RMI注册表(`rmiregistry`),这通常意味着使用了嵌入式的注册表或者是在服务器启动时自动启动的。 客户端则通过`Naming.lookup()`来获取远程对象的引用,并进行方法调用。在这个例子中,服务器端的代码没有显示,但可以推测它会创建`IRMIImpl`的实例,并将其绑定到RMI注册表中的一个特定名称。 值得注意的是,RMI虽然简单易用,但在大规模分布式系统中可能面临性能和效率问题。正如中国电信的高级工程师提到的,他们正在转向自研分布式应用,可能是为了应对这些问题。随着Web 2.0和SOA(面向服务架构)的普及,更高效的通信协议如SOAP或RESTful API可能更适合构建现代分布式系统。 RMI为Java开发者提供了一种简便的机制来构建分布式应用,但其性能和效率在某些场景下可能不理想。理解和掌握RMI的基本原理和实现方法对于Java程序员来说仍然是有价值的,尤其是当需要快速搭建原型或者处理轻量级的分布式需求时。然而,对于大型和复杂的分布式系统,可能需要考虑其他技术,如JMS、Hadoop、Akka等。
- 粉丝: 3
- 资源: 885
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0