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客户端调用完成...

转载于:https://www.cnblogs.com/edgedance/p/6984135.html

spirng整合rmi相关推荐

  1. Spring源码深度解析(郝佳)-学习-RMI使用及Spring源码解读

    java远程方法调用.即Java RMI(Java Remote Method Invocation),是Java编程语言里一种用于实现远程过程调用的应用程序编程接口,它使客户机上运行的程序可以调用远 ...

  2. maven环境下SSH整合

    目录 Maven环境下SSH整合 1 目录结构: 1 1. 导入jar包 2 1.1搭建maven环境 2 1.2配置pom.xml文件 2 1.2.1 pom.xml 2 2. 搭建struts2环 ...

  3. SSM学习——SSM整合案例(Spring+SpringMVC+Mybatis)(13)

    这里写目录标题 要求 Spirng整合Mybatis Spirng整合SpringMVC 表与实体类的创建 创建层级 Dao层 Service层 controller层 接口测试 业务层`servic ...

  4. 腾讯云COS对象存储图片文件API的详细步骤过程

    首先创建一个桶.相当于你存储图片的容器.我这里是存储图片. 我选则是共有读,私有写.因为不选择共有读的话,以后别的地方没办法访问 注意: 公有读权限可以通过匿名身份直接读取您存储桶中的数据,存在一定的 ...

  5. Ehcache缓存配置和基本使用

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

  6. java的Apollo的功能_Apollo配置中心

    1什么是配置中心? 传统单体应用存在一些潜在缺陷,如随着规模的扩大,部署效率降低,团队协作效率差,系统可靠性变差,维护困难,新功能上线周期长等,所以迫切需要一种新的架构去解决这些问题,而微服务( mi ...

  7. SpringBoot入门到精通-SpringBoot启动流程(七)

    定义自己的starter SpringBoot入门到精通-Spring的注解编程(一) SpringBoot入门到精通-SpringBoot入门(二) SpringBoot入门到精通-Spring的基 ...

  8. 【Spring】Spring学习笔记完整篇

    文章目录 Spring 1.简介 优点 组成 弊端 2.IOC 控制反转 控制什么? 谁来控制? 反转? 依赖注入DI? IOC和DI关系 IOC本质 3.hello spring Applicati ...

  9. ssmpro-note

    ssmpro 笔记2 2104-ssmpro 学习的内容目录 > spirngboot vue node.js 京淘 nginx redis mycat # ssmpro2104本阶段学到的*动 ...

最新文章

  1. 树莓派3B用Ubuntu MATE安装ros
  2. js如何动态向 fileaddress: [fromurl]添加数据_N+增强能力系列(3) | 动态KV模块
  3. Strange Optimization(扩展欧几里得)
  4. 1.0 算法本机调试方法
  5. python-函数定义
  6. C++工程师面试题大全
  7. 加入域时出现以下错误 登陆失败 该目标账户名称不正确_微信支付踩坑合集:微信小程序支付失败是什么原因?持续更新...
  8. Postgres psql: 致命错误: 角色 “postgres“ 不存在
  9. PHP设计模式——装饰器模式
  10. oracle按特定字符截取字符串_LeetCode基础算法题第159篇:找出由特定字符数组组成的字符串...
  11. Unity-中英对照汉化
  12. C++语法篇之STL库
  13. IBM服务器管理口IMM使用指南
  14. 计算机绘图入门,[2018年最新整理]AutoCAD计算机绘图入门.ppt
  15. 最新!中国内地大学ESI排名出炉:362所高校上榜!
  16. sed 去掉所有的换行符
  17. Linux cgroup详解(理论与实例)
  18. linux 引导内存,initramfs
  19. 编程新手如何快速提升coding能力?
  20. Redis遍历、模糊匹配key的两个命令keys、scan(python使用Redis)

热门文章

  1. 晨哥真有料丨及时止损的信号及可能的挽回方法
  2. oracle join过滤数据,oracle join on 数据过滤问题
  3. mysql技术简介_MySQL数据类型介绍
  4. Linux Man手册的使用示例
  5. 一个可变参数类型检查的示例
  6. php 解析返回的xml,php解析cas返回的xml解决思路
  7. 安卓 background的图片随着textview的大小而改变_关于CSS中的背景属性background简述...
  8. 【Redis】 redis hash getKey getValue 两个的性能差别
  9. 【elasticsearch】block.ClusterBlockException: blocked by: SERVICE_UNAVAILA
  10. 95-140-120-源码-transform-算子iterate