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网络编程(socket模块、缓冲区、http协议)

      网络的概念:主机   端口  IP  协议 服务器: localhost/127.0.0.1 客户端: 只是在本机启动客户端,用127.0.0.1访问     服务器: 0.0.0.0 客户端: ...

  2. heat应用

    作为OpenStack中的编排引擎,Heat能够出色的完成编排任务,井井有条地管理编排出来的资源.但同时,Heat也是一个出色的应用部署引擎,它提供了一套内置的框架去完成一系列复杂的应用部署任务. 使 ...

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

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

  4. ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 M: 当总统

    http://acm.ocrosoft.com/problem.php?cid=1316&pid=12 题目描述 小明想当丑国的总统,丑国大选是按各州的投票结果来确定最终的结果的,如果得到超过 ...

  5. spring security注解(1)

    Chapter 15. 基于表达式的权限控制 Spring Security 3.0介绍了使用Spring EL表达式的能力,作为一种验证机制 添加简单的配置属性的使用和访问决策投票,就像以前一样. ...

  6. CSS使用示例

    CSS的存在就是将网页的内容与内容展示的方式进行了分离. 使用CSS的方式有好几种,最常用的是通过引入外部CSS文件进行使用 HTML <!DOCTYPE html> <html&g ...

  7. 【bzoj2694】Lcm 莫比乌斯反演+线性筛

    题目描述 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m|\mu(gcd(i,j))|lcm(i,j)$,即$gcd(i,j)$不存在平方因子的$lcm(i,j)$之 ...

  8. Codeforces755D PolandBall and Polygan

    题目戳这里 我们只需要计算每增加一条线后穿过了几条已有的线即可.为了方便,我们令\(K \le N/2\),并且给每条线一个方向,即\(x\)到\((x+K) \; mod \; N\).然后我们假设 ...

  9. 虚拟机——mnt_hgfs下无目录情况解决

    /mnt/hgfs下无目录情况解决: VMware8虚拟机安装Ubuntu 11.10使用share folders共享目录将虚拟机掉电关闭(不能暂停),设置share folders目录,重启虚拟机 ...

  10. 刷题总结——Throw nails(hdu4393)

    题目: Problem Description The annual school bicycle contest started. ZL is a student in this school. H ...