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. android自定义SlideMenu

                                                                   完美解决ListView中子项焦点不可被Touch的BUG. 1.在Ecl ...

  2. hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览

    对namenode启动时的相关操作及相关类有一个大体了解,后续深入研究时,再对本文进行补充 >实现类 HDFS启动脚本为$HADOOP_HOME/sbin/start-dfs.sh,查看star ...

  3. synflood 模拟工具

    synflood 模拟工具 来源 https://blog.csdn.net/wuzhimang/article/details/54581117 因项目需要,要对主流的几家抗DDoS设备做测评,当然 ...

  4. [洛谷P3857][TJOI2008]彩灯

    题目大意:有$n$盏灯,$m$个开关($n,m\leqslant 50$),每个开关可以控制的灯用一串$OX$串表示,$O$表示可以控制(即按一下,灯的状态改变),$X$表示不可以控制,问有多少种灯的 ...

  5. [GDOI2016] 疯狂动物园 [树链剖分+可持久化线段树]

    题面 太长了,而且解释的不清楚,我来给个简化版的题意: 给定一棵$n$个点的数,每个点有点权,你需要实现以下$m$个操作 操作1,把$x$到$y$的路径上的所有点的权值都加上$delta$,并且更新一 ...

  6. 淀粉质模板 Tree

    Tree 题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式: N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 ...

  7. P2659 美丽的序列 (单调栈)

    题目链接 Solution 直接考虑单调栈处理出每一个点作为最小值的区间长度. 然后 \(O(n)\) 找一遍最大值即可. 记得开 long long,以及要注意 \(0\) 的问题. Code #i ...

  8. 转:mysql grant

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...

  9. tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结

    有段时间 扑了一个多月的在一个wifi的前端项目上 快做完时 各种小问题一堆一堆的修复 处理了一些很零散的问题 因为页面有一个所有页面都有一个背景色 有的页面有背景图 主要重点是移动前端的方向 因为现 ...

  10. 【ZOJ4063】Tournament(构造)

    题意:n个人要打m轮比赛 每一轮每个人都要有一个对手.而且每个对手只能打一次.假设a与b打了,c与d打了, 那么后面的任意一轮如果a与c打了,那么b就必须和d打 问是否存在方案,输出字典序最小的一组, ...