Spring Rmi配置

标签: spring rmi | 发表时间:2014-08-30 23:27 | 作者:panjunke2012
出处:http://www.iteye.com
现在远程调用一般用RPC,webservice或者Rmi,而目前用的比较多的是webservice和Rmi。

webservice和rmi的最主要的区别,rmi的客户端和服务端都必须是java,webservice没有这个限制,webservice是在http协议上传递xml文本文件。与语言和平台无关,rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言。 RMI是EJB远程调用的基础,仅用RMI技术就可以实现远程调用,使用EJB是为了实现组件,事物,资源池,集群等功能.WebService是通过XML来传输数据,可用http等协议因此可在异构系统间传递,并且可以穿过防火墙,可在公网上远程调用。

以下是spring中配置Rmi的一个简单例子:

1.首先在src下建立一个接口(本人的是com.shinelife.inter):

package com.shinelife.inter;

public interface IBaseServiceRmi {
    public String SayHelloRmi(String name);
}

2.然后实现接口的方法:

package com.shinelife.services;

import com.shinelife.inter.IBaseServiceRmi;

public class BaseServiceRmi implements IBaseServiceRmi {

  public String SayHelloRmi(String name) {
          // TODO Auto-generated method stub
          return "Hello: "+name;
     }

}

3.然后就是配置remote.xml:

在src下面新建一个xml文件然后复制添加以下内容(注:头文件的对象配置很重要,配置不当会报错):

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring 远程服务对象配置-->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:flex="http://www.springframework.org/schema/flex"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

   <!-- 远程对象暴露  开始 -->
   
        <bean id="BaseServiceRmiExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
         <!-- 调用Service --> 
        <property name="service">
            <ref bean="BaseServiceRmi" />
        </property>
        <!-- 客户端调用时使用的名字 -->
        <!-- value值是给用户调用 --> 
        <property name="serviceName">
            <value>BaseServiceRmi</value>
        </property>
        <!-- service 接口 -->
        <property name="serviceInterface">
            <value>com.shinelife.inter.IBaseServiceRmi
            </value>
        </property>
        <!-- 注册端口号 --> 
        <property name="registryPort">
            <value>6100</value>
        </property>
        <property name="servicePort">
            <value>7100</value>
        </property>
    </bean>
  <!-- 远程对象暴露  结束 -->
</beans>

4.本人以上的例子是自己建立的一个remote.xml文件,而一般都是直接把这些配置到spring的配置文件applicationContext.xml里,而这种在这里就不研究了。主要说说外部配置Rmi的方式。

光是添加了一个remote.xml是不够的,还需要在spring的applicationContext.xml里面注入:

<bean id="BaseServiceRmi" class="com.shinelife.services.BaseServiceRmi"></bean>

这样spring才能找到并加载这个bean。

5.由于本人的是webservice项目,所以启动服务是用的配置web.xml,也可以用main入口函数加载,对于main加载,就不讲述了,这里讲述web.xml配置,以下是web.xml的部分内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.5"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/classes/applicationContext.xml,classpath:remote.xml
       </param-value>
    </context-param>

</web-app>

以上是服务端方面的配置,下面是客户端:

6.将com.shinelife.inter整个包拷贝到客户端下(注意服务端与客户端的包名保持一致)

7.在客户端的src下面新建一个Rmi.xml的文件,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
  "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   
    <bean id="BaseServiceRmi" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">       
         <!-- BaseService是调用服务端serviceName的value --> 
        <property name="serviceUrl">
            <value>rmi://127.0.0.1:6100/BaseServiceRmi</value>
        </property>
         <!-- service接口 --> 
        <property name="serviceInterface">
            <value>com.shinelife.inter.IBaseServiceRmi</value>
        </property>
    </bean>
</beans>

8.然后建立一个main函数测试Rmi服务:

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import com.shinelife.inter.IBaseServiceRmi;

public class testRmi {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:Rmi.xml"); 
        IBaseServiceRmi baseService = (IBaseServiceRmi) context.getBean("BaseServiceRmi");
        System.out.println( baseService.SayHelloRmi("Joker"));
    }
}

9.测试结果:Hello: Joker

10.总结:Rmi是一个比较高效的远程调用方式,可以将整个函数方法作为参数进行远程调用,达到通信的目的,利用Rmi也可以减少很多的工作量。当然,在其他方面本人就不做结论,本人这也是分享一下搭建Rmi的方法。以便以后学习。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [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.对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况.