xfire框架内部基本结构解析
1 概述
xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的hello world案例,但是对于它是如何运行起来的介绍比较少,最近在排查问题时对xfire的代码进行了debug,因而对xfire的运行有了大概了解,在此进行下简单总结。
2 Service
xfire作为webservice的实现框架,首当其冲的要先了解下xfire是如何将系统中的一个个功能各异的interface抽象成了具有共同行为和属性的service。
在xfire中是用org.codehaus.xfire.service.Service这个类来表示抽象出来的结果,我们首先了解下继承结构图,可以看到其主要实现了两个接口:Visitable和HandlerSupport,继承了一个类AbstractContext。下面我们先分别了解下他们所描述的内容,那么他们合起来就会知道Service主要干了什么。
2.1 Visitable
一个webservice肯定是要被外面的系统进行调用,因而一个系统必然是可以被访问的,这个接口的名字很好的解释了实现该接口的类应当具备的功能,就是可以被外界的系统访问。这个接口中也只有一个方法:
2.2 AbstractContext
context的概念是在系统设计中经常会用到的一个概念,用来描述各种操作的上下文信息(注意是上、下文,而不是上文信息、也不是下文信息),在xfire中定义了一个抽象类来描述,其内部是一个map类,并提供了相应的set、get、remove方法来操作上下文信息。其内部实现如下:
2.3 Handler
从HandlerSupport字义上看,其是对Handler提供了支持服务。因而在了解HandlerSupport之前,我们需要对Handler有所了解。xfire将客户端、服务端的各种操作抽象为Handler,并且Handler除了必备的invoke外,还额外定义了其他几个属性:
1) role:表示这个服务应用于那些角色The roles which this service applies to
2) Phase:这个handler处于那个阶段,xfire定义的phase阶段主要有下面几个,并且每个phase还有优先级的定义
3) handleFault:处理在handler执行过程中发生的错误
4) getAfter:返回handler执行后要进行的动作
5) getBefore:返回handler执行前要进行的动作
2.4 HandlerSupport
任何一个service都可以划分为客户端和服务端两部分。对于客户端而言,就是把请求输出到服务端并接收服务端的返回结果;对于服务端而言,就是接收来自客户端的请求,在处理完之后将处理结果返回给客户端。同时还要考虑在处理过程中如果发生异常时应该如何操作。因而xfire将各种handler又划分为3类:
1) InHandler 服务端进行的各项操作,主要是
ServiceInvocationHandler:获取传入的参数(InMessage)、执行service、创建返回结果(OutMessage)
PostInvocationHandler:发送结果到客户端
2) OutHandler 客户端进行的各项操作,主要是
OutMessageSender:根据输出渠道(Channel)发送消息
3) FaultHandler 发生异常时的各项操作,主要是
FaultSender:通过输出channel传输信息
CustomFaultHandler:从异常信息中构建一个定制化的详情
2.5 ServiceInfo
上面介绍的是xfire中Service的主要功能,是比较上层的抽象,给出了一个service的整体模板。对于一个具体的service所表示的interface所具备的方法功能,这些信息都存放在ServiceInfo这个类中,通过反射的方式将interface中method信息、class信息都进行了存放,供之后使用。
至此和Service相关的主要接口和类介绍完了,整体来看就是Service用ServiceInfo描述了这个service表示那个interface及这个interface具有那些方法,这个可以看作其属性。其具体的功能则由继承了各个接口来表示。功能的实现主要包括了两类:客户端的输出和服务端的输入处理及输出。
3 Channel &HttpChannel
作为webservice,客户端和服务端的数据传输需要通过某种渠道来实现,Channel类就是对渠道的抽象(xfire中各个类的命名真是字达其意,一目了然,堪称命名的典范)。doc的介绍是:A channel for communication. This can be a channel on an underlying transport - like HTTP - or wrap another channel and provide additional functions - like reliable messaging。说明channel可以是基于http协议也可以是对消息的封装的形成。Channel的主要功能有下面几个:
1) open
2) receive
3) send
4) close
这几个功能比较好理解,先是open channel,然后进行send或receive,执行完后进行close。在这些基础功能之外,xfire还对ChannelEndpoint进行了设置,ChannelEndpoint是指定了这个channel的终点,由它负责具体对收到的数据进行的处理。HttpChannel中的send简单的讲就是使用一个apache的httpClient包中postMethod将请求发送到服务端。
类图和继承结构如下
4 Phase
在前面介绍过handler中包含多个Phase,这个小节详细介绍下发送请求和接收请求都包含哪些phase,各个阶段对应的handler是什么,主要做的事是什么。首先要说明Phase是有顺序的,因而下面介绍的Phase在执行时是一步步执行的。
4.1 输出时的Phase
顺序 |
phase名称 |
handler |
主要功能 |
1 |
post-invoke |
SoapSerializerHandler |
设置数据序列化器 |
2 |
policy |
默认无 |
权限控制等操作(猜测) |
3 |
user |
默认无 |
用户自定义操作(猜测) |
4 |
transport |
SoapActionOutHandler |
设置soapAction |
5 |
send |
OutMessageSender |
发送请求 |
4.2 输入时的Phase
顺序 |
phase名称 |
handler |
主要功能 |
1 |
transport |
默认无 |
|
2 |
parse |
ReadHeadersHandler |
解析收到的信息,利用XMLStreamReader解析http response中的header、body、Envelope |
3 |
pre-dispatch |
CorrelatorHandler |
添加ClientReceiveHandler处理器 |
4 |
dispatch |
LocateBindingHandler SoapBodyHandler SoapActionInHandler |
进行相应的设置 |
5 |
policy |
默认无 |
权限控制等操作(猜测) |
6 |
user |
默认无 |
用户自定义操作(猜测) |
7 |
pre-invoke |
ValidateHeadersHandler |
校验被标记为“mustUnderstand”header信息 |
8 |
service |
ClientReceiveHandler |
处理最终获得到的http响应中的body信息 |
4.3 phase小结
上面这些phase是在客户端和服务端每一次操作过程中都会执行一遍的,而不是客户端只执行request的phase,服务端只执行resonse阶段的phase。因而对于客户端和服务端而言,每一次操作都包含发请求和接收响应的过程,具体的序列图
xfire框架内部基本结构解析的更多相关文章
- iOS开发之Masonry框架源码深度解析
Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...
- Masonry框架源码深度解析
Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...
- 【HttpRunner v3.x】笔记 ——4. 测试用例-结构解析
一.官方首推pytest格式 上篇文章我们知道了,httprunner可以支持三种格式的用例,分别是pytest.yaml和json.yaml和json是以前的版本所使用的用例格式,但是在3.x版本上 ...
- Redis源码剖析--源码结构解析
请持续关注我的个人博客:https://zcheng.ren 找工作那会儿,看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识.在面试过程中,redis确实 ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- [转帖]认识固态:SSD硬盘内外结构解析
认识固态:SSD硬盘内外结构解析 来自: 中关村在线 收藏 分享 邀请 固态硬盘(Solid State Drive),简称固态盘(SSD),是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元 ...
- redis源代码结构解析
看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识: 之前面试的时候被问到了这部分的内容,没有关注,好在还有时间,就把Redis的源码看了一遍. Redis ...
- 10天学会phpWeChat——第一天:核心框架的目录结构
phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...
- iOS沙盒目录结构解析
iOS沙盒目录结构解析 原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出于安全考虑,iOS系统的沙盒机制规定每个应 ...
随机推荐
- WEBAPP开发技巧总结
自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备). 开发者们都知道在高端智能手机 ...
- 仿Material UI框架的动画特效
Material UI是一款功能非常强大,界面却十分清新简洁的CSS框架,Material UI利用了Google的Material Design 全新设计语言,并且让每一个UI组件都变得非常独立,因 ...
- 集合使用copy与mutableCopy的区别
集合(NSArray,NSSet,NSDictionary等)使用copy与mutableCopy的区别是类似的,下面以NSMutableArray.NSArray 为例子验证如下: NSMutabl ...
- 使用Python的yield实现流计算模式
首先先提一下上一篇<如何猜出Y combinator>中用的方法太复杂了.其实在Lambda演算中实现递归的思想很简单,就是函数把自己作为第一个参数传入函数,然后后面就是简单的Lambda ...
- jQuery自动分页打印表格(HTMLtable),可以强制换页
最近做项目的时候需要做批量打印订单,一个订单可能在最后一页是的内容是不足一页的,这时候下一个订单需要下一页打印,这样就需要强制换页.在下一页再打印下一个订单 部分代码: 部分重要的css是分页的换页的 ...
- MongoDB与Mysql常用命令解释
原文 本文旨在介绍MongoDB,Mysql的常用命令:将MongoDB 和传统的关系型数据库的常用命令对照起来学习,更加便于记忆和理解. MongoDB是由数据库(database/reposito ...
- 基于Chromium构建Chrome WebBrowser for .net 控件(还有点心得体会)
http://blog.csdn.net/lllllllllluoyi/article/details/8540054 首先向360说句sorry,在2011年360极速浏览器出现的时候我去他们论坛里 ...
- android: SQLite查询数据
掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了.不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作. 我们都知道 SQL 的全称是 Structured ...
- 转:LAV Filter 源代码分析
1: 总体结构 LAV Filter 是一款视频分离和解码软件,他的分离器封装了FFMPEG中的libavformat,解码器则封装了FFMPEG中的libavcodec.它支持十分广泛的视音频格式. ...
- 一个purge参数引发的惨案——从线上hbase数据被删事故说起
在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”. ...