[http://xace.iteye.com/blog/686455]
文章分类:Java编程
传统的实现RMI,需要
1.服务接口必须从Remote派生,每个方法抛出RemoteException
2.实现类必须从UnicastRemoteObject派生
3.所有方法的参数和返回值,必须是基本类型,或者实现了Serializable接口
Java代码
public class User implements Serializable {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
public interface RmiUserService extends Remote {
User login(String username, String password) throws RemoteException;
void create(String username, String password) throws RemoteException;
}
public class RmiUserServiceImpl extends UnicastRemoteObject implements RmiUserService {
protected RmiUserServiceImpl() throws RemoteException {
}
private Map<String, String> users = new HashMap<String, String>();
public void create(String username, String password) {
if (username == null || password == null)
throw new IllegalArgumentException("Invalid args.");
if (users.get(username) != null)
throw new RuntimeException("User exist!");
users.put(username, password);
}
public User login(String username, String password) {
if (username == null || password == null)
throw new IllegalArgumentException("Invalid args.");
if (password.equals(users.get(username)))
return new User(username, password);
throw new RuntimeException("Login failed.");
}
public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
LocateRegistry.createRegistry(1099);
Naming.bind("rmi://localhost:1099/UserService", new RmiUserServiceImpl());
}
}
public class Client {
public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {
RmiUserService service = (RmiUserService) Naming.lookup("rmi://localhost:1099/UserService");
service.create("xace", "1");
System.out.println(service.login("xace", "1"));
}
}
调用:
>rmic RmiUserServiceImpl
>java Client
public class User implements Serializable {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
public interface RmiUserService extends Remote {
User login(String username, String password) throws RemoteException;
void create(String username, String password) throws RemoteException;
}
public class RmiUserServiceImpl extends UnicastRemoteObject implements RmiUserService {
protected RmiUserServiceImpl() throws RemoteException {
}
private Map<String, String> users = new HashMap<String, String>();
public void create(String username, String password) {
if (username == null || password == null)
throw new IllegalArgumentException("Invalid args.");
if (users.get(username) != null)
throw new RuntimeException("User exist!");
users.put(username, password);
}
public User login(String username, String password) {
if (username == null || password == null)
throw new IllegalArgumentException("Invalid args.");
if (password.equals(users.get(username)))
return new User(username, password);
throw new RuntimeException("Login failed.");
}
public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
LocateRegistry.createRegistry(1099);
Naming.bind("rmi://localhost:1099/UserService", new RmiUserServiceImpl());
}
}
public class Client {
public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {
RmiUserService service = (RmiUserService) Naming.lookup("rmi://localhost:1099/UserService");
service.create("xace", "1");
System.out.println(service.login("xace", "1"));
}
}
调用:
>rmic RmiUserServiceImpl
>java Client
Spring对RMI提供的支持
不用写一行代码,直接在Spring的配置文件中声明,就可以将一个传统的java类作为RMI服务输出
Xml代码
<bean id="userService" class="example.rmi.UserServiceImpl" />
<bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="UserService"/>
<property name="service" ref="userService"/>
<property name="serviceInterface" value="example.rmi.UserService"/>
<property name="registryPort" value="1099"/>
</bean>
<bean id="userService" class="example.rmi.UserServiceImpl" />
<bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="UserService"/>
<property name="service" ref="userService"/>
<property name="serviceInterface" value="example.rmi.UserService"/>
<property name="registryPort" value="1099"/>
</bean>
唯一编写的代码是main()方法,启动Spring容器
Java代码
public static void main(String[] args) {
new ClassPathXmlApplicationContext("config.xml");
}
public static void main(String[] args) {
new ClassPathXmlApplicationContext("config.xml");
}
客户端代码
Java代码
public class Client {
public static void main(String[] args) throws Exception {
RmiProxyFactoryBean factory = new RmiProxyFactoryBean();
factory.setServiceInterface(UserService.class);
factory.setServiceUrl("rmi://localhost:1099/UserService");
factory.afterPropertiesSet();
UserService service = (UserService) factory.getObject();
service.create("test", "password");
System.out.println(service.login("test", "password"));
try {
service.login("test", "bad-password");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
public class Client {
public static void main(String[] args) throws Exception {
RmiProxyFactoryBean factory = new RmiProxyFactoryBean();
factory.setServiceInterface(UserService.class);
factory.setServiceUrl("rmi://localhost:1099/UserService");
factory.afterPropertiesSet();
UserService service = (UserService) factory.getObject();
service.create("test", "password");
System.out.println(service.login("test", "password"));
try {
service.login("test", "bad-password");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
如果客户端也在Spring容器中启动,完全可以在XML配置文件中定义UserService并直接使用
Xml代码
<bean id="userServiceRmi" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1099/UserService" />
<property name="serviceInterface" value="example.rmi.UserService" />
</bean>
<bean id="userServiceRmi" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1099/UserService" />
<property name="serviceInterface" value="example.rmi.UserService" />
</bean>
RMI虽然是Java标准的远程调用模式,但是它使用特定的Java Remote Method Protocol二进制协议,很难穿透防火墙,如果要跨防火墙,应该使用HTTP协议为基础的远程调用。
Hessian; Burlap; Spring HTTP Invoker。使用私有协议的Http远程调用没有成为标准,实际应用较少,只能用于Java应用程序之间的远程调用。如果希望和异构平台实现远程调用,就必须使用标准的Web服务(Web Services)
分享到:
相关推荐
Spring通过提供RMI集成,简化了RMI服务的创建和调用。以下是一些关键点: 1. **服务接口定义**:首先,你需要定义一个远程服务接口,这个接口将包含你希望在远程进程中执行的方法。 2. **服务实现**:接着,创建该...
总的来说,"spring+rmi非本地实现"项目展示了如何利用Spring和RMI来构建分布式服务,提供了一种跨越网络调用的方法,增强了系统的可扩展性和解耦性。理解和掌握这部分知识对于开发分布式系统具有重要意义。
这个压缩包文件“Spring+RMI”很可能包含了实现这样一个远程调用示例的所有必要组成部分,包括配置文件、接口定义、服务器端实现以及客户端调用代码。 首先,我们来理解一下Java RMI。RMI是Java提供的一种原生的...
具体到这个压缩包“springRMI”,我们可以推测它可能包含了以下几个部分: 1. **配置文件**:如`applicationContext.xml`,其中定义了Spring容器中的Bean,可能包括RMI服务的接口和实现。 2. **远程接口**:`.java`...
Spring RMI(Remote Method Invocation)远程接口调用是Spring框架提供的一个特性,它允许你在分布式环境中调用对象的方法,使得应用程序能够跨越网络边界操作远程对象。这个技术在大型企业级应用中尤其有用,因为它...
本文将详细讲解Spring与RMI的整合,以及如何通过"SpringRMIClient"和"SpringRMIServer"这两个示例文件实现跨项目的远程方法调用。 一、Spring整合RMI基础 1.1 RMI原理:RMI的核心在于Java的`java.rmi`包,它定义了...
- **事务支持**:Spring可以为RMI调用提供事务管理,确保操作的原子性和一致性。 ### 4. Spring AOP与RMI结合 Spring的面向切面编程(AOP)可以与RMI集成,提供日志记录、性能监控、安全控制等功能。通过定义切点...
1. **RMI 概念**:RMI 是 Java 平台中的一种标准机制,允许一个 Java 对象调用远程计算机上的另一个 Java 对象的方法,实现远程过程调用。 2. **RMI 组件**:RMI 包括三个主要部分:远程接口(Remote Interface)、...
- 运行客户端,通过RMI调用服务器上的方法,验证通信是否成功。 在这个小例子中,我们可能会看到如下文件: - `RemoteInterface.java`:远程接口定义。 - `RemoteImpl.java`:远程接口的实现。 - `ServerConfig....
1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,Spring支持两个传统的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的...
在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring框架来增强RMI的功能,使其更加灵活和易于管理。 首先,我们需要理解Spring框架在RMI中的角色。Spring提供了对RMI的高级抽象,通过其`org.springframework...
将Spring与RMI结合,可以实现非本地部署的服务,使得客户端能够跨网络调用服务端的方法。以下是对这个主题的详细阐述: 首先,我们需要理解Spring框架的核心概念。Spring通过依赖注入(Dependency Injection,DI)...
6. **源码分析**:在提供的压缩包文件`SpringRMI`中,可能包含了上述所有步骤的代码示例。通过阅读这些源码,你可以深入理解Spring RMI的工作原理,包括服务暴露、注册、代理创建等。 7. **工具使用**:在开发过程...
- 在`rmi_spring_client`项目中,包含了客户端的代码,实现了对服务器端RMI服务的调用。 通过上述整合,我们可以构建一个健壮的分布式系统,利用Spring的高级特性管理和控制RMI服务,同时利用RMI实现跨JVM的通信。...
本篇文章将深入探讨如何在Spring框架中配置和调用RMI的多个接口。 首先,我们需要了解Spring RMI服务端的配置。服务端的核心在于创建RMI服务接口和其实现。在`SpringRmiServer.zip`中,我们通常会看到以下几个关键...
本篇将深入探讨Spring如何与RMI结合,以及客户端和服务器端的实现细节。 ### 一、Spring RMI 服务器端集成 1. **定义远程接口**:首先,我们需要创建一个Java接口,该接口将定义远程服务的方法。例如,我们可以...
本文将深入探讨“Spring RMI(Remote Method Invocation)应用”,这是Spring框架中用于实现远程方法调用的功能,它使得分布式系统开发变得更加简单。 首先,RMI是Java平台上的一个核心特性,允许在不同JVM之间透明...
在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...
将Spring与RMI结合使用,可以实现分布式服务的灵活构建。 首先,我们需要理解RMI的基本原理。RMI允许一个Java对象调用位于不同JVM中的另一个对象的方法。这涉及到三个主要步骤:导出远程对象、注册远程对象和调用...
Spring RMI(Remote Method Invocation)是Java平台上的远程方法调用技术,结合Spring框架的特性,使得在分布式系统中调用远程服务变得更加便捷。在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何...