`
marine_chen
  • 浏览: 76086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通常在Spring发布Hession,RMI等

    博客分类:
  • J2ee
阅读更多

通常在Spring发布Hession,RMI等,是非常方便的,

但是要发布SOAP类型的WebService则要依赖一个独立的Servlet容器(如Tomcat+Axis),

这种Webservice一般还有别的配置文件,比如web.xml,wsdd文件等等
。有时侯,你可能想一台机器上只部署一个Http Soap Service
,这种场合你可能不希望安装一个类似Tomcat的容器,
你更希望发布的时候就是一个服务程序,该程序启动则提供WebService.这篇文章描述一种解决方案。
开发环境:
Spring 1.2.6
XFire 1.0
Jetty 4.2.1
方案描述:我们可以通过XFire的编程接口来创建WebService并嵌入一个HttpServer,
从而来做到在一个独立应用程序中发布Http Service
 1// Create an XFire Service
 2        ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
 3        Service service = serviceFactory.create(Echo.class);
 4        service.setInvoker(new BeanInvoker(new EchoImpl()));
 5        // Register the service in the ServiceRegistry
 6        XFire xfire = XFireFactory.newInstance().getXFire();
 7        xfire.getServiceRegistry().register(service);
 8        // Start the HTTP server
 9        XFireHttpServer server = new XFireHttpServer();
10        server.setPort(8191);
11        server.start();

这样的话,如果发布多个WebSerice则要依次显式的创建 XFire Service,然后再一一注册,

这样显然是不够优雅的。

我们想要让开发者在Spring配置文件中指定要发布为WebService的POJOs,

然后载入Spring环境就自动发布为webservice,而不需要跟 XFire API打交道。

首先,我们想要一个BeanFacory,能把一个pojo装配成XFire Service

 1 /**
 2  * 
 3  */
 4 package com.yovn.ws.xfire.example;
 5 
 6 import org.codehaus.xfire.service.Service;
 7 import org.codehaus.xfire.service.binding.BeanInvoker;
 8 import org.codehaus.xfire.service.binding.ObjectServiceFactory;
 9 import org.springframework.beans.factory.FactoryBean;
10 
11 /**
12  * @author new
13  *
14  */
15 public class XFireServiceFactoryBean implements FactoryBean
16 {
17 
18     
19     
20     
21     private Class serviceClass;
22     
23     
24     private Object target;
25     
26     
27     private Service service;
28     
29     
30     private final ObjectServiceFactory sf=new ObjectServiceFactory();
31     
32     /**
33      * 
34      */
35     public XFireServiceFactoryBean()
36     {
37         
38     }
39 
40     /* (non-Javadoc)
41      * @see org.springframework.beans.factory.FactoryBean#getObject()
42      */
43     public Object getObject() throws Exception
44     {
45         if(service==null)
46         {
47             service=sf.create(serviceClass);
48             service.setInvoker(new BeanInvoker(target));
49         }
50         return service;
51     }
52 
53     /* (non-Javadoc)
54      * @see org.springframework.beans.factory.FactoryBean#getObjectType()
55      */
56     public Class getObjectType()
57     {
58         
59         return Service.class;
60     }
61 
62     /* (non-Javadoc)
63      * @see org.springframework.beans.factory.FactoryBean#isSingleton()
64      */
65     public boolean isSingleton()
66     {
67         return true;
68     }
69 
70     public void setServiceClass(Class serviceClass)
71     {
72         this.serviceClass = serviceClass;
73     }
74 
75     public void setTarget(Object target)
76     {
77         this.target = target;
78     }
79 
80 }
81 

这样我们可以通过Spring来装配一个pojo,

下一步我们要在Spring容器载入时候注册XFire Service,

并启动一个嵌入的Http Server,我们可以借助Spring的ApplicationListener来实现

 1 /**
 2  * 
 3  */
 4 package com.yovn.ws.xfire.example;
 5 
 6 
 7 import org.apache.commons.logging.Log;
 8 import org.apache.commons.logging.LogFactory;
 9 import org.codehaus.xfire.XFire;
10 import org.codehaus.xfire.XFireFactory;
11 import org.codehaus.xfire.server.http.XFireHttpServer;
12 import org.codehaus.xfire.service.Service;
13 import org.codehaus.xfire.service.ServiceRegistry;
14 import org.springframework.context.ApplicationContext;
15 import org.springframework.context.ApplicationEvent;
16 import org.springframework.context.ApplicationListener;
17 import org.springframework.context.event.ContextClosedEvent;
18 import org.springframework.context.event.ContextRefreshedEvent;
19 
20 /**
21  * @author new
22  * 
23  */
24 public class XFireServiceStarter implements ApplicationListener
25 {
26 
27     private int port = 80;
28 
29     private XFireHttpServer server;
30     private final Log logger=LogFactory.getLog(getClass().getName());
31 
32     public void setPort(int port)
33     {
34         this.port = port;
35     }
36 
37     public void onApplicationEvent(ApplicationEvent event)
38     {
39         try
40         {
41             if (event instanceof ContextRefreshedEvent)
42             {
43 
44                 if (server != null)
45                 {
46 
47                     server.stop();
48                     logger.info("xfire server stopped");
49 
50                 }
51                 registerService((ApplicationContext)event.getSource());
52                 server = new XFireHttpServer();
53                 server.setPort(port);
54                 server.start();
55                 logger.info("xfire server started");
56 
57             } else if (event instanceof ContextClosedEvent)
58             {
59                  if(server!=null)
60                  {
61                      server.stop();
62                      logger.info("xfire server stopped");
63                  }
64                  
65             }
66 
67         } catch (Exception e)
68         {
69             logger.error("process event "+event+" error",e);
70         }
71 
72     }
73 
74     private void registerService(ApplicationContext context)
75     {
76         XFire xfire=XFireFactory.newInstance().getXFire();
77         ServiceRegistry registry=xfire.getServiceRegistry();
78         String names[]=context.getBeanNamesForType(Service.class);
79         
80         for(int i=0;i<names.length;i++)
81         {
82             Service service=(Service)context.getBean(names[i]);
83             registry.register(service);
84             logger.info("register service:"+service.getName());
85         }
86         
87     }
88 
89 }
90 

Ok,我们完成基础的代码,下面试着发布一个简单的WebServie
1 package com.yovn.ws.xfire.example;
2 
3 public interface Add
4 {
5     int add(int a,int b);
6 
7 }
该接口的实现如下
 1 package com.yovn.ws.xfire.example;
 2 
 3 public class AddImpl implements Add
 4 {
 5 
 6     public int add(int a, int b)
 7     {
 8         
 9         return a+b;
10     }
11 
12 }

这是一个简单功能的POJO,下面我们在Spring中装配起来
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 3 <beans>
 4     <bean id="addService" class="com.yovn.ws.xfire.example.XFireServiceFactoryBean">
 5         <property name="serviceClass" value="com.yovn.ws.xfire.example.Add"/>
 6         <property name="target" ref="adder"/>
 7     </bean>
 8     
 9     <bean id="adder" class="com.yovn.ws.xfire.example.AddImpl"/>
10     <bean id="xfireStarter" class="com.yovn.ws.xfire.example.XFireServiceStarter">
11        <property name="port" value="80"/>
12     </bean>
13 </beans>

好了,我们完成了,只要载入这个xml初始化一个Spring ApplicationContext,一个名叫Add的webservice就发布了。你可以通过访问http://localhost/Add?wsdl来获得webservice的详细描述!
分享到:
评论
1 楼 NICOBEYOND 2010-11-26  
不错,向楼主学习!

相关推荐

    dubbo_rpc_hession_rmi

    在IT行业中,分布式服务框架是实现大规模系统高可用、高性能的关键技术之一,而Dubbo、Hessian和RMI则是其中的三个重要组件。本篇将深入解析这些技术及其在实际应用中的示例。 首先,Dubbo是阿里巴巴开源的一款高...

    Hession与SpringMVC整合的例子程序

    Hession与SpringMVC整合的例子程序,HseServer.zip为服务器端,HseClient.zip为客户端 pom.xml为引用的jar,可以删除一些无用的引用。版本为JDK8,Spring4.3.4,hessian4.0.38

    hession文档(与spring兼容)

    在与Spring框架集成时,Hession 可以帮助开发者轻松实现服务的远程调用,从而构建分布式的微服务架构。 1. **Hession 序列化机制** Hession 使用自定义的二进制序列化协议,能将Java对象转换为字节流,同时也可以...

    hession整合spring

    将Hession与Spring框架结合,可以充分利用Spring的依赖注入、AOP(面向切面编程)等特性,简化服务的发布和消费过程。在Spring中,我们可以使用`HessianServiceExporter`或`HessianProxyFactoryBean`来实现这一目标...

    hession之经典入门例子

    Spring框架允许我们更优雅地管理服务,如通过注解配置服务bean,自动注册到Hession服务器,以及利用Spring的AOP特性添加事务、日志等服务管理功能。学习这部分内容,可以帮助我们更好地理解和应用Hession在企业级...

    Spring hession Service Test项目

    在Java开发中,Spring框架是广泛应用的轻量级容器,而Hessian是一种高效的远程方法调用(RPC)协议,它使得服务端的方法可以直接在客户端调用,仿佛它们就在同一台机器上。本文将深入探讨如何在Spring框架下结合...

    hession入门及注入spring

    【Hession入门及注入Spring】 Hessian是一种轻量级的RPC(Remote Procedure Call)协议,它基于HTTP协议,主要用于提供二进制序列化的远程方法调用。Hessian使得Java对象能够在网络间高效地进行传输,简化了分布式...

    外部接口调用 使用spring4+hessian4实例(二)

    在Spring中配置Hessian服务,我们可以利用Spring的自动装配能力,简化服务的发布和消费过程。 要实现Spring4与Hessian4的结合,你需要完成以下步骤: 1. **配置服务提供方**: - 首先,创建一个服务接口和其实现...

    Hessian和Spring集成示例

    Spring支持多种服务暴露方式,包括HTTP、RMI、JMS等,而Hessian就是其中一种。 Hessian与Spring的集成主要涉及以下几个步骤: 1. **添加依赖**:在项目中引入Hessian的库,这通常通过Maven或Gradle的依赖管理来...

    hession入门例子

    - 引入Hession客户端库:在项目中添加Hession客户端依赖,通常通过Maven或Gradle完成。 - 创建Hession客户端:使用`HessianProxyFactory`创建服务代理对象,指定服务URL和接口类型。 - 调用服务:通过代理对象...

    hession调用

    在“Hession调用”中,核心概念包括服务端(Server)和客户端(Client)。服务端提供一系列接口或方法,通过Hession协议暴露这些接口供客户端调用。客户端则通过HTTP请求调用这些服务,就像调用本地方法一样简单。 ...

    java开发常用jar包之Hession.rar

    2. **跨语言**:Hession支持多种编程语言,如Java、C++、Python等,可以实现不同语言的服务间通信。 3. **简单易用**:Hession提供了简单的API,使得开发者可以快速地创建和调用服务。 4. **自动类型转换**:Hession...

    hession服务端

    hession服务端

    hessian与spring整合的jar包

    在IT行业中,Hessian是一种高效的远程方法调用(Remote Method Invocation, RMI)协议,它由Caucho Technology开发。Hessian提供了一种二进制的序列化格式,使得网络通信更加高效,减少了数据传输量。它支持Java、...

    hession例子

    在实际的"**hession例子**"中,我们可能会看到如何配置和启动Hession服务,编写服务接口,创建客户端,以及如何处理调用异常等问题。通过学习和实践这个例子,我们可以深入理解Hession的工作原理,以及如何在实际...

    webservices学习之hession

    3.1 添加依赖:在项目中引入Hession的相关库,通常通过Maven或Gradle管理依赖。 3.2 创建服务接口:定义服务接口,该接口包含需要暴露给客户端调用的方法。 3.3 实现服务:编写服务接口的实现类,实现具体业务逻辑...

    外部接口调用 使用spring4+hessian4实例

    此外,Spring还提供了AOP(Aspect Oriented Programming,面向切面编程)支持,允许我们在不修改原始代码的情况下添加日志、事务管理等功能。 接下来,Hessian4是用于实现这些服务的远程调用。Hessian是一种轻量级...

    hession例子,源码,最新的jar包,还有web例子与spring结合的例子

    6. **Spring集成**: 在Spring中使用Hessian,通常需要配置一个HessianExporter,它会暴露一个Spring Bean作为Hessian服务。客户端可以通过HessianProxyFactoryBean创建对服务的代理,然后像调用本地方法一样调用远程...

    Hession简介共3页.pdf.zip

    Hession常用于企业内部的微服务架构中,特别是在需要大量快速通信的高并发场景下,如电商系统中的订单处理、库存管理等。同时,由于其兼容HTTP,也可以作为API Gateway的一部分,对外提供服务。 **与其他RPC框架的...

Global site tag (gtag.js) - Google Analytics