一、概述
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。Java RMI不是什么新技术,在Java1.1的时代都有了,大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi。
在大力鼓吹Web Service、SOA的时代,是不是每个应用都应该选用笨拙的Web Service组件来实现,通过对比测试后,RMI是最简单的,在一些小的应用中是最合适的。
但是RMI有如下两点局限性
- RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
- 是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,
二、使用RMI发布服务
2.1、定义RMI服务接口UserService类
import java.rmi.Remote; import java.rmi.RemoteException; import java.util.List; import com.gosun.jws.daomain.Users; /** * <pre> * 最原始的RMI远程方法调用, * 发布接口必须继承Remote接口进行标识 * 该接口所有方法必须抛出throws RemoteException异常 * </pre> * @author Ickes */ public interface UserService extends Remote { /** * 测试返回list * * @return */ public List<Users> geAlltUsers() throws RemoteException; /** * 测试返回实体,以及传人普通参数 * * @param id * @return */ public Users getUser(String id) throws RemoteException; /*** * 测试传入对象 * * @param user */ public void save(Users user)throws RemoteException; /** * 测试传人集合 * * @param users */ public void saves(List<Users> users) throws RemoteException; }
2.2、UserService服务实现类
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.List; import com.gosun.jws.daomain.Users; import com.gosun.jws.daomain.UsersFactory; /** * UserService接口的实现接口 * @author Ickes */ public class UserServiceImpl extends UnicastRemoteObject implements UserService{ private static final long serialVersionUID = 1L; protected UserServiceImpl() throws RemoteException { super(); } @Override public List<Users> geAlltUsers() { return UsersFactory.getUsers(); } @Override public Users getUser(String id) { System.out.println(id); return UsersFactory.getUser(); } @Override public void save(Users user) { System.out.println(user.toJson()); } @Override public void saves(List<Users> users) { for (Users u : users) { System.out.println(u.toJson()); } } }
测试用到的:UsersFactory工具类和Users实体类在:http://eksliang.iteye.com/blog/2265021篇文章的3.1和3.2代码中
2.3、启动RMI服务,进行注册
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; /** * 纯Java编写服务端代码如下 * @author Ickes * */ public class ServiceDemo { public static void main(String[] args) { try { UserService userService = new UserServiceImpl(); //注册通讯端口,该端口默认就是1099 LocateRegistry.createRegistry(1099); //注册通讯路径 Naming.rebind("rmi://127.0.0.1:1099/UserService", userService); } catch (RemoteException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } } }
三.客户端调用
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import java.util.List; import com.gosun.jws.daomain.Users; /** * 纯JAVA客户端调用代码 * @author Ickes */ public class ClientDemo { public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { UserService us = (UserService) Naming.lookup("rmi://127.0.0.1:1099/UserService"); Users user = us.getUser("a001"); System.out.println(user.toJson()); System.out.println("----------------------------------------"); List<Users> users = us.geAlltUsers(); for (Users u : users) { System.out.println(u.toJson()); } System.out.println("----------------------------------------"); us.save(user); System.out.println("----------------------------------------"); us.saves(users); } }
四、与Spring集成发布RMI服务
4.1配置spring的RmiServiceExporter
在classpath目录下面新建applicationContext-rmi.xml文件,文件内容如下:
<!-- 在Spring中装配RMI服务 --> <bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <!--需要发布的实现类 --> <property name="service" ref="userService" /> <!-- 注册到rmi上面的名字 --> <property name="serviceName" value="UserService" /> <!-- 接口完整类名 --> <property name="serviceInterface" value="com.gosun.jws.rmi.UserService" /> <!-- 默认是localhost,如果是localhost就不要填写,如果填写反而报错 <property name="registryHost" value="localhost" /> --> <!-- 默认为1099 --> <property name="registryPort" value="1199" /> </bean> <bean id="userService" class="com.gosun.jws.rmi.UserServiceImpl" />
4.2发布
让spring加载applicationContext-rmi.xml这个文件便完成了对RMI服务的启动。这里不累赘!
五、与Spring集成调用RMI服务
5.1配置Spring的RmiProxyFactoryBean
在spring中调用RMI也非常的简单,使用Spring的RmiProxyFactoryBean,该类是一个工厂对象,可以为RMI服务创建代理。使用也非常简单,在classpath下面创建client/applicationContext-rmi.xml文件,内容如下:
<!-- 使用spring调用RMI的服务 --> <bean id="userService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl" value="rmi://localhost:1199/UserService"/> <property name="serviceInterface" value="com.gosun.jws.rmi.UserService" /> </bean>
5.2、客户端调用
public class ClientDemo { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("client-application/applicationContext-rmi.xml"); UserService us = (UserService) ac.getBean("userService"); Users user = us.getUser("a001"); System.out.println(user.toJson()); System.out.println("----------------------------------------"); List<Users> users = us.geAlltUsers(); for (Users u : users) { System.out.println(u.toJson()); } System.out.println("----------------------------------------"); us.save(user); System.out.println("----------------------------------------"); us.saves(users); } }
相关推荐
RMI远程方法调用是Java平台上的一个关键特性,它允许Java对象在不同的JVM之间进行通信,从而实现分布式计算。RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 *...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在RMI架构中,客户端能够像调用本地对象一样调用远程服务器上的对象...
首先,我们需要定义一个实现了`java.rmi.Remote`接口的类,比如`MyRemoteInterface.java`,并在这个接口中声明所有需要远程调用的方法。这些方法必须抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。...
- **远程接口(Remote Interface)**:定义了可以被远程调用的方法,使用`@Remote`注解标识。 - **远程实现(Remote Implementation)**:实现了远程接口的类,包含远程方法的具体实现。 - **导出(Export)**:...
RMI(Remote Method Invocation,远程方法调用)是Java中的一种技术,允许一个Java对象调用另一个在不同JVM(Java虚拟机)上的对象的方法。RMI是Java分布式计算的基础,它使得Java程序可以在网络环境中进行通信和...
1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像调用本地方法一样。RMI系统的核心概念是客户端可以调用服务器端的对象上...
RMI允许Java程序在不同的Java虚拟机(JVMs)之间透明地调用方法,就像这些方法是在同一个对象上本地执行一样。在"ssd8 exercise4"中,我们将深入探讨RMI的概念及其应用。 RMI的核心概念是“远程对象”,它是一个...
RMI提供了透明的远程调用,使得开发者可以专注于业务逻辑,而不必关心底层的网络通信细节。 在RMI系统中,主要有以下几个关键组件: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它需要继承`...
远程接口中的方法声明会抛出`RemoteException`,表明这些方法是可以被远程调用的。 2. **远程对象(Remote Object)**:实现了远程接口的类,通常需要继承`java.rmi.UnicastRemoteObject`。这个类负责具体实现远程...
在Java世界中,远程方法调用(Remote Method Invocation,RMI)是一种强大的技术,它允许一个Java对象在不同的JVM(Java Virtual Machine)之间进行通信,仿佛这些对象都在同一个JVM上。本示例将介绍如何实现一个...
1. **创建远程接口**:定义一个继承自Remote的接口,声明需要远程调用的方法。 2. **实现远程接口**:编写一个类实现这个接口,提供具体的方法实现。 3. **注册远程对象**:在服务器端创建远程对象实例,然后将其...
`RMI远程方法调用讲解教程.doc`可能详细解释了RMI的工作原理,包括序列化、异常处理、安全性等方面。序列化是RMI的关键,因为所有的参数和返回值都必须能够被序列化以便在网络上传输。此外,RMI还支持安全性机制,如...
//远程调用RMI RMIInterface rmiInterface = null; try { rmiInterface = (RMIInterface) Naming.lookup(RMIInterface.RMI_URL); Object ret = rmiInterface.sayHello("张先生"); System.out.println("测试...
java jdk1.8; eclipse 开发环境;实现A机器的程序,可以管理(增加、删除、改等)B机器上的某个文件夹或者目录;掌握远程过程调用原理,基于...客户端利用RMI实现远程调用服务。同时,在在两台机器之间验证结果正确。
Spring RMI(Remote Method Invocation)远程接口调用是Spring框架提供的一个特性,它允许你在分布式环境中调用对象的方法,使得应用程序能够跨越网络边界操作远程对象。这个技术在大型企业级应用中尤其有用,因为它...
### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...