CXF摘录.doc_第1页
CXF摘录.doc_第2页
CXF摘录.doc_第3页
CXF摘录.doc_第4页
CXF摘录.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成:1.Bus它是C X F架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于S p r i n g的ApplicationContext。这些共享资源包括WSDL管理器、绑定工厂等。通过对Bus进行扩展,可以方便地容纳自己的资源,或替换现有 的资源。默认Bus实现是基于Spring的,通过依赖注入,将运行时组件串起来。Bus的创建由BusFactory负责,默认是 SpringBusFactory,对应于默认Bus实现。在构造过程中,SpringBusFactory会搜索META-INF/cxf(就包含在 CXF的Jar中)下的所有Bean配置文件,根据它们构建一个ApplicationContext。开发者也可提供自己的配置文件来定制Bus。2.消息传递和拦截器(Interceptor)CXF建立于一个通用的消息层之上,主要由消息、拦截器和拦截器链(InterceptorChain)组成。CXF是以消息处理为中心的,熟悉 JSP/Servlet的开发者可以将拦截器视为CXF架构中的“Filter”,拦截器链也与“FilterChain”类似。通过拦截器,开发者可以 方便地在消息传递、处理的整个过程中对CXF进行扩展。拦截器的方法主要有两个:handleMessage和handleFault,分别对应消息处理 和错误处理。在开发拦截器的时候需要注意两点:拦截器不是线程安全的,不建议在拦截器中定义实例变量并使用它。这一点跟JSP/Servlet中对于Filter的处理是一样的;不要调用下一个拦截器的handleMessage或handleFault,这个工作由InterceptorChain来完成。3.前端(Front End)它为CXF提供了创建服务的编程模型,当前主要的前端就是JAX-WS。4.服务模型CXF中的服务通过服务模型来表示。它主要有两部分:ServiceInfo和服务本身。ServiceInfo作用类似WSDL,包含接口信息、 绑定、端点(EndPoint)等信息;服务则包含了ServiceInfo、数据绑定、拦截器和服务属性等信息。可使用Java类和WSDL来创建服 务。一般是由前端负责服务的创建,它通过ServiceFactory来完成。5.绑定(Binding)绑定提供了在传输之上映射具体格式和协议的方法,主要的两个类是Binding和BindingFactory。BindingFactory负责创建Binding。6.传输(Transport)为了向绑定和前端屏蔽传输细节,CXF提供了自己的传输抽象。其中主要有两个对象:Conduit和Destination。前者是消息发送的基 础,后者则对应消息接收。开发者还可以给Conduit和Destination注册MessageObserver,以便在消息发送和接收时获得通知。CXF的拦截器是CXF功能最主要的扩展点。通过自定义的Interceptor,可以改动 请求和响应的一些消息处理,其中最基本的原理还是一个动态代理。Interceptor是CXF架构中一个很有特色的模式。你可以在不对核心模块执行 修改的情况下,动态添加很多功能。这对于CXF这个以处理消息为中心的服务框架来说是非常有用的,CXF通过在Interceptor中对消息执行 特殊处理,实现了很多主要 功能模块,例如:日志记录,Soap消息处理,消息的压缩处理。如果你想对CXF执行 扩展,建议你先从interceptor开始。为了更好的学习和运用 CXF,最好先阅读官方的用户手册:/CXF20DOC/index.html一、基本原理下面看看CFX Interceptor在整个请求响应的处理流程 中所处的位置。二、CFX Interceptor的核心API先看拦截器核心包erceptor的说明:Core interceptor interfaces which form the basis for message processing chains in CXF.翻译:CXF消息处理链最基本的拦截器接口。一下多个 的API的介绍和翻译来自互联网: Interceptor定义两个要领 ,一个处理消息 handleMessage, 一个是处理不正确 handleFault。别看Interceptor这么基本 ,这里须要 提醒留心 的是,在执行 具体的Interceptor的这两个要领 中,千万别调用Interceptor内部的成员变量。这是由于Interceptor是面向消息来执行 处理的,每个Interceptor都有可能运行在不同的线程中,如果调用了Interceptor中的内部成员变量,就有在Interceptor中造成临界资源的访问的情况,而这时的Interceptor也就不是线程安全的Interc eptor了。 在CXF中最常运用 的Interceptor都放在cxf-rt-core中的erceptor中,有兴趣的朋友可以研究一下。InterceptorChain 单个的Interceptor功能有限,CXF要实现一个SOAP消息处理,须要 将许许多多的Interceptor组合在一起运用 。因此设计了 InterceptorChain,在我看了InterceptorChain就像是一个Interceptor的小队长。 小队长有调配安置Interceptor的权力(add,remove),也有控制消息处理的权力 (doInterceptor,pause,resume,reset,abort),同时也有交付不正确 处理的权力( getsetFaultObserver)。更有意思的是为灵活控制Interceptor的处理消息顺序 (doInterceptStartingAt,doInterceptorStartingAfter),这也是InterceptorChain比较 难理解的地点 。有兴趣的朋友可以跟踪一下,CXF的Client与Server之间通讯是走过哪些Interceptor,这些Interceptor是如何 被调用的。Fault定义了CXF中的不正确 消息。InterceptorProvider这里定义了Interceptor的后备保证 部队。我们可以在InterceptorProvider中配置 In,Out,InFault,OutFault 后备小分队,添加我们所希望添加的Interceptor。而InterceptorChain会根据这些后备小分队,组建自己的小分队实例,完成具体的作战功能任务。AbstractAttributedInterceptorProviderInterceptorProvider实现的抽象类,由于这个类来继承了HashMap,我们可以像这个类中存储一些属性信息。AbstractBasicInterceptorProvider与AbstractAttributedInterceptorProvider不同,这个Interceptor只是基本 实现了InterceptorProvider的功能,并不提供对其属性存储的扩展。Message由于Interceptor是针对Message来执行 处理的,当你打开Message这个类文件时,你会发觉 在Message中定义了很多常量,同时你还可以从Message中获取到很多与Message操作有关 的信息。可以获取配置 的对象有InterceptorChain Exchange Destination,还有获取配置 Content的泛型接口,是不是感觉Message和Bus差不多,都成了大杂货铺,一切与消息处理有关 的信息都可以放在Message中。我想这也是咱CXF以Message处理为中心的设计思想的具体表现吧。 Exchange和Message打交道就离不开Exchange。Exchange建立In/Out,InFault/OutFault Message 之间的联系。你可以从Exchange中获取到与消息传输有关 的Conduit,Destination的信息,同时也可以配置 和Session有关 的其他信息,以及知道能不能 是OneWay的消息。AbstractFeature为了简化配置Interceptor的复杂操作,在这里配置 了AbstractFeature,通过Feature我们可以向Bus,Client,Endpoint配置不同功能的Interceptor组。这样可以极大减轻我们配置文件的体积。在此之前我们如果想把一组Log Interceptors添加到Bus中,须要 写的配置文件如下 而一旦运用 了Feature,我们的配置文件就变成了 三、CXF拦截器运用 CXF的运用 也比Axis容易很多,可以单独运用 ,也可以与Spring完美整合,这里就通过上一个HelloWorld的例子来说明如何 运用 拦截器。比如,要实现一个SOAP消息请求日志的功能,以便能动态监控请求消息的信息。之须要 在在上文例子的基础做一点点改动:服务端package ws; import org.apache.cxf.endpoint.Server; import erceptor.LoggingInInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; /* * 服务端程序配置 与启动程序 * * author leizhimin 2009-6-11 14:41:23 */ public class HelloWorldServer public static void main(String args) JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setServiceClass(HelloWorldImpl.class); factory.setAddress(http:/localhost:8080/service/HelloWorld); factory.getInInterceptors().add(new LoggingInInterceptor(); Server server = factory.create(); server.start(); 客户端package client; import erceptor.LoggingInInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import ws.HelloWorld; /* * 客户端调用代码 * * author leizhimin 2009-6-11 14:46:45 */ public class TestClient public static void main(String args) JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setAddress(http:/localhost:8080/service/HelloWorld); factory.setServiceClass(HelloWorld.class); factory.getInInterceptors().add(new LoggingInInterceptor(); HelloWorld helloWorld = (HelloWorld) factory.create(); String msg = helloWorld.sayHello(World); System.out.println(msg); 将日志拦截器加入到拦截器链中。不过这里的日志拦截器是CXF自己定义好的,直接拿来运用 即可。四、测试先运行服务端,然后运行客户端。1、服务端控制台窗口:在服务端控制台打印的日志截图是如下图片看不清楚?请点击这里查看原图(大图)。实际的日志内容如下:信息: Inbound Message - ID: 1 Address: /service/HelloWorld Encoding: UTF-8 Content-Type: text/xml; charset=UTF-8 Headers: Content-Length=179, Host=localhost:8080, User-Agent=Apache CXF 2.2.2, connection=keep-alive, SOAPAction=, Pragma=no-cache, Content-Type=text/xml; charset=UTF-8, content-type=text/xml; charset=UTF-8, Cache-Control=no-cache, Accept=*/* Payload: World -分析日志可以看出,服务端日志输出了消息id、地址、编码、以及消息内容。2、客户端控

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论