xfire框架内部基本结构解析

xfire框架内部基本结构解析1概述xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的helloworld

大家好,又见面了,我是你们的朋友全栈君。

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主要干了什么。

image

2.1 Visitable

一个webservice肯定是要被外面的系统进行调用,因而一个系统必然是可以被访问的,这个接口的名字很好的解释了实现该接口的类应当具备的功能,就是可以被外界的系统访问。这个接口中也只有一个方法:

image

2.2 AbstractContext

context的概念是在系统设计中经常会用到的一个概念,用来描述各种操作的上下文信息(注意是上、下文,而不是上文信息、也不是下文信息),在xfire中定义了一个抽象类来描述,其内部是一个map类,并提供了相应的set、get、remove方法来操作上下文信息。其内部实现如下:

image

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还有优先级的定义

image

3) handleFault:处理在handler执行过程中发生的错误

4) getAfter:返回handler执行后要进行的动作

5) getBefore:返回handler执行前要进行的动作

image

2.4 HandlerSupport

任何一个service都可以划分为客户端和服务端两部分。对于客户端而言,就是把请求输出到服务端并接收服务端的返回结果;对于服务端而言,就是接收来自客户端的请求,在处理完之后将处理结果返回给客户端。同时还要考虑在处理过程中如果发生异常时应该如何操作。因而xfire将各种handler又划分为3类:

1) InHandler 服务端进行的各项操作,主要是

ServiceInvocationHandler:获取传入的参数(InMessage)、执行service、创建返回结果(OutMessage)

PostInvocationHandler:发送结果到客户端

2) OutHandler 客户端进行的各项操作,主要是

OutMessageSender:根据输出渠道(Channel)发送消息

3) FaultHandler 发生异常时的各项操作,主要是

FaultSender:通过输出channel传输信息

CustomFaultHandler:从异常信息中构建一个定制化的详情

image

2.5 ServiceInfo

上面介绍的是xfire中Service的主要功能,是比较上层的抽象,给出了一个service的整体模板。对于一个具体的service所表示的interface所具备的方法功能,这些信息都存放在ServiceInfo这个类中,通过反射的方式将interface中method信息、class信息都进行了存放,供之后使用。

image[49]

至此和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将请求发送到服务端。

类图和继承结构如下

image  image

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。因而对于客户端和服务端而言,每一次操作都包含发请求和接收响应的过程,具体的序列图

 

image

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154618.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • matlab画折线图,标记指定点「建议收藏」

    matlab画折线图,标记指定点「建议收藏」首先,找到你需要标注的点。比如说你有x、y两个列向量构成一条曲线。现在要找最大值点那么用p=find(y=max(y)),那么坐标(x(p),y(p))就是你要找的点咯。2第二步如何标记。我介绍两总方法来标记这个点,但是总体上可以归结为一种方法。(1)利用text(x(p),y(p),’o’,’color’,’g’));这里o表示标注的形状,也可以用*、^等比较好看的符号哟。’g’表示的是颜色。(…

  • Python负数取余总结

    Python负数取余总结Python负数取余总结余数存在正余数和负余数,要了解负余数,需要先了解取整原理17//5=3-17//5=-417//-5=-4-17//-5=3根据上述的4个公式,可以看出python的编译器是的取整符号位由被除数和除数同时决定,整数的数值是由向下取整的,即如果整数的符号位正,则取靠近0的数,如果整数是负数,则取远离0的数或者也可以这样理解:被除数和除数处于0的一边就往靠0的方向取整,如果是处于0的两边就往远离0的方向取整。了解了取整原理后,再理解取余就比较简单了17

  • js获取服务器控件DropDownList所选中的各项属性

    js获取服务器控件DropDownList所选中的各项属性摘录网上:varddl=document.getElementById(“DropDownList1”);alert(ddl.selectedIndex);//选择索引值alert(ddl.options[ddl.selectedIndex].value);//绑定值alert(ddl.options[ddl.selecte…

    2022年10月16日
  • 微信小程序错误码参考大全

    微信小程序错误码参考大全

  • unity3d的入门教程_unity菜鸟教程

    unity3d的入门教程_unity菜鸟教程Unity3D新手入门初级教程U3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。可发布游戏至Windows、Mac、Wii、iPhone、Windowsphone8和Android平台。也可以利用Unitywebplayer插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Macwidgets所支持!U3D现已经占领了国内85%的手游

  • 驾校学员管理系统_驾校管理系统

    驾校学员管理系统_驾校管理系统mysql-uroot-p-u表示选择登陆的用户名,-p表示登陆的用户密码,上面命令输入之后会提示输入密码,此时输入密码就可以登录到mysql创建数据库:createdatabasedrivingschool;选择数据库:usedrivingschool;转载于:https://www.cnblogs.com/zgytbn/p/8296799.html…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号