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代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  2. 剑指offer-从尾到头打印链表03

    class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code ...

  3. python pyinstaller 打包程序报错解决

    python打包exe,各种入坑 一.安装PyInstaller 1.安装pywin32 pip命令安装:pip install pywin32(推荐) 2.安装Pyinstaller pip命令安装 ...

  4. idea中maven项目放到包中的mapper的xml文件不发布的问题

    今天重新一下mybatis的基础,然后一直报错,提示的是 result map 找不到com.zm.model.User对象可是看 mapper的写法没问题.找了半天才发现 是mapper没扫描到 解 ...

  5. Thread 线程池

    Thread 线程池: 当使用多个较短存活期的线程有利时,运用线程池技术可以发挥作用.运用这一技术时,不是为每个任务创建一个全新的线程,而可以从线程池中抽出线程,并分配给任务.当线程完成任务后,再把它 ...

  6. B - Help Jimmy

    B - Help Jimmy Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem ...

  7. 【bzoj2618】[Cqoi2006]凸多边形 半平面交

    题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...

  8. easyui中tab页中js脚本无法加载的问题及解决方法

    我发现tab页中<script src="xxx.js">方式加载的脚本没有生效,firebug看请求也没有请求相应的脚本文件. 单独在浏览器中打开tab页中的页面js ...

  9. 2016"百度之星" - 初赛(Astar Round2A)HDU 5695 拓扑排序+优先队列

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  10. POST JSON fails with 415 Unsupported media type, SpringMVC

    网上的解决办法非常多,但是大多不靠谱. 归结原因:SpringMVC 无法通过 httprequest headers 中的 Content-Type 和 Accept 匹配到对应的HttpMessa ...