低调星空

程序是字母与数字的魔术
posts - 17, comments - 1, trackbacks - 0, articles - 1
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

XFire服务部署手册

Posted on 2007-05-11 16:58 citystar 阅读(5148) 评论(1)  编辑 收藏 引用

XFire服务部署手册

一、准备工作:工程目录结构

工程的目录结构如下图所示:

1-1:工程目录结构

ldaxfire是工程的根目录。/WEB-INF/classes/META-INF/xfire目录用于存放service.xml文件。将XFire1.2.5下的包(用到的)copy/WEB-INF/lib目录下。

二、修改web.xml文件

web.xml文件中加入如下定义

       <servlet>

              <servlet-name>XFireServlet</servlet-name>

              <display-name>XFire Servlet</display-name>

              <servlet-class>

                     org.codehaus.xfire.transport.http.XFireConfigurableServlet

              </servlet-class>

       </servlet>

       <servlet-mapping>

              <servlet-name>XFireServlet</servlet-name>

              <url-pattern>/services/*</url-pattern>

       </servlet-mapping>

代码清单2-1:web.xml中增加的部分

这样在工程中发布的所有服务都可以在工程URLservices子目录下访问。

三、类结构调整

XFire对于要发布的服务没有多余的要求,它可以自动的将指定服务类的公共方法发布出去。但是POJOs的调用要求传入的参数类型必须是接口;同时由于XFire生成的桩使用了JDK1.4.2不支持的JSR181注释类型,所以在这里最好是遵从POJOs的要求,为每一个要发布的服务类生成一个接口,以便于低版本的客户端使用POJOs方式进行访问。

四、类型影射

XFire支持的数据类型包括基础类型、数组、集合、字符串、Datejava.util.Datejava.util.Calendarjava.sql.Timestampjava.sql.Datejava.sql.Time)、XML类型(DocumentElementXMLStreamReaderSource)及以上类型组成的复合类型。

基础类型、数组、StringDate类型不用进行类型影射,除此之外的数据类型如ListMap等集合对象或是其它的复合类型,必须要写对应的类型影射。

XFire的类型影射在ServiceClassName.aegis.xmlServiceClassName为服务类/接口的名字)文件中声明。

在这里尽量要求发布服务的参数和返回值不要超出基础类型、数组、String的泛围,因此类型影射在此不作详细说明。

五、服务的发布——service.xml文件配置

XFire工程中service.xml必须位于/WEB-INF/classes/META-INF/xfire/目录下。其基本格式如下

<beans xmlns="http://xfire.codehaus.org/config/1.0">

       <xfire>

              <inHandlers>

                     <handler handlerClass=""></handler>

              </inHandlers>

       </xfire>

       <service>

              <name />

              <namespace />

              <serviceClass />

              <implementationClass />

              <serviceFactory />

              <bindingProvider />

              <style>document|rpc|message|wrapped</style>

              <use>literal|encoded</use>

              <scope>request|session|application</scope>

              <invoker />

              <executor />

              <inHandlers>

                     <handler handlerClass="" />

              </inHandlers>

              <outHandlers>

                     <handler handlerClass="" />

              </outHandlers>

              <faultHandlers>

                     <handler handlerClass="" />

              </faultHandlers>

              <createDefaultBindings>true|false</createDefaultBindings>

              <bindings>

                     <soap11Binding name="qname" transport=""

                            allowUndefinedEndpoints="">

                            <endpoints>

                                   <endpoint name="qname" url="" />

                            </endpoints>

                     </soap11Binding>

                     <soap12Binding name="qname" transport=""

                            allowUndefinedEndpoints="">

                            <endpoints>

                                   <endpoint name="qname" url="" />

                            </endpoints>

                     </soap12Binding>

              </bindings>

       </service>

</beans>

代码清单5-1service.xml的完整配置

1、name:必须的。ServiceRegisty就是通过这个名字进行服务注册的,服务部署完成后也是用它来调用服务。

2、namespace:可选。用于指定服务的目标命空间。

3、serviceClass:必须的。要部署到服务中的类,可以是接口。

4、implementationClass:可选的。服务被调用时使用的实现类。如果serviceClass的值是一个接口,那么这个值就必须配置,且必须为serviceClass指定接口的实现类。

5、serviceFactory:可选的。ServiceFactory控制服务创建和配置。

6、bindingProvider:设置bindingProvider,提供绑定相关的信息。如端口等。

7、style:可选的。参数样式。默认值为wrapped。可取值为wrappedmessagedocument rpc

8、use:可选的。指定编码类型。取值可以是encodinglitaral,目前的XFire支持literal格式,即无编码。

9、scope:可选的。指定服务的生存周期。默认值为application,即在所以访问期间只创建一个服务,不用时可以会被持久化。可以是applicationsessionrequest

10、            invoker:可选的。设置调用转接器。如果当服务实现类不是一个无格式java beaninvoker可以指定其调用方式。

11、            excutor:可选值。可以为服务指定一个默认值以外的执行策略。

12、            handlers:可以使用inHandlersoutHandlersfaulterHandlers为服务指定输入、输出和出错时的调用的处理。每个handler自身是一个XML解析的处理句柄。

13、            createDefaultBinding:可选。默认为true,即创建默认的SOAP1.1 HTTP绑定。如果不想创建默认的绑定,可将其值设为false

14、            绑定配置:每一个绑定都要指定的一个transport ID。下面是对应的TransportID的对应表。使用endpoint选项可以覆盖掉默认的端口地址。

Transport

Transport ID

HTTP + SOAP 1.1

http://schemas.xmlsoap.org/soap/http

HTTP + SOAP 1.2

http://www.w3.org/2003/05/soap/bindings/HTTP/

XMPP

http://jabber.org/protocol/soap

JMS

urn:xfire:transport:jms

Local

urn:xfire:transport:local

下面给出一个service.xml的典型配置:

<beans xmlns="http://xfire.codehaus.org/config/1.0">

       <service>

              <name>ServiceName</name>

              <namespace>http://yourcompany.com/ServiceName</namespace>

              <serviceClass> com.yourcompany.yourpath..ServiceInterface</serviceClass>

              <implementationClass>

                     com.yourcompany.yourpath.ServiceImplClass

              </implementationClass>

              <inHandlers>

                     <handler

                            handlerClass="com.yourcompany.yourpath.HandlerClass" />

              </inHandlers>

       </service>

</beans>

代码清单5-2service.xml的典型配置

用自己实际的路径和类名取代上面的配置就是一个典型的XFire service配置。

六、客户端调用

客户端调用采用POJOs方式。在这种方式下要用到在服务端定义的服务接口。具体代码如下:

              String serviceURL = "http://192.168.0.225/ldaxfire/services/LDAService";

 

              // 创建service对象

              Service serviceModel = new ObjectServiceFactory().create(

                            ServiceInterface.class, null, "http://test.yicha.cn/adreport", null);

 

              XFireProxyFactory serviceFactory = new XFireProxyFactory();

 

              // 获取服务对象

              ServiceInterface service = (ServiceInterface) serviceFactory.create(

                            serviceModel, serviceURL);

 

              // 忽略超时

              Client client = Client.getInstance(service);

              client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "0");

 

              // 调用服务

              data = service.serviceMethod();

代码清单6-1:客户端调用代码(POJOs方式)

注:其中的ServiceInterface在实际工程中要以实际的接口类型替代,serviceMethod以具体的方法名替代。

七、GZip的启用

XFire1.2以后支持SOAP消息的GZip压缩传输,在合适的地方启动GZip压缩可以减少网络传输的数据量,加快速度。

XFire中启动GZip压缩要用到一个开源的FilterPJL Compressing Filter。这个Filter的最新版本是1.6.4,自1.5.0开始该工程开始构建于JDK5.0,因此在JDK1.4环境下只能使用1.4.6(这个版本会与高版本同步更新)。

一、服务端启动GZip:在服务端启动GZip只需将PJL Compressing Filter下的jar包(用到的)导入到web/WEB-INF/lib目录下。并在web.xml文件中增加如下配置:

       <filter>

              <filter-name>CompressingFilter</filter-name>

              <filter-class>

                     com.planetj.servlet.filter.compression.CompressingFilter

              </filter-class>

              <init-param>

                     <param-name>debug</param-name>

                     <param-value>false</param-value>

              </init-param>

              <init-param>

                     <param-name>statsEnabled</param-name>

                     <param-value>true</param-value>

              </init-param>

       </filter>

       <filter-mapping>

              <filter-name>CompressingFilter</filter-name>

              <url-pattern>/*</url-pattern>

       </filter-mapping>

代码清单7-1服务端加入GZipweb.xml中增加的配置

注:根据web.xml文法定义,这个定义必须位于servlet定义之前。

二、客户端启用GZip:客户端启动GZip只要将客户端的GZip的属性设为true却可。代码如下:

              String serviceURL = "http://192.168.0.225/ldaxfire/services/LDAService";

 

              // 创建service对象

              Service serviceModel = new ObjectServiceFactory().create(

                            ServiceInterface.class, null, "http://test.yicha.cn/adreport", null);

 

              XFireProxyFactory serviceFactory = new XFireProxyFactory();

 

              // 获取服务对象

              ServiceInterface service = (ServiceInterface) serviceFactory.create(

                            serviceModel, serviceURL);

 

              // 获取客户端代理

              Client client = ((XFireProxy) Proxy.getInvocationHandler(service))

                            .getClient();

 

              // 启动response压缩

              client.setProperty(CommonsHttpMessageSender.

                            GZIP_RESPONSE_ENABLED, Boolean.TRUE);

 

              // 启动request压缩

              client.setProperty(CommonsHttpMessageSender.

                            GZIP_RESPONSE_ENABLED,Boolean.TRUE);

 

              // 同时启动responserequest压缩

              client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,

                            Boolean.TRUE);

 

              // 忽略超时

              client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "0");

 

              // 调用服务

              data = service.serviceMethod();

代码清单7-2:客户端调用的修改

注:在同时启用时,不必再分别启用responserequestGZip压缩。

注意,当服务端没有启用GZip,客户端启用请求GZip压缩时,会产生SOAP解析错误,如果服务端启动了GZip压缩功能,客户端是否启用GZip都没有影响。

Feedback

# re: XFire服务部署手册  回复  更多评论   

2008-10-16 11:47 by qm
能给我发个JAR包嘛.我没下到.谢谢.
ququju@gmail.com
只有注册用户登录后才能发表评论。