Spring整合Rmi总结

标签: spring rmi | 发表时间:2014-10-07 22:01 | 作者:Maskdfe
出处:http://blog.csdn.net

在Spring整合Rmi中:

服务端使用了org.springframework.remoting.rmi.RmiServiceExporter

RmiServiceExporter把任何Spring管理的Bean输出成一个RMI服务。通过把Bean包装在一个适配器类中工作。适配器类被绑定到RMI注册表中,并且将请求代理给服务类。

客户端使用了org.springframework.remoting.rmi.RmiProxyFactoryBean

客户端的核心是RmiProxyFactoryBean,包含serviceURL属性和serviceInterface属性。

通过JRMP访问服务。JRMP JRMP:java remote method protocol,Java特有的,基于流的协议。

 

下面给出简单例子

服务端程序:

新建接口:

 

  1. <span style="font-size:18px;color:#3333ff;">/** 
  2.  * IRmiServer.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-08-08 11:12:40 
  5.  */  
  6. package com.cayden.rmi;  
  7.   
  8. /** 
  9.  * TODO 
  10.  * @author cuiran 
  11.  * @version TODO 
  12.  */  
  13. public interface IRmiServer {  
  14.       
  15.     public boolean test();  
  16.   
  17. }  
  18. </span>  


再实现该接口的方法:

  1. <span style="font-size:18px;color:#3333ff;">/** 
  2.  * RmiServerImpl.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-08-08 11:13:24 
  5.  */  
  6. package com.cayden.rmi.impl;  
  7.   
  8. import com.cayden.rmi.IRmiServer;  
  9.   
  10. /** 
  11.  * TODO 
  12.  * @author cuiran 
  13.  * @version TODO 
  14.  */  
  15. public class RmiServerImpl implements IRmiServer {  
  16.   
  17.     /* (non-Javadoc) 
  18.      * @see com.cayden.rmi.IRmiServer#test() 
  19.      */  
  20.     @Override  
  21.     public boolean test() {  
  22.       
  23.         System.out.println("调用了我--服务端 O(∩_∩)O哈!");  
  24.           
  25.         return true;  
  26.     }  
  27.   
  28. }  
  29. </span>  


在src下新建applicationContext.xml 配置文件

  1. <span style="font-size:18px;color:#3333ff;"><?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.         <!-- rmi -->  
  6.     <bean id="rmiService" class="com.cayden.rmi.impl.RmiServerImpl">  
  7.     </bean>  
  8.   
  9.     <bean id="remoteRmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">  
  10.         <property name="serviceName">  
  11.             <value>remoteService</value>  
  12.         </property>  
  13.         <property name="service" ref="rmiService" />  
  14.         <property name="serviceInterface">  
  15.             <value>com.cayden.rmi.IRmiServer</value>  
  16.         </property>  
  17.         <property name="registryPort">  
  18.             <value>9400</value>  
  19.         </property>  
  20.         <property name="servicePort">  
  21.             <value>9401</value>  
  22.         </property>  
  23.     </bean>  
  24. </beans></span>  


启动服务端的类【MainServer.java】

  1. <span style="font-size:18px;color:#3333ff;">package com.cayden.rmi;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. /** 
  6.  * MainServer.java 
  7.  * 版权所有(C) 2012  
  8.  * 创建:cuiran 2012-08-08 11:44:07 
  9.  */  
  10.   
  11. /** 
  12.  * TODO 
  13.  * @author cuiran 
  14.  * @version TODO 
  15.  */  
  16. public class MainServer {  
  17.   
  18.     /** 
  19.      * TODO 
  20.      * @param args 
  21.      */  
  22.     public static void main(String[] args) {  
  23.         // TODO Auto-generated method stub  
  24.         System.out.println("rmi服务端启动");  
  25.         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
  26.           
  27.         System.out.println("rmi服务端启动完成。。。");  
  28.     }  
  29.   
  30. }  
  31. </span>  

 

客户端代码:

在客户端使用服务端的接口文件:

  1. <span style="font-size:18px;color:#3333ff;">/** 
  2.  * IRmiServer.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-08-08 11:12:40 
  5.  */  
  6. package com.cayden.rmi;  
  7.   
  8. /** 
  9.  * TODO 
  10.  * @author cuiran 
  11.  * @version TODO 
  12.  */  
  13. public interface IRmiServer {  
  14.       
  15.     public boolean test();  
  16.   
  17. }  
  18. </span>  


然后在src下新建【applicationContext.xml】

  1. <span style="font-size:18px;color:#3333ff;"><?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.     <!-- rmi远程调用 -->  
  5.     <bean id="testRmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
  6.         <property name="serviceUrl">  
  7.             <value>rmi://127.0.0.1:9400/remoteService</value>  
  8.         </property>  
  9.         <property name="serviceInterface">  
  10.             <value>com.cayden.rmi.IRmiServer</value>  
  11.         </property>  
  12.     </bean>  
  13. </beans></span>  


最新新建客户端的测试类【TestRmi.java】

  1. <span style="font-size:18px;color:#3333ff;">/** 
  2.  * TestRmi.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-08-08 11:38:06 
  5.  */  
  6. package com.cayden.rmi.client;  
  7.   
  8. import org.springframework.context.ApplicationContext;  
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  10.   
  11. import com.cayden.rmi.IRmiServer;  
  12.   
  13. /** 
  14.  * TODO 
  15.  * @author cuiran 
  16.  * @version TODO 
  17.  */  
  18. public class TestRmi {  
  19.     public static void main(String[] arg) {  
  20.         System.out.println("rmi客户端开始调用");  
  21.         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
  22.         IRmiServer rmi=(IRmiServer)ctx.getBean("testRmiService");  
  23.         rmi.test();  
  24.         System.out.println("rmi客户端调用结束");  
  25.     }  
  26.   
  27. }  
  28. </span>  


 

最后控制台输出

服务端:

  1. <span style="font-size:18px;color:#3333ff;">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. 调用了我--服务端 O(∩_∩)O哈!  
  6. </span>  


客户端:

  1. <span style="font-size:18px;color:#3333ff;">rmi客户端开始调用  
  2. 2012-8-8 11:46:51 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
  3. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c29ab2: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1c29ab2]; startup date [Wed Aug 08 11:46:51 CST 2012]; root of context hierarchy  
  4. 2012-8-8 11:46:51 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
  5. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]  
  6. 2012-8-8 11:46:51 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory  
  7. 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1c29ab2]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1e0bc08  
  8. 2012-8-8 11:46:51 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
  9. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1e0bc08: defining beans [testRmiService]; root of factory hierarchy  
  10. rmi客户端调用结束  
  11. </span>  
作者:Maskdfe 发表于2014-10-7 14:01:06 原文链接
阅读:74 评论:0 查看评论

相关 [spring rmi] 推荐:

Spring Rmi配置

- - 企业架构 - ITeye博客
现在远程调用一般用RPC,webservice或者Rmi,而目前用的比较多的是webservice和Rmi. webservice和rmi的最主要的区别,rmi的客户端和服务端都必须是java,webservice没有这个限制,webservice是在http协议上传递xml文本文件. 与语言和平台无关,rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言.

Spring整合Rmi总结

- - CSDN博客架构设计推荐文章
服务端使用了org.springframework.remoting.rmi.RmiServiceExporter. RmiServiceExporter把任何Spring管理的Bean输出成一个RMI服务. 通过把Bean包装在一个适配器类中工作. 适配器类被绑定到RMI注册表中,并且将请求代理给服务类.

RMI与JNDI集成服务实例

- - 编程语言 - ITeye博客
     下午和莉莉讨论JNDI,感觉网上好多资料都写到太过于高深莫测了,具体了解了之后,发现JNDI的使用目的,最根本的就是java应用通过一个名字获取其他JVM中的数据. 而在提供JNDI服务的服务端应用中,建立了一个类似键值对的形式,存储JNDI的名字和数据的绑定. 这就类似于数据库的连接池,不必每次去连接数据库都重新建立一个连接,而是直接从连接池中获取已有连接拿来使用即可,节省了内存同时也优化了效率.

使用 RMI + ZooKeeper 实现远程调用框架

- - zzm
1.1 定义一个 RMI 接口. 1.2 编写 RMI 接口的实现类. 1.3 通过 JNDI 发布 RMI 服务. 4 使用 ZooKeeper 提供高可用的 RMI 服务. 在 Java 世界里,有一种技术可以实现“跨虚拟机”的调用,它就是 . RMI(Remote Method Invocation,远程方法调用).

分布式通信的几种方式(EJB、RMI、RPC、JMS、web service杂谈)

- - CSDN博客互联网推荐文章
RPC是远程过程调用协议,它是基于C/S模型调用的机制,客户机向服务器端发送调用请求等待服务器应答,是一种典型的请求应答机制,大致过程可以理解为本地分布式对象向本机发请求,不用自己编写底层通信本机会通过网络向服务器发送请求,服务器对象接受参数后,经过处理再把处理后的结果发送回客户端. 它是早期的支持分布式一些,缺点rpc是面向过程的远程调用,不支持面向对象,所以现在用的人就少了.

Spring详解

- - CSDN博客架构设计推荐文章
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.. PersonDaoBean 是在应用内部创建及维护的. 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.

Spring定时

- - 行业应用 - ITeye博客
spring的定时任务配置分为三个步骤:. . . . . .

简单Spring+hessian

- - Web前端 - ITeye博客
简单的Spring+hessian. dist\modules里面的 spring-webmvc.jar . lib\caucho 里面的hessian-3.1.3.jar. 里面有个接口interface:. 建立一个model层:(实现Serializable接口). 在WEB-INF下面创建一个remoting-servlet.xml:.

Spring MVC 和 Struts2

- - CSDN博客架构设计推荐文章
Web层面的框架学习了三个Struts1和2,SpringMVC,那他们之间肯定存在一个优劣和适用的环境,Struts1和2的异同点我已经做过对比《 Struts1和Struts2》,这篇将对比下Struts2和SpringMVC的异同,下面数据基本来源于网络,本人是搜集整理所得,供大家参考. 一个项目使用什么样的技术,决定的因素很多,我所能想到的有:对系统的性能、开发的效率、团队学习的成本、业务场景等,下面尽量从这几个方面入手,来分析比较下他们之间存在的优劣.

Spring AOP详解

- - Java - 编程语言 - ITeye博客
        最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP来解决. 一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容. 例如,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 1.对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况.