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主要乾了什麼。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章