古詩詞大全網 - 古詩大全 - cxf

cxf

性能:

1、 啟用FastInfoset(快速信息集)

webservice的性能實在是不敢恭維。曾經因為webservice吞吐量上不去,對webservice進行了壹些性能方面的優化,采用了FastInfoset,效果很明顯,極端條件下的大數據量傳輸,性能提高60%,他可以減少傳輸成本,序列化成本和xml解析成本。

Cxf提供了FastInfoset協商機制,實現類見org.apache.cxf.feature.FastInfosetFeature,在bus中啟用如下配置:

<cxf:features><cxf:fastinfoset force="false"/></cxf:features>

Force=false表示服務端和客戶端第壹次通信時會協商(通過檢查標準的HTTP頭的Accept字段,值為MIME類型的application/fastinfoset)是否啟用FastInfoset支持,如果客戶端不支持,則不啟用快速信息集。

需要在pom中添加依賴:

<dependency>

<groupId>com.sun.xml.fastinfoset</groupId>

<artifactId>FastInfoset</artifactId>

<version>1.2.9</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

FastInfoset參考:/developer/technicalArticles/xml/fastinfoset/

client和service端都要配置

2、 啟用gzip壓縮支持

客戶端和服務器端是否使用Gzip壓縮,也是基於mon.gzip.GZIPFeature ">

<property name="threshold"><value>10240</value></property>

</bean>

官方文檔指定是是配置org.apache.cxf.transport.mon.logging.Slf4jLogger

4、 測試中啟用日誌

bus中加入<cxf:logging/>,請在測試環境中啟用有助於debug

補充:

1、如何自定義返回碼:

請求在service中處理遇到異常後,會調用請求鏈中所有攔截器的handleFault方法,參考PhaseInterceptorChain#unwind,然後判斷請求是否單向請求,如果不是,則構建異常請求鏈,並構建異常message對象,調用異常請求鏈中的handleMessage 方法(參考:AbstractFaultChainInitiatorObserver)

JAXWSMethodInvoker轉發soap請求到指定對象的方法,如果在請求處理失敗,調用updateHeader方法,把請求時的soap header放入返回header中。但是不同通過繼承JAXWSMethodInvoker來實現清除異常時soap header也返回給客戶端的問題,因為JAXWSMethodInvoker沒有采用註入的機制(JaxWsServerFactoryBean#createInvoker)也沒有chain.異常時,會由這些攔截器處理返回請求:

setup [ServerPolicyOutFaultInterceptor]

prepare-send [MessageSenderInterceptor, Soap11FaultOutInterceptor]

pre-stream [LoggingOutInterceptor, StaxOutInterceptor]

pre-protocol [WebFaultOutInterceptor]

write [SoapOutInterceptor]

攔截器初始化類OutFaultChainInitiatorObserver

我們可以在異常鏈中加入清理soap header的攔截器SoapHeaderOutFilterInterceptor,清理掉在系統異常時soapheader中有信息的問題。

返回錯誤狀態碼,在執行Soap11FaultOutInterceptor攔截器中被寫死。

message.put(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));

為了使返回數據中有錯誤碼,需要在Soap11FaultOutInterceptor後面加入攔截器

2、在項目測試時遇到壹個報錯invalid LOC header (bad signature),這個問題是因為jar包損壞照成的,雖然構建路徑中有這個jar,但是還是會出現loadClass失敗,清理maven 本地倉庫目錄的jar,修改pom(比如加上壹空行)讓m2e重新加載。

3、Cxf中有壹個很不錯的特性,支持javascript訪問soap webservice,客戶端訪問pile</scope>

</dependency>