`
zqjshiyingxiong
  • 浏览: 440426 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

rmi of spring

    博客分类:
  • JAVA
阅读更多
基于Spring实现远程服务编程:
[urlhttp://www.51cto.com/art/200611/34262.htm][/url]


用Spring动态调用RMI远程对象    

// 不需要通过BeanFactory直接动态调用远程对象

DistributeCenterBO distributeCenterBO = null;
RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
rmiProxyFactoryBean.setServiceInterface(DistributeCenterBO.class);
rmiProxyFactoryBean.setServiceUrl(
"rmi://localhost:1199/DistributeCenterBO");
try {
rmiProxyFactoryBean.afterPropertiesSet(); //更改ServiceInterface或ServiceUrl之后必须调用该方法,来获取远程调用桩
} catch (Exception ex) {
}

if (rmiProxyFactoryBean.getObject() instanceof DistributeCenterBO) {
distributeCenterBO = (DistributeCenterBO)
rmiProxyFactoryBean.getObject();
distributeCenterBO.register(SubscriberImpl.subscriberId);
}


rmi和httpInvoker

对于富客户端来说,和服务器端的通讯有很多种方式,不过我一般用的就是rmi或者httpInvoker。
spring为多种远程调用都提供了包装:
一。对于RMI来说
1、服务器端: <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
  <property name="serviceName"><value>ExampleService</value></property>
  <property name="service"><ref bean="exampleManager"/></property>
  <property name="serviceInterface"><value>com.example.server.service.manager.base.IExampleManager</value></property>
  <property name="registryPort"><value>777</value></property>
</bean>


Spring中合理的配置RMI:

因为RMI stub被连接到特定的端点,不仅仅是为每个调用打开一个给定的目标地址的连接,所以如果重新启动RMI端点主机的服务器,那么就需要重新注册这些stub,并且客户端需要再次查询它们。
     虽然目标服务的重新注册在重新启动时通常会自动发生,不过此时客户端保持的stub将会变的陈旧,且客户端不会注意这些,除非他们再次尝试调用stub上的方法,而这也将throw一个连接失败的异常。
      为了避免这种情形,Spring的RmiProxyFactoryBean提供了一个refreshStubOnConnectFailure的bean属性,如果调用失败,并且连接异常的话,将它设定为true来强制重新自动查询stub。
<bean id="reportService"
  class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  <property name="serviceUrl">
   <value>${showcasewiz.report.serviceurl}</value>
  </property>
  <property name="serviceInterface">
   <value>com.meetexpo.showcase.backend.service.ReportService</value>
  </property>
  <property name="refreshStubOnConnectFailure">
    <value>true</value>
  </property>

</bean>
      stub查询的另一个问题是,目标RMI服务器和RMI注册项在查询时要为可用的。如果客户端在服务器启动之前,尝试查询和缓存该服务stub,那么客户端的启动将会失败(即使还不需要该服务)。
     为了能够惰性查询服务stub,设定RmiProxyFactoryBean的lookupStubOnStarup标志为false。然后在第一次访问时查询该stub,也就是说,当代理上的第一个方法被调用的时候去主动查询stub,同时被缓存。这也有一个缺点,就是直到第一次调用,否则无法确认目标服务是否实际存在。
<bean id="reportService"
  class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  <property name="serviceUrl">
   <value>${showcasewiz.report.serviceurl}</value>
  </property>
  <property name="serviceInterface">
   <value>com.meetexpo.showcase.backend.service.ReportService</value>
  </property>
  <property name="lookupStubOnStartup">
     <value>false</value>
  </property>
  <property name="refreshStubOnConnectFailure">
    <value>true</value>
  </property>

</bean>

还有一个属性就是cacheStub,当它设置为false的时候,就完全避免了stub的缓存,但影响了性能。需要的时候还是可以试试。



这段spring的配置文件就定义了服务器端的一个bean,可以暴露给客户端通过RMI方式来访问了。
examleMaanger这个bean在实现时,完全不需要知道它自己有一天还会被通过rmi方式被远程访问。
2、客户端:
<bean id="cityService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
        <property name="serviceUrl"><value>rmi://localhost:777/CityService</value></property>
        <property name="serviceInterface"><value>com.example.server.service.manager.base.IExampleManager</value></property>
        <property name="lookupStubOnStartup"><value>true</value></property>
        <property name="cacheStub"><value>true</value></property>
    </bean>这段spring的配置文件定义了客户端的一个bean,这样就可在客户端使用exampleManager了,就如同在本地使用一样,完全没有什么不同。







二。对于httpInvoker来说,其配置比rmi方式要麻烦一些,而且据说其效率也要比rmi方式差,不过这一点我到没有亲身证实过,只是听说而已。但是httpInvoker有一个优点却足以抵消其所有的缺点,那就是它是通过web的端口来访问的。这样,只要能够浏览页面,就能够进行远程调用,避免了rmi方式有时无法通过防火墙的问题。
1、服务器端:
httpInvoker需要web容器的支持,因此需要将服务器端程序部署到web容器内。
在web.xml文件中
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>remote</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>remote</servlet-name>
        <url-pattern>/remote/*</url-pattern>
    </servlet-mapping>
注意第一行定义的listener一定要有,否则下面提到的remote-servlet.xml中要引用的bean就会无法找到。
我们定义了一个servlet,名字叫remote,因此在WEB-INF目录下我们建一个名字为remote-servlet.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 name="/exampleService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service"><ref bean="exampleManager"/></property>
        <property name="serviceInterface">
            <value>com.example.server.service.manager.IExampleManager</value>
        </property>
    </bean>
</beans>这样服务器端的配置就完成了。exampleManager这个bean被暴露给了客户端
2、客户端:
<bean id="exampleService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
        <property name="serviceUrl">
            <value>http://localhost:80/remote/exampleService</value>
        </property>
        <property name="serviceInterface">
            <value>com.example.server.service.manager.IExampleManager</value>
        </property>
    </bean> OK,这样客户端的配置就完成了。
分享到:
评论
2 楼 biby 2008-09-09  
,高级用法还是得看源码啊
1 楼 bohemia 2008-08-29  
//Set whether to look up the RMI stub on startup. 
void setLookupStubOnStartup(boolean lookupStubOnStartup) 
          

//Set whether to refresh the RMI stub on connect failure. 
void setRefreshStubOnConnectFailure(boolean refreshStubOnConnectFailure) 


看到API,才知道,有这两个属性可以设置; 而官方的Reference却没提及;
这个是缺憾..
         

相关推荐

    spring rmi应用

    Spring RMI整合了RMI机制,提供了一种更加灵活和易于管理的方式,让开发者可以在Spring容器中定义远程服务,并通过Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)特性来增强这些服务。...

    Spring 实现远程访问详解——rmi

    6. JAX-WS:Spring通过JAX-WS为远程Web服务提供支持(the successor of JAX-RPC, as introduced in Java EE 5 and Java 6)。 7. JMS:远程访问通过类JmsInvokerServiceExporter和JmsInvokerProxyFactoryBean使用JMS的...

    spring RMI 远程接口调用

    在Spring中,RMI的实现被集成到IoC(Inversion of Control)容器中,这样可以方便地管理和配置远程服务。 服务端的实现通常包括以下步骤: 1. **定义远程接口**:这是服务端提供给客户端调用的接口,需要使用`@...

    Spring Recipes: A Problem-Solution Approach, Second Edition

    * Spring’s support for remoting technologies (RMI, Hessian, Burlap, and HTTP Invoker), EJB, JMS, JMX, email, batch, scheduling, and scripting languages. * Integrating legacy systems with Spring, ...

    Spring Framework 4 参考文档中文版.docx

    * 控制反转(Inversion of Control)是 Spring Framework 的 IoC 组件,它提供了一套固定的方法将不同的组件组合成完整的、随时可用的应用程序。 * 依赖注入解决了 Java 应用程序中对象彼此依赖的问题。 三、Spring...

    spring 2.0中文参考手册

    手册详细介绍了如何利用Spring来构建高效、可维护的软件系统,包括了Spring的IoC(Inversion of Control)容器、AOP(Aspect-Oriented Programming)面向切面编程、数据访问、Web应用以及更多实用功能。 首先,...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    如果你的应用仅仅用到简单的Inversion of Control / Dependency Injection(IoC/DI)容器,那么只需spring-core.jar与spring-beans.jar即可;如果你对发布的大小要求很高,那么就得精挑细选了,只取包含自己所需特性...

    最新最全的spring开发包

    这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及...

    简易实现Spring流程代码

    Spring框架是Java开发中广泛应用的一个开源框架,以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)功能而著名。本篇文章将详细解析Spring框架的初始化过程,...

    Apress.Pro.Spring.4th.Edition

    - **远程调用**:Spring支持多种远程调用协议,如HTTP invoker、RMI等。 - **服务端与客户端**:介绍了如何实现服务端与客户端的通信。 #### 13. Spring测试 - **单元测试**:Spring提供了对单元测试的支持,可以...

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    Praise for the Third Edition of Spring in Action Preface Acknowledgments About this Book 1. Core Spring Chapter 1. Springing into action 1.1. Simplifying Java development 1.1.1. Unleashing the power ...

    J2EE mvc spring 配置

    Spring框架是Java领域中最流行的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)为核心设计理念。Spring提供了声明式事务管理、依赖注入、数据访问...

    浅谈 Spring 原理 透析,ioc aop

    传统的 EJB 开发模式需要实现 RMI 和 HOME 等接口,提供分布式功能,并且必须在 EJB 容器中运行,需要给不同的 EJB 容器配置不同的描述文件。相比之下,Spring 框架更轻量级、更灵活。 Spring 框架的基础 Spring ...

    开源框架 Spring Gossip

    简介 Spring Inversion of Control Dependency Injection &lt;br&gt; 核心容器 Spring 核心容器实作了 IoC,BeanFactory 与 ApplicationContext 的运用是了解 Spring 的重点所在。 管理 Bean...

    计算机专业Java外文翻译 中文+英文(Spring框架介绍)

    Spring的核心理念是控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection),通过“bean工厂”这一核心组件实现。 “Bean工厂”是Spring框架的基石,它是一个管理对象(称为beans)生命周期和...

    spring-framework-reference 4.3.8.RELEASE

    Framework supports declarative transaction management, remote access to your logic through RMI or web services, and various options for persisting your data. It offers a full-featured MVC framework, ...

    [Pro.Spring.3(2012)].Clarence.Ho.文字版

    Spring框架是一个开源的Java平台,它提供了控制反转(Inversion of Control,IoC)容器、面向切面编程(Aspect-Oriented Programming,AOP)功能、声明式事务管理、持久层框架整合、MVC Web框架、测试支持等功能。...

    Spring开发指南

    Remoting部分则涉及到远程方法调用(Remote Method Invocation,简称RMI)和远程过程调用(Remote Procedure Call,简称RPC),以及如何在Spring中实现它们。 总的来说,Spring开发指南是对Spring框架从基础到高级...

Global site tag (gtag.js) - Google Analytics