远程调用有很多种,例如:
1)远程方法调用(RMI)
2)Spring自己的HTTP invoker
3)EJB
4)Web Services
Rmi(remote method invocation,即远程方法调用),使用rmi,使用远程的方法就像使用本地的方法一样方便。Hessian和BlazeDS等提供了较好的对rmi的支持,但是它们都是基于sevlet的,也就是说要想使用Hessian或者BlazeDS就必须将编写的程序放入web容器中才能运行,在很多情况下是不方便的,比如说如果我们想要客户使用我们的程序,难道我们要求客户一定要安装tomcat这样的web容器不成。所以如何使用Spring和rmi结合编写javase的程序是下面讨论的重点。对于Hessian和BlazeDS的使用请参考我的其他文章。
要想编写一个RMI程序,首先需要编写的是服务接口(stub),服务接口是在客户端和服务端都必须有的部分,但是服务接口的实现仅在客户端存在。
下面给出一个实例程序:
1.0 服务端编写
先说服务端的编写,服务端先要提供一个远程访问的接口(就是stub):
package com.guan.springRmiDemo.server;
public interface HelloInterface {
public String sayHello(String name);
}
然后需要写至少一个类,实现上述的接口:
package com.guan.springRmiDemo.server;
import org.springframework.stereotype.Component;
@Component
public class Hello implements HelloInterface{
@Override
public String sayHello(String name) {
return "hello "+name;
}
}
需要写一个Spring的配置类(您可以使用xml形式的配置文档,我比较倾向于写配置类,有关配置类的说明可以看我的一篇关于这方面的博客)
package com.guan.springRmiDemo.server;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiServiceExporter;
@Configuration
public class ServerConfigure {
//将实现stub的类注入
private @Autowired Hello hello;
//下面的bean将远程调用的接口暴露给外界客户端
@Bean
public RmiServiceExporter serviceExporter()
{
RmiServiceExporter rse = new RmiServiceExporter();
//rmi访问的名字是Hello
rse.setServiceName("Hello");
//rmi访问的端口号是1919
rse.setRegistryPort(1919);
//rmi暴露给外部的访问接口是HelloInterface接口
rse.setServiceInterface(HelloInterface.class);
//rmi实际使用的是Hello类的对象
rse.setService(hello);
return rse;
}
}
最后写一个main函数,启动这个rmi的监听器:
package com.guan.springRmiDemo.server;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ServerStart {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
//扫描整个server目录
ctx.scan("com.guan.springRmiDemo.server");
//刷新
ctx.refresh();
}
}
注意,当初始化Spring环境后,Spring容器会自动的创建并处理监听(就是说,这种情况下执行ctx.refresh之后无法返回,除非你主动终止监听)。
2.0 客户端编写
客户端肯定也需要提供与服务端相同的接口:
package com.guan.springRmiDemo.client;
public interface HelloInterface {
public String sayHello(String name);
}
假设客户端中的某一个类中使用到了rmi的远程方法,如下:
package com.guan.springRmiDemo.client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("clientUseHello")
public class ClientUseHello {
private HelloInterface hello;
//注意,这个服务的代理要以注入的形式赋值给hello变量
@Autowired
@Qualifier("helloProxy")
public void setHello(HelloInterface hello) {
this.hello = hello;
}
public void sayHello()
{
//使用的rmi远程服务
System.out.println(hello.sayHello("关新全"));
}
}
下面给出Spring的配置文件:
package com.guan.springRmiDemo.client;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiProxyFactoryBean;
@Configuration
public class ClientConfigure {
//创建rmi的代理
@Bean(name="helloProxy")
public RmiProxyFactoryBean rmiProxy()
{
RmiProxyFactoryBean rpfb = new RmiProxyFactoryBean();
//访问rmi,ip,端口,和rmi名字
rpfb.setServiceUrl("rmi://202.194.158.128:1919/Hello");
//设置代理类代理的接口
rpfb.setServiceInterface(HelloInterface.class);
return rpfb;
}
}
上面有个小细节需要单独说:就是在Spring配置文档中创建的代理bean,实际是RmiProxyFactoryBean类型,而在ClientUseHello中注入的代理却是HelloInterface类型,这个类型转换是由Spring来完成的,由于在创建代理的时候,指定了代理的是HelloInterface接口,Spring可以将这个代理接口转换成我们使用的方式。(RmiProxyFactoryBean如何能转换成HelloInterface类型,是个很有意思的问题,可以深刻探讨下)。
最后给出客户端的测试代码:
package com.guan.springRmiDemo.client;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ClientTest {
@Test
public void rmiTest()
{
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("com.guan.springRmiDemo.client");
ctx.refresh();
ClientUseHello cuh = (ClientUseHello) ctx.getBean("clientUseHello");
cuh.sayHello();
}
}
执行结果:
hello 关新全
3. 一个灵活的客户端的实现
按照第二步中的方式实现的客户端是在spring容器启动之前就要确定链接的ip地址和端口号,有时我们需要更加灵活的rmi运行方式,比如,在运行时动态的决定需要访问的ip地址和端口号,这时,使用spring容器的方法就不可行,但是可以采用下面的方法来实现。
package com.guan.springRmiDemo.client;
import org.springframework.remoting.rmi.RmiProxyFactoryBean;
public class OtherClientTest {
public static void main(String[] args) {
//创建远程代理
RmiProxyFactoryBean rpfb = new RmiProxyFactoryBean();
//可以根据需要动态设定rmi的ip地址和端口
rpfb.setServiceUrl("rmi://202.194.158.128:1919/Hello");
//设置访问接口
rpfb.setServiceInterface(HelloInterface.class);
//设置结束,让rmi开始链接远程的服务
rpfb.afterPropertiesSet();
//获取链接后的返回结果
Object o = rpfb.getObject();
//将结果转换成我们希望的类型
HelloInterface hello = (HelloInterface)o;
//调用结果执行远程调用
System.out.println(hello.sayHello("关新全"));
}
}
相关推荐
这个“spring和RMI分布式整合源码”可能包含了一个实际项目中如何将这两种技术融合的实例。现在,我们将深入探讨Spring框架和RMI,以及它们在分布式环境中的整合应用。 首先,Spring是一个开源的Java应用程序框架,...
spring 与rmi 的整合 1.首先编写接口 interface : 这里的接口要继承Remote, 它是一个标识接口 2.编写实现类 3.编写main方法用于启动 service 4 配置spring文件 编写客户端测试类
- 调用远程方法:现在,客户端可以像调用本地对象一样调用远程对象的方法,所有网络通信和异常处理都由Spring和RMI处理。 5. 示例代码: - 服务器端:创建Spring配置文件,配置`RmiServiceExporter`,并将服务...
总结来说,Spring整合RMI提供了一套灵活的工具,使得开发人员可以方便地创建和使用分布式服务。通过合理利用这些工具,我们可以构建出高效、可扩展且易于维护的分布式系统。同时,理解RMI的底层原理和Spring的相关...
本文将详细讲解Spring与RMI的整合,以及如何通过"SpringRMIClient"和"SpringRMIServer"这两个示例文件实现跨项目的远程方法调用。 一、Spring整合RMI基础 1.1 RMI原理:RMI的核心在于Java的`java.rmi`包,它定义了...
总的来说,"spring+rmi非本地实现"项目展示了如何利用Spring和RMI来构建分布式服务,提供了一种跨越网络调用的方法,增强了系统的可扩展性和解耦性。理解和掌握这部分知识对于开发分布式系统具有重要意义。
Spring RMI是Spring框架对Java RMI的封装,它简化了RMI服务的配置和管理过程。RMI的核心概念包括: - **远程接口(Remote Interface)**:定义了可以在不同JVM之间调用的方法。 - **远程实现(Remote ...
在本文中,我们将深入探讨Spring框架如何集成RMI,以及如何创建和使用RMI客户端。 首先,让我们了解RMI的基本概念。RMI是一种机制,它允许一个对象在一台计算机上执行的方法可以在另一台计算机上执行,就好像这些...
Spring RMI(Remote Method Invocation)是Java平台上的远程方法调用技术,结合Spring框架,能够帮助开发者轻松...实践中,还可以进一步探索如何结合Spring的其他特性,如AOP和事务管理,来增强RMI应用的功能和健壮性。
在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring框架来增强RMI的功能,使其更加灵活和易于管理。 首先,我们需要理解Spring框架在RMI中的角色。Spring提供了对RMI的高级抽象,通过其`org.springframework...
**Spring + RMI 整合** 1. **Spring RMI 客户端**:Spring 提供了 `RmiProxyFactoryBean` 用于创建 RMI 客户端代理,这样可以在 Spring 容器中以声明式的方式配置远程服务。 2. **Spring RMI 服务器**:Spring 支持...
在本篇中,我们将深入探讨如何将Spring框架与Remote Method Invocation (RMI)技术整合,以便在分布式环境中实现远程服务调用。RMI是Java提供的一种机制,它允许对象在不同的JVM之间进行通信,而Spring框架则为构建可...
在本示例中,我们将探讨如何使用Spring RMI创建一个小的应用程序,这通常涉及到服务器端(服务提供者)和客户端(服务消费者)的设置。 首先,让我们了解Spring RMI的核心概念: 1. **接口定义**:在RMI中,我们...
Spring通过提供RMI集成,简化了RMI服务的创建和调用。以下是一些关键点: 1. **服务接口定义**:首先,你需要定义一个远程服务接口,这个接口将包含你希望在远程进程中执行的方法。 2. **服务实现**:接着,创建该...
Spring框架提供了对RMI的支持,使得在Spring应用中集成RMI变得更加简单和灵活。本篇将深入探讨Spring如何与RMI结合,以及客户端和服务器端的实现细节。 ### 一、Spring RMI 服务器端集成 1. **定义远程接口**:...
Spring RMI整合了RMI机制,提供了一种更加灵活和易于管理的方式,让开发者可以在Spring容器中定义远程服务,并通过Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)特性来增强这些服务。...
Spring整合RMI(Remote Method Invocation)是将Spring框架与Java RMI技术相结合,实现远程服务调用的一种方式。RMI允许在分布式环境中调用对象的方法,就像调用本地对象一样,极大地增强了应用的可扩展性和灵活性。...
Java Spring与RMI(Remote Method Invocation)的整合是企业级应用中常见的远程服务交互方式。Spring框架提供了对RMI的支持,使得开发者能够方便地在分布式环境中进行服务的调用。这个压缩包文件“Spring+RMI”很...
在实际应用中,Spring MVC或者Spring Boot可以用来构建Web服务端,它们可以很好地与RMI整合,提供RESTful API或者其他Web服务接口,从而让客户端通过HTTP/HTTPS调用。 总结,"spring+rmi实现非本地部署"涉及了...
通过分析和运行这两个示例,开发者可以深入理解Spring框架与RMI的整合,以及如何在实际项目中应用这一技术。 总结来说,Spring中的RMI集成提供了一种简单且灵活的方式来实现分布式系统中的跨JVM通信。通过学习这个...