`
ecsoftcn
  • 浏览: 23544 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于远程调用(XFire/HttpInvoker/Hessian etc.)及远程服务管理的一些随想(下)

阅读更多

服务代理生成器( ServiceProxyGenerator )也是一个值得一提的地方,我们先看一下它的接口:

 

  1. /**   
  2.   * 服务代理生成器。   
  3.   *   
  4.   * @author Tony   
  5.   */    
  6. public interface ServiceProxyGenerator {    
  7.   
  8.     /**   
  9.      * 取得服务代理对象。   
  10.      *   
  11.      * @param serviceClass   
  12.      *             服务接口   
  13.      * @param serviceUrl   
  14.      *             服务地址   
  15.      * @param props   
  16.      *             附加属性   
  17.      * @return 代理对象   
  18.      * @throws Exception   
  19.      */    
  20.     Object getService(Class serviceClass, String serviceUrl, Properties props) throws Exception;    
  21. }    
  22.     
  23. /*它只有一个 getService() 方法,那么为什么设计这个接口?在什么地方使用呢?回答这个问题之前先来看看下面这段代码: */  
  24.     public void registService(ServiceModel serviceModel) throws ServiceException {    
  25.         ······    
  26.         String key = serviceModel.getServiceId() + KEY_SPAR    
  27.                      + serviceModel.getServiceClass().getName();    
  28.         if ( serviceNames .contains(key)) {    
  29.             throw new ServiceRegistException( "service is exist!" );    
  30.         }    
  31.         Object proxy = null ;    
  32.         try {    
  33.             ServiceProxyGenerator proxyGenerator = (ServiceProxyGenerator) beanFactory    
  34.                 .getBean(serviceModel.getServiceType() + PROXY_GENERATOR_END );    
  35.             proxy = proxyGenerator.getService(serviceModel.getServiceClass(), serviceModel    
  36.                 .getServiceUrl(), serviceModel.getProps());    
  37.         } catch (Exception e) {    
  38.             throw new ServiceRegistException( "can't regist service !" , e);    
  39.         }    
  40.         if (proxy != null ) {    
  41.             serviceNames .add(key);    
  42.             serviceContainer .put(key, proxy);    
  43.         } else {    
  44.             throw new ServiceRegistException( "fail to regist service !" );    
  45.         }    
  46.     }    

 

 

 上面做特殊标记的代码就是应用服务代理生成器的地方,这里我们用到了 Spring bean 工厂,根据注册服务的类型( xfire,httpinvoker,hessian 等)到 Spring 容器里查找相应的生成器,并生成指定类型的服务。看下面配置的几个服务代理生成器:

xml 代码

 

  1. <!---->    
  2.  < bean id = "xfire_generator" class = "com.tonysoft.common.service.repository.generator.XFireServiceProxyGenerator" lazy-init = "true" >    
  3.     < property name = "serviceFactory" >    
  4.         < ref bean = "xfire.serviceFactory" />    
  5.      property >    
  6.   bean >    
  7.   
  8.  <!---->    
  9.  < bean id = "hessian_generator" class = "com.tonysoft.common.service.repository.generator.HessianServiceProxyGenerator" lazy-init = "true" >    
  10.   bean >    
  11.   
  12.  <!---->    
  13.  < bean id = "httpinvoker_generator" class = "com.tonysoft.common.service.repository.generator.HttpInvokeServiceProxyGenerator" lazy-init = "true" >    
  14.   bean >    
  15.   
  16.  <!---->    
  17.  < bean id = "custom_generator" class = "com.tonysoft.common.service.repository.generator.CustomServiceProxyGenerator" lazy-init = "true" >    
  18.   bean >  
  19.   
  20.  <!---->    
  21.  < bean id = "serviceRepository" class = "com.tonysoft.common.service.repository.DefaultServiceRepository" >    
  22.   bean >    
  23.   
  24.  <!---->    
  25.  < bean id = "serviceIdProvider" class = "com.tonysoft.common.service.repository.provider.DefaultServiceIdProvider" >    
  26.   bean >    
  27.  <!---->    
  28.  < bean id = "abstractServiceProxyFactory" class = "com.tonysoft.common.service.repository.ServiceProxyFactory" abstract = "true" >    
  29.   bean >   

 

<o:p></o:p>

<o:p>简单看一下 HttpInvoker 类型服务代理生成器的代码: </o:p>

java 代码

 

  1. public class HttpInvokeServiceProxyGenerator implements ServiceProxyGenerator {    
  2.   
  3.     /** HttpInvoker 服务代理工厂 */    
  4.     private HttpInvokerProxyFactoryBean httpInvokerFactory = new HttpInvokerProxyFactoryBean();    
  5.     /*   
  6.      * @see com.alipay.xfiredemo.common.ServiceProxyGenerator#getService(java.lang.Class, java.lang.String,   
  7.      *      java.util.Properties)   
  8.      */    
  9.     public Object getService(Class serviceClass, String serviceUrl, Properties props) {    
  10.         // Todo initial httpInvokerFactory with props    
  11.         httpInvokerFactory .setServiceInterface(serviceClass);    
  12.   
  13.         httpInvokerFactory .setServiceUrl(serviceUrl);    
  14.   
  15.         // must invoke this method    
  16.         httpInvokerFactory .afterPropertiesSet();    
  17.   
  18.         return httpInvokerFactory .getObject();    
  19.   
  20.     }    
  21.   
  22. }    

<o:p>是的,正如你所看到的一样,我们这里把真正生成服务代理的任务交给了 Spring HttpInvokerProxyFactoryBean 来完成。 <o:p></o:p></o:p>

<o:p> </o:p>

提供在初始化时注册的静态服务功能,配制如下:

  1. <!---->  
  2. < bean id = "bootupServiceRegister" class = "com.tonysoft.common.service.repository.register.BootupServiceRegister" lazy-init = "false" >    
  3.        < property name = "services" >    
  4.            < list >    
  5. < bean class = "com.tonysoft.common.service.repository.ServiceModel" >    
  6.                   < property name = "serviceClass" >< value > com.tonysoft.common.service.repository.example.HelloHttpInvoker  value > property >    
  7.                   < property name = "serviceId" >< value > default  value > property >    
  8.                   < property name = "serviceType" >< value > httpinvoker  value > property >    
  9.                   < property name = "serviceUrl" >< value > http://localhost:8080/serviceRepositoryApplication/service/httpInvoker/helloHttpInvoker.service  value > property >    
  10.                   < property name = "props" >    
  11.                      < props > props >    
  12.                    property >    
  13.                bean >    
  14.               < bean class = "com.tonysoft.common.service.repository.ServiceModel" >    
  15.                   < property name = "serviceClass" >< value > com.tonysoft.common.service.repository.example.HelloXFire  value > property >    
  16.                   < property name = "serviceId" >< value > default  value > property >    
  17.                   < property name = "serviceType" >< value > xfire  value > property >    
  18.                   < property name = "serviceUrl" >< value > http://localhost:8080/serviceRepositoryApplication/service/xfire/helloXFire.service?WSDL  value > property >    
  19.                   < property name = "props" >    
  20.                      < props > props >    
  21.                    property >    
  22.                bean >        
  23.             list >    
  24.         property >    
  25.      bean >    

具体内容可以参看附件中的资源: <o:p></o:p>

一、 ServiceRepository 的源代码( Eclipse 工程) <o:p></o:p>

二、 一个示例应用 <o:p></o:p>

三、 打包部署的 ANT 脚本 <o:p></o:p>

<o:p> </o:p>

把项目导入 Eclipse 中,直接运行 Ant 脚本,在 target 目录下会生成服务中心的 jar 包,同时生成示例应用的 war 包,把 war 包放到任意服务器( Server )上并启动服务器并确保应用正常启动。 运行 ServiceRepositoryTest .java 执行完整的单元测试,观测结果。其他的自己看源码吧。

 

分享到:
评论
8 楼 ecsoftcn 2007-03-22  
jianfeng008cn 写道
没有Rest的ws吗?


这个自己很容易就可以扩展进来,只需要实现"ServiceProxyGenerator"接口提供获取服务.
7 楼 jianfeng008cn 2007-03-21  
没有Rest的ws吗?
6 楼 ecsoftcn 2007-03-20  
dovecat 写道
恩,确实不错!实际上是服务定位器模式的应用!
ps:我咋没看到附件呢?


附件在第一部分:http://www.iteye.com/topic/60681
5 楼 dovecat 2007-03-20  
恩,确实不错!实际上是服务定位器模式的应用!
ps:我咋没看到附件呢?
4 楼 ecsoftcn 2007-03-20  
生命火花 写道
为什么要把spring和xfire这样绑在一起!


我习惯于把ws物理独立出来!


不是把XFire和Spring绑在一起,而是通过一个高层的抽象,统一管理各种形式的远程服务。

把ws物理独立出来是什么意思?是专门为ws开一个服务器么?你这里的ws指的是标准的WS,还是指XFire?
3 楼 生命火花 2007-03-19  
为什么要把spring和xfire这样绑在一起!


我习惯于把ws物理独立出来!
2 楼 XMLDB 2007-03-19  
只有代码,随想呢?
1 楼 shaucle 2007-03-19  
用spring 封闭了传统的ws获取方式.使得用起来更方便,也可能更高效.
好文.

相关推荐

    Hessian 、 HttpInvoker 、 XFire 、 Axis

    通过定义一个`RemoteServicePool`接口,我们可以将具体的远程调用技术(如Hessian、HttpInvoker、XFire)的细节隐藏起来,开发者只需要通过接口方法`getService(String serviceId)`来获取服务,而无需关心服务的实现...

    远程调用服务框架

    Spring通过RmiProxyFactoryBean支持RMI服务的透明调用,客户端无需关心底层的网络通信细节,只需要像调用本地方法一样调用远程服务。 3. **Hessian**:Hessian是一种轻量级的二进制RPC协议,由Caucho公司开发。它...

    xfire-1.2.6.rar xfire-1.2.6.rar xfire-1.2.6.rar

    在1.2.6版本中,它提供了稳定、高效的服务,为游戏开发者提供了一种便捷的方式来构建和管理游戏网络架构。此压缩包文件包含了多个关键组件,让我们一一解析。 首先,`xfire-all-1.2.6.jar`是核心库文件,它集成了...

    xfire客户端jar包

    xfire-jar包包含了实现这些功能所需的类库,允许开发者通过Java代码与远程Web服务进行交互。 在描述中提到的"Demo样板",通常是一个预配置的示例程序,用于演示如何使用xfire客户端来连接和调用Web服务。然而,由于...

    xfire实现的实例和远程调用的客户端代码

    XFire提供了一个动态代理机制,使得我们可以像调用本地方法一样调用远程Web服务。客户端首先会创建一个服务代理,然后通过这个代理调用服务器端的方法。 ```java MyWebService service = (MyWebService) ...

    xfire 5分钟开发一个完整实例.doc

    - 访问XFire官方网站(http://xfire.codehaus.org/)下载XFire 1.2.6版本的压缩包。 - 解压压缩包,获取所需的`jar`包。 2. **从MyEclipse安装目录获取`jar`包**: - 从路径`...\myeclipse\eclipse\plugins\...

    xfire web service调用代码

    在IT行业中,Web服务是一种广泛使用的技术,它允许不同应用程序之间进行交互和数据交换。XFire(现称为CXF)是Java平台上的一个开源框架,专门用于构建和消费Web服务。本篇将深入探讨XFire Web服务的调用代码及其...

    Xfire调用webservice无法传递参数问题

    Xfire是Java中的一个轻量级Web服务框架,它简化了Web服务的开发和部署,支持WSDL(Web Services Description Language)自动生成,使得服务消费者可以方便地找到并调用服务。 标题“Xfire调用WebService无法传递...

    实现webServices接口调用demo

    - 外部访问:当Web服务对外提供,允许远程客户端通过HTTP访问时,就需要使用上面介绍的代理方式,通过URL调用服务。 七、XFire与其他框架对比 虽然现在CXF已经取代了XFire,但XFire在轻量级和易用性方面仍有其优势...

    xFire发布Web Service,并调用远程服务

    在本主题中,我们将深入探讨如何使用xFire来发布Web服务以及如何调用远程服务。 首先,让我们了解xFire的核心功能。xFire是一个基于Java的框架,它提供了对SOAP(Simple Object Access Protocol)协议的强大支持,...

    XFire_lib.jar

    《XFire_lib.jar在Spring整合中的关键作用及应用》 在现代软件开发中,Spring框架因其强大的依赖注入、AOP(面向切面编程)以及IoC(控制反转)特性,被广泛应用于Java企业级应用中。然而,为了实现更丰富的功能,...

    Spring+Hibernate+Xfire实现远程分布式调用

    这些技术都是Java开发中的重要工具,Spring作为全面的框架提供了服务管理和依赖注入,Hibernate则是流行的ORM(对象关系映射)解决方案,而Xfire是用于构建SOAP Web服务的库。 首先,Spring框架在分布式系统中的...

    Java使用XFire调用WebService接口

    这篇博客“Java使用XFire调用WebService接口”显然是讨论如何利用XFire这个开源框架来与Web服务交互。 XFire是Apache CXF项目的前身,它提供了一种简单的方式来创建和消费SOAP Web服务。XFire的强项在于其轻量级和...

    java使用XFire调用webService接口

    "Java 使用 XFire 调用 webService 接口" 在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单...

    XFire返回自定义实体类实例

    XFire通过使用Java注解或XML配置文件,使得开发者可以快速地将Java对象暴露为Web服务,或者消费远程Web服务。 自定义实体类是我们在开发中经常会遇到的一种情况。实体类通常用于封装业务逻辑中的数据,它们是数据库...

    spring远程调用和xfire aegis 源代码上传

    标题 "spring远程调用和xfire aegis 源代码上传" 涉及到的是在Java开发中使用Spring框架进行远程过程调用(RPC)以及整合XFire和Aegis库来实现服务间的通信。这一主题是分布式系统设计中的一个重要组成部分,特别是...

    xfire开发指南.......

    ### XFire开发指南知识点概述 #### 一、XFire简介 - **定义**: XFire是一个高性能的Java SOAP框架,用于构建面向服务架构(SOA)的应用程序。 - **特性**: - 支持多种标准:如SOAP、WSDL、WS-I Basic Profile、WS-...

    Java使用XFire调用WebService接口.docx编程资料

    &lt;servlet-class&gt;org.codehaus.xfire.transport.servlet.XFireConfigurableServlet&lt;/servlet-class&gt; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt; ...

    Xfire的client.zip_Xfire客户端代码_webservice

    在本案例中,"Xfire的client.zip"是一个包含了Xfire客户端代码的压缩包,主要用于调用Web服务。 Xfire客户端代码是实现与Xfire服务器通信的代码库,它可能包含了多种语言的实现,如Java、C#或Python等。这些代码...

    XFire 和spring完整集成实例

    import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; import com.xfire.core.entity.UserInfo; ...

Global site tag (gtag.js) - Google Analytics