在创建RMI服务时,需要将该服务通过JNDI绑定到特定的端口上。
开RMI服务端口的一般方法是:
RMIEngine pt = new RMIEngineImpl();
int port =1099;
String serviceName = "MyRMIService"
try {
LocateRegistry.createRegistry(port);
LocateRegistry.getRegistry();
} catch (Exception ex) {
logger.error(ex);
throw ex;
}
Registry registry = LocateRegistry.getRegistry(port);
registry.bind(serviceName, pt);
当该端口已经被占用时,会抛出"ObjID already in use" 或者 "Port already in use" 的异常。
但在RMI服务的处理上,有些问题一直很难妥善处理,主要为以下几个:
1、在JDK1.4上,同一个JVM中只能开一个端口,开第二个端口时,会出现"ObjID already in use"的异常,经查证,所有的register的ObjID都为“"0.0.0.0",所以会导致该异常出现。而在JDK1.5上没有该问题。
2、一直没有找到能够正确的关闭端口的方法。
一般的方法是:
//取消服务绑定
registry.unbind(serviceName);
//注销端口占用
UnicastRemoteObject.unexportObject(registry, true);
或者 PortableRemoteObject.unexportObject(registry);
该方式在同一个线程内可以重复的开关同一个端口,但在不同的线程中时,好像仍然不能有效地关闭该端口,再打开时仍然会报端口被占用的异常。
所以:当在应用服务器中重启一个带有rmi服务的应用时,经常会碰到端口被占用的问题。而独立的JVM启动一个rmi服务则没有问题。
3、两个Registry对象的区别 (不是问题)
Registry registry = LocateRegistry.createRegistry(port); //此时为local端的register
Registry registry2 = LocateRegistry.getRegistry(); //此时为remote端的register
这两者是不同的,在注销端口是好像是要传入local端的register才可以。
4、stub类的生成问题,目前来说服务端和客户端的stub类好像是必须一致才可以正常访问,若两端不一致,容易产生传值错误。对于升级或者产品开发方面需要特别注意。
不知道这些问题,有没有人完美的解决过?
分享到:
相关推荐
远程方法调用(Remote Method Invocation, RMI)是Java中的一种技术,允许一个程序执行远程计算机上的对象的方法。RMI是分布式计算的核心组件,它使得Java应用能够跨越网络边界,像调用本地对象一样调用远程对象,极...
Spring RMI服务是一种在Java平台上实现远程方法调用(Remote Method Invocation, RMI)的技术,它允许分布式系统中的不同组件通过网络进行通信。在Spring框架的支持下,我们可以更方便地将服务发布为RMI服务,使得...
在Java远程方法调用(Remote Method Invocation,RMI)技术中,构建一个通用的服务器框架是提高开发效率和代码可复用性的关键。Java RMI允许分布式计算,使得在不同网络节点上的对象可以像本地对象一样进行交互。本...
RMI过程涉及两个主要步骤:导出远程对象(使得其方法可供远程调用)和注册该对象到一个远程命名服务,这样其他客户端就可以找到并调用它。RMI在分布式Web应用程序中特别有用,因为它可以实现服务器端组件的远程调用...
RMI客户端通过网络连接到RMI服务器,调用其注册的服务对象的方法。在实验中,你可能会学习到如何创建RMI服务接口,实现该接口的服务器端,以及在客户端如何查找和调用远程服务。 具体到实验文件"rmi",这可能是RMI...
在IT领域,客户端-服务器架构、多线程服务器和远程方法调用(RMI)是构建分布式系统中的关键概念。让我们深入探讨这三个主题,并了解它们如何在Java编程中实现。 首先,客户端-服务器架构是一种通信模型,其中...
常见问题及解决策略 - **网络问题**:检查网络连接,确保服务器和客户机之间的通信畅通。 - **端口冲突**:RMI默认使用1099端口,可能与其他应用冲突,可更改RMI注册表端口。 - **安全性**:RMI默认使用匿名连接,...
在"RMI分布式议程服务"中,我们看到一系列批处理文件,这些文件用于执行特定的操作,如注册、添加、查询、删除和清除会晤。这表明该服务构建了一个远程日程管理应用,使得用户可以跨网络环境操作议程数据。 首先,...
- **注册远程对象**:使用`java.rmi.Naming`或`java.rmi.registry.Registry`接口的`bind()`方法将远程对象注册到RMI注册表中,使得客户端可以通过名称找到并调用。 - **导出远程对象**:使用`java.rmi.server....
总结来说,RMI提供了一种透明的方式来调用远程对象的方法,使得开发者可以创建分布式的Java应用程序而无需深入理解网络编程的复杂性。通过RMI,可以轻松地将服务部署在多台机器上,提升系统的可扩展性和可用性。
在这个"EX3_RMI分布式议程服务_principalk7z_"项目中,我们看到的是一个利用RMI构建的分布式议程服务。这样的服务可以让多个用户跨网络共享和管理他们的会议日程。 首先,我们要理解RMI的基本原理。RMI允许一个Java...
3. **注册远程对象**:服务器需要将实现远程接口的对象注册到RMI注册表中,使得客户端可以通过名字找到并调用这个对象。`java.rmi.Naming`类提供了注册和查找远程对象的方法。 4. **导出远程对象**:在服务器启动时...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在RMI架构中,客户端能够像调用本地对象一样调用远程服务器上的对象...
- 创建远程对象实例并将其注册到RMI注册表中,通常使用` LocateRegistry.createRegistry()` 创建注册表,然后用 `Registry.bind()` 绑定远程对象。 - 启动RMI服务器,监听客户端的连接请求。 2. **客户端**: - ...
此外,Spring还提供了对JNDI查找的支持,可以将RMI服务注册到JNDI上下文中,方便其他应用发现和使用。 RMI的一个重要优势是它可以在多个应用之间共享服务,提高了代码的重用性。然而,RMI也存在一些限制,如性能...
远程方法调用(Remote Method Invocation,RMI)是Java平台中的一个重要特性,它允许一个Java对象在不同的JVM(Java虚拟机)之间进行方法调用,从而实现分布式计算。RMI是Java网络编程的基础,特别适用于构建分布式...
在Java RMI中,服务器端(或服务提供者)创建实现特定接口的远程对象,并将其注册到RMI注册表中。客户端(或服务消费者)通过RMI机制获取远程对象的引用,然后就可以像调用本地方法一样调用远程对象的方法。RMI负责...
Spring会将这个实现注册到RMI注册表中,使得客户端可以通过接口的名称来查找并调用服务。 1. 创建RMI服务接口:首先,我们需要定义一个Java接口,声明RMI服务所需的方法。例如: ```java public interface ...
在 HelloTaskImpl.java 中实现远程服务器接口,并将服务注册到 RMI 注册表中。 3. 编译生成 Stub 文件 使用 rmic 处理实现类,生成远程对象的 Stub 文件。 4. 启用 rmiregistry 启用 rmiregistry,以便客户端...