Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
    在spring整合Rmi中:
服务端使用了org.springframework.remoting.rmi.RmiServiceExporter
    RmiServiceExporter把任何Spring管理的Bean输出成一个RMI服务。通过把Bean包装在一个适配器类中工作。适配器类被绑定到RMI注册表中,并且将请求代理给服务类。
客户端使用了org.springframework.remoting.rmi.RmiProxyFactoryBean
     客户端的核心是RmiProxyFactoryBean,包含serviceURL属性和serviceInterface属性。 通过JRMP访问服务。 JRMP:Java remote method protocol,Java特有的,基于流的协议。
 
 

服务端代码(需要使用spring的jar包和日志相关jar包):
    接口
  1. package com.rmi;
  2. /**
  3. * 接口
  4. * @author edgewalk
  5. * @date 2017年6月11日
  6. */
  7. public interface RmiServer {
  8. public boolean test();
  9. }
    实现类
  1. package com.rmi.impl;
  2. import com.rmi.RmiServer;
  3. /**
  4. * 实现类
  5. * @author edgewalk
  6. * @date 2017年6月11日
  7. */
  8. public class RmiServerImpl implements RmiServer {
  9. @Override
  10. public boolean test() {
  11. System.out.println("服务端test方法执行了.....");
  12. return true;
  13. }
  14. }
    配置文件rmi-server.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.5//EN" "file:/usr/local/tomcat_report/lib/spring-beans-2.0.dtd">
  3. <beans>
  4. <!-- 定义接口实现类-->
  5. <bean id="rmiService" class="com.rmi.impl.RmiServerImpl"/>
  6. <bean id="remoteRmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
  7. <!-- service接口 -->
  8. <property name="serviceInterface" value="com.rmi.RmiServer"/>
  9. <!-- 调用Service -->
  10. <property name="service" ref="rmiService" />
  11. <!-- value值是提供给客户端调用 -->
  12. <property name="serviceName" value="remoteService"/>
  13. <!-- 注册端口 -->
  14. <property name="registryPort" value="9400"/>
  15. <!-- 服务端口 -->
  16. <property name="servicePort" value="9401"/>
  17. </bean>
  18. </beans>
    服务端启动类
  1. package com.rmi;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. /**
  5. * 服务端启动类
  6. * @author edgewalk
  7. * @date 2017年6月11日
  8. */
  9. public class MainServer {
  10. public static void main(String[] args) {
  11. System.out.println("rmi服务端启动...");
  12. ApplicationContext ac = new ClassPathXmlApplicationContext("rmi-server.xml");
  13. System.out.println("rmi服务端启动完成...");
  14. }
  15. }

客户端代码
    接口
  1. package com.rmi;
  2. /**
  3. * 在客户端使用服务端的接口文件
  4. * @author edgewalk
  5. * @date 2017年6月11日
  6. */
  7. public interface RmiServer {
  8. public boolean test();
  9. }
socket连接工厂(可选配置)    
  1. package com.rmi;
  2. import java.io.IOException;
  3. import java.net.Socket;
  4. import java.rmi.server.RMIClientSocketFactory;
  5. /**
  6. * 自定义的socket连接工厂
  7. *
  8. * @author edgewalk
  9. * @date 2017年6月11日
  10. */
  11. public class RMICustomClientSocketFactory implements RMIClientSocketFactory {
  12. private int timeout = 1000; // 读超时时间
  13. public void setTimeout(int timeout) {
  14. this.timeout = timeout;
  15. }
  16. public Socket createSocket(String host, int port) throws IOException {
  17. Socket socket = new Socket(host, port);
  18. /**
  19. * 调用setSoTimeout(int
  20. * timeout)可以设置超时时间,如果到了超时时间仍没有数据,read会抛出一个SocketTimeoutException,
  21. * 程序需要捕获这个异常,但是当前的socket连接仍然是有效的。
  22. */
  23. socket.setSoTimeout(timeout);
  24. return socket;
  25. }
  26. }
  配置文件(rmi-server.xml)
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.5//EN" "file:/usr/local/tomcat_report/lib/spring-beans-2.0.dtd">
  3. <beans>
  4. <!-- 自定一个SCOKECT连接,可配置读超时时间 -->
  5. <bean id="rmiClientSocketFactory" class="com.rmi.RMICustomClientSocketFactory">
  6. <property name="timeout" value="1000"></property>
  7. </bean>
  8. <!-- rmi远程调用 -->
  9. <bean id="clientRmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  10. <!-- rmiServer是调用服务端serviceName的value,rmiIp是服务端ip,rmiPort是服务端注册的端口 -->
  11. <property name="serviceUrl" value="rmi://127.0.0.1:9400/remoteService" />
  12. <!-- service接口 -->
  13. <property name="serviceInterface" value="com.rmi.RmiServer" />
  14. <!-- 客户端自动重连 -->
  15. <!-- lookupStubOnStartup : false表示,不在容器启动的时候创建与Server端的连接; -->
  16. <property name="lookupStubOnStartup" value="true" />
  17. <!-- refreshStubOnConnectFailure : 这个属性是表示是否连接出错时自动重连; -->
  18. <property name="refreshStubOnConnectFailure" value="true" />
  19. <!-- registryClientSocketFactory : 这个是客户端与服务端创建SOCKECT的一个工厂。 -->
  20. <property name="registryClientSocketFactory" ref="rmiClientSocketFactory" />
  21. </bean>
  22. </beans>
    测试类
  1. package com.rmi.client;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.rmi.RmiServer;
  5. /**
  6. * 客户端测试调用服务端程序
  7. * @author edgewalk
  8. * @date 2017年6月11日
  9. */
  10. public class TestRmi {
  11. public static void main(String[] arg) {
  12. System.out.println("rmi客户端开始调用...");
  13. ApplicationContext ctx = new ClassPathXmlApplicationContext("rmi-client.xml");
  14. RmiServer rmi=(RmiServer)ctx.getBean("clientRmiService");
  15. //rmi.test();
  16. System.out.println("rmi客户端调用完成...");
  17. }
  18. }

输出结果
    服务端
  1. rmi服务端启动...
  2. log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
  3. log4j:WARN Please initialize the log4j system properly.
  4. rmi服务端启动完成...
  5. 服务端test方法执行了.....
    客户端
  1. rmi客户端开始调用...
  2. log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
  3. log4j:WARN Please initialize the log4j system properly.
  4. rmi客户端调用完成...
 
 
    

spirng整合rmi的更多相关文章

  1. Spring 4 整合RMI技术及发布多个服务(xjl456852原创)

    rmi需要建立两个项目,一个是服务端的项目,一个是客户端的项目.服务端项目启动后,再启动客户端项目去调用服务端的方法. 我们建立两个maven项目: pom.xml配置: <?xml versi ...

  2. SSH三大框架整合案例

    SSH三大框架的整合   SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...

  3. SSH三大框架的整合

    SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...

  4. spring RMI的使用

    Spring整合RMI的原理 客户端的核心是RmiProxyFactoryBean,包含serviceURL属性和serviceInterface属性. 通过JRMP访问服务.JRMP JRMP:ja ...

  5. 20160526-20160531mybatis入门进阶

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

  6. Ehcache缓存配置以及基本使用

    在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apache 2.0 ...

  7. spring远程服务知识梳理

    序:本文主要是总结和归纳spring的远程服务相关知识,可作为入门学习笔记.写博客目的也是为了进行知识梳理,便于以后查看.本文主要参考资料 spring 实战第三版 本文主要讨论内容如下: 远程调度概 ...

  8. mybatis由浅入深day02_课程复习_1订单商品数据模型分析

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

  9. java学习摘抄笔记mybaits2

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

随机推荐

  1. 孤荷凌寒自学python第四十二天python线程控制之Condition对象

     孤荷凌寒自学python第四十二天python的线程同步之Condition对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天学习了Condition对象,发现它综合了Event对象 ...

  2. python鉴黄程序

    最近有客户向服务器上传了些垃圾图片,和正常图片混合在一起,大概有10W张的数量,在经历了大概3个小时翻了2000多张的时候,手指抽了下,感觉很不舒服,硬着头皮上,写个程序鉴别下吧,但是怎么搞呢,经过从 ...

  3. 【现代程序设计】homework-02

    迟交了这么久,一定是0分了.可是我再怎么挣扎,还是不会.交了一维和二维的,这里说说思路吧.. 对于二维的情况,主要的思路就是将二维数组求矩形最大子数组的情况转化为一维的情况.因为所求的是矩形,我们就可 ...

  4. flutter channel master

    flutter可能是未来跨平台开发的又一技术框架,那么对于一个app,我们不可能完全用flutter来开发,那么就意味着我们需要在已有的Android和iOS代码中去集成flutter.目前这一技术还 ...

  5. 【CF Edu 28 C. Four Segments】

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  6. 《R语言实战》读书笔记--学习张丹日志

    从张丹的日志(http://blog.fens.me/rhadoop-r-basic/)中第九条对象看到R对象的几个总结: 1.内在属性 mode length 所有对象都有的属性 2.外部属性 at ...

  7. 编写Shell脚本的最佳实践,规范二

    需要养成的习惯如下: 代码有注释 #!/bin/bash # Written by steven # Name: mysqldump.sh # Version: v1.0 # Parameters : ...

  8. UML笔记(3):顺序图、Sequence Diagram

    http://www.cnblogs.com/xueyuangudiao/archive/2011/09/22/2185364.html 目录 含义 要素: 1 活动者 2 对象 3 生命线 4 控制 ...

  9. linux日志服务之logwatch

    因为logwatch默认要使用sendmail服务,所以请参考linux之发送邮件--sendmail服务配置首先设置正确sendmail服务. 安装logwatch. 查看logwatch文件在/e ...

  10. 自定义validate的效验规则 检验用户名是否存在

    <script type="text/javascript"> //自定义效验规则 $.validator.addMethod( //规则名称 "checkU ...