- 浏览: 440426 次
- 性别:
- 来自: 无锡
文章分类
最新评论
-
belonghu:
这还和字段是否主键,加索引,有很大关系,我对一个索引的字段查询 ...
MYSQL每日一用:SELECT 语句中比对(between and \ like \ left) -
lqingqingzijin:
好,就是想知道怎样将默认bash修改成nologin
我怎么创建和修改用户帐号,让它有一个nologin shell? -
yangxiutian:
“在jar中添加了字体”是什么意思?
java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:299) -
ljhard_1030:
楼主学习了,以后继续发表这类的文章,会继续光临的。。
刨根问底(Proxool连接池设置) -
RobustTm:
Selenium中使用的貌似是Junit 3.x,上面的例子也 ...
使用Selenium 和Junit 进行WEB功能测试
基于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,这样客户端的配置就完成了。
看到API,才知道,有这两个属性可以设置; 而官方的Reference却没提及;
这个是缺憾..
[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却没提及;
这个是缺憾..
发表评论
-
activemq 使用经验
2011-07-19 00:14 7022ActiveMQ 是apache的一个开源JMS服务器, ... -
quartz无法启动的原因
2011-04-21 21:06 3462quartz无法启动的原因 场景:spring集 ... -
使用Selenium 和Junit 进行WEB功能测试
2010-10-12 16:54 17697下载 用firefox 到http://seleni ... -
java反编译工具
2010-07-21 10:56 1172这款反编译器叫 "Java Decompiler ... -
运行一个可执行的Jar时,Classpath的设置无效问题,java的-cp和-jar参数不能
2010-07-12 14:26 3815情况为:在cmd中,运行java -jar *.jar,出现c ... -
实践中整理出tomcat集群和负载均衡
2010-07-09 18:18 995实践中整理出tomcat集群和负载均衡 ... -
linux JAVA环境安装和配置
2010-07-06 11:19 0服务器安装配置: linux创建ftp用户 ... -
tomcat 日志文件catalina按日划分
2010-06-13 13:54 1654#!/bin/bash cd `dirname $0` ... -
java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:299)
2010-05-26 22:11 4886在做项目时,老是第一次报一下错误: java.u ... -
URL中中文乱码
2010-05-10 13:28 1150乱码有时候是让我们最头疼,但是根据多年的经验: ... -
解决Linux下Java中文乱码问题
2010-04-13 12:45 21607情况说明: 本地测试数据正常,发布到服务器(centos)后 ... -
正则表达式匹配中文字符,Ctrl+F的福音!
2010-03-23 00:06 1843匹配中文字符的正则表达式: [\u4e00-\u9fa5] ... -
代码严谨度的重要性和耦合的重要性
2010-03-08 17:03 1303情况是:星期六,同时打我电话,说平台动不了,让我解决一下 ... -
测试:strust1.0+jsp做出的系统中出现的串号问题
2010-02-03 10:52 0测试:strust1.0+jsp做出的系统中出现的串号问题 ... -
java 中 List<String> 拆分成 带标记的 List<String>
2009-12-23 15:38 2979public class TransList { ... -
error:SQLServer 2000 Driver for JDBC]Broken pipe
2009-12-21 11:39 2118环境是:linux(red hat) tomcat5.0 j ... -
java或web中解决所有路径问题(最全分析绝对有你要的)
2009-08-25 14:01 2035java或web中解决所有路径 ... -
ibatis 保存修改时都是乱码
2009-07-22 13:21 1919ibatis 保存修改时都是乱码? 这个问题困恼了我好 ... -
AXIS2 学习心得
2009-07-03 17:47 1753首先,想大家介绍一个非常不错的学习axis2的教学网址: ... -
乱码问题——常量提示录——提示Java的编译常量的一个问题
2009-06-04 14:22 1522问题是:有两个JAVA文件,第一个里面放的是常量,第二个 ...
相关推荐
Spring RMI整合了RMI机制,提供了一种更加灵活和易于管理的方式,让开发者可以在Spring容器中定义远程服务,并通过Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)特性来增强这些服务。...
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的实现被集成到IoC(Inversion of Control)容器中,这样可以方便地管理和配置远程服务。 服务端的实现通常包括以下步骤: 1. **定义远程接口**:这是服务端提供给客户端调用的接口,需要使用`@...
* 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, ...
* 控制反转(Inversion of Control)是 Spring Framework 的 IoC 组件,它提供了一套固定的方法将不同的组件组合成完整的、随时可用的应用程序。 * 依赖注入解决了 Java 应用程序中对象彼此依赖的问题。 三、Spring...
手册详细介绍了如何利用Spring来构建高效、可维护的软件系统,包括了Spring的IoC(Inversion of Control)容器、AOP(Aspect-Oriented Programming)面向切面编程、数据访问、Web应用以及更多实用功能。 首先,...
如果你的应用仅仅用到简单的Inversion of Control / Dependency Injection(IoC/DI)容器,那么只需spring-core.jar与spring-beans.jar即可;如果你对发布的大小要求很高,那么就得精挑细选了,只取包含自己所需特性...
这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及...
Spring框架是Java开发中广泛应用的一个开源框架,以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)功能而著名。本篇文章将详细解析Spring框架的初始化过程,...
- **远程调用**:Spring支持多种远程调用协议,如HTTP invoker、RMI等。 - **服务端与客户端**:介绍了如何实现服务端与客户端的通信。 #### 13. Spring测试 - **单元测试**:Spring提供了对单元测试的支持,可以...
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 ...
Spring框架是Java领域中最流行的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)为核心设计理念。Spring提供了声明式事务管理、依赖注入、数据访问...
传统的 EJB 开发模式需要实现 RMI 和 HOME 等接口,提供分布式功能,并且必须在 EJB 容器中运行,需要给不同的 EJB 容器配置不同的描述文件。相比之下,Spring 框架更轻量级、更灵活。 Spring 框架的基础 Spring ...
简介 Spring Inversion of Control Dependency Injection <br> 核心容器 Spring 核心容器实作了 IoC,BeanFactory 与 ApplicationContext 的运用是了解 Spring 的重点所在。 管理 Bean...
Spring的核心理念是控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection),通过“bean工厂”这一核心组件实现。 “Bean工厂”是Spring框架的基石,它是一个管理对象(称为beans)生命周期和...
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, ...
Spring框架是一个开源的Java平台,它提供了控制反转(Inversion of Control,IoC)容器、面向切面编程(Aspect-Oriented Programming,AOP)功能、声明式事务管理、持久层框架整合、MVC Web框架、测试支持等功能。...
Remoting部分则涉及到远程方法调用(Remote Method Invocation,简称RMI)和远程过程调用(Remote Procedure Call,简称RPC),以及如何在Spring中实现它们。 总的来说,Spring开发指南是对Spring框架从基础到高级...