文档章节

RMI解耦生命周期

zhengjunbo
 zhengjunbo
发布于 2014/09/28 16:05
字数 607
阅读 37
收藏 0

在使用 RMI的时候,发现生命周期绑定,在停止了下级服务重启的时候,上级也要跟着重启,否则连不上。以下是找到的处理办法 

1、设置refreshStubOnConnectFailure自动重连

2、设置lookupStubOnStarup将连接缓存



因为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的缓存,但影响了性能。需要的时候还是可以试试。
 
利用上面的配置最大的优点是将客户端和服务器端的生命周期尽可能的去耦,我想在项目中应该会用的到的。
 

© 著作权归作者所有

zhengjunbo
粉丝 1
博文 29
码字总数 10871
作品 0
广州
私信 提问
分布式子系统间的耦合性问题?

场景: 假设现在有三台机器分别部署了子系统A、子系统B、子系统C,子系统A中需要调用子系统B,子系统C又需要调用子系统A,这种情况下如果子系统非常多且调用关系负责的时候,采用RMI或hessi...

风象南
2016/04/12
246
4
模块化解耦框架RxFluxArchitecture5-Application多模块共存

相关系列文章 模块化解耦框架RxFluxArchitecture1-框架简介 模块化解耦框架RxFluxArchitecture2-基本功能实现 模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期 模块化解耦框架RxFlu...

coolfireApy
05/12
0
0
Spring IoC(更新中)

概念 IoC(控制反转,也叫依赖注入DI)是Spring的核心,几乎Spring的所有组件都要建立在此基础之上,包括AOP,声明式事务,SpringMVC等等。那么IoC的主要目的是什么呢?两个字“解耦”。为什么...

互联网小龙虾
2014/03/04
160
0
Vue 2.0 浅谈--生命周期和钩子函数

前言 生命周期和钩子函数-介绍 啥也不说先上图 图-1为 Vue 1.0 生命周期图,图-2为 Vue 2.0 生命周期图,图-3为Vue 1.0 和 Vue 2.0 钩子函数比较 重点看 Vue 2.0 生命周期和钩子函数-具体 上代...

青棘
2017/06/06
0
0
在小程序中实现 Mixins 方案

原文来自我的博客:jrainlau.github.io/#/article?n… 在原生开发小程序的过程中,发现有多个页面都使用了几乎完全一样的逻辑。由于小程序官方并没有提供 Mixins 这种代码复用机制,所以只能...

Jrain
06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部