WebService學(xué)習(xí)筆記 1 WebService概念:1.1 術(shù)語(yǔ)(資料摘要)Ø web Service Web Service是使應(yīng)用程序可以以與平臺(tái)和編程語(yǔ)言無(wú)關(guān)的方式進(jìn)行相互通信的一項(xiàng)技術(shù),。Web 服務(wù)是一個(gè)軟件接口,,它描述了一組可以在網(wǎng)絡(luò)上通過(guò)標(biāo)準(zhǔn)化的 XML 消息傳遞訪(fǎng)問(wèn)的操作。它使用基于 XML 語(yǔ)言的協(xié)議來(lái)描述要執(zhí)行的操作或者要與另一個(gè) Web 服務(wù)交換的數(shù)據(jù),。一組以這種方式交互的 Web 服務(wù)在面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,,SOA)中定義了特殊的 Web 服務(wù)應(yīng)用程序
Ø SOAP SOAP(Simple Object Access Protocol )簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過(guò)程調(diào)用的輕量級(jí)協(xié)議,是一個(gè)基于XML的協(xié)議,。使用SOAP,,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),,可以允許任何類(lèi)型的對(duì)象或代碼,,在任何平臺(tái)上,以任何一種語(yǔ)言相互通信,。 SOAP包括四個(gè)部分:SOAP封裝(envelop),,封裝定義了一個(gè)描述消息中的內(nèi)容是什么,,是誰(shuí)發(fā)送的,誰(shuí)應(yīng)當(dāng)接受并處理它以及如何處理它們的框架,;SOAP編碼規(guī)則(encoding rules),,用于表示應(yīng)用程序需要使用的數(shù)據(jù)類(lèi)型的實(shí)例;SOAP RPC表示(RPC representation),,表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定,;SOAP綁定(binding),使用底層協(xié)議交換信息,。 應(yīng)用中比較關(guān)注的是envelop,,由一個(gè)或多個(gè)Header和一個(gè)Body組成。 SOAP在可互操作的基礎(chǔ) Web 服務(wù)協(xié)議棧中的位置:
Ø Axis Axis本質(zhì)上就是一個(gè)SOAP引擎(Apache Axis is an implementation of the SOAP),,提供創(chuàng)建服務(wù)器端,、客戶(hù)端和網(wǎng)關(guān)SOAP操作的基本框架。但Axis并不完全是一個(gè)SOAP引擎,,它還包括: 是一個(gè)獨(dú)立的SOAP服務(wù)器,。 是一個(gè)嵌入Servlet引擎(例如Tomcat)的服務(wù)器。支持WSDL,。 提供轉(zhuǎn)化WSDL為Java類(lèi)的工具,。 提供例子程序。 提供TCP/IP數(shù)據(jù)包監(jiān)視工具
Ø AXIS的幾種服務(wù)類(lèi)型 AXIS有四種service styles,,分別是:RPC, Document, Wrapped, 和Message,。最常用的就是RPC和Message。
RPC:在AXIS中是一個(gè)默認(rèn)選項(xiàng),。當(dāng)你部署的時(shí)候使用下列兩種方式: 或則 ,,它遵循SOAP RPC和編碼規(guī)則。每個(gè)RPC都包括一個(gè)表示名稱(chēng)的外部接點(diǎn)和一些表示參數(shù)的內(nèi)部接點(diǎn),。AXIS會(huì)根據(jù)規(guī)則將一個(gè)XML(WSDL文件)文件轉(zhuǎn)化成一個(gè)JAVA對(duì)象,,并對(duì)對(duì)想賦上在文件中描述的值。也可以根據(jù)規(guī)則將一個(gè)JAVA對(duì)象轉(zhuǎn)化成XML文件,。
Document 適合于老的XML schema,。
Wrapped
和DOCUMENT一樣,適合于老的XML schema,。 在大多書(shū)情況下,,你不許要擔(dān)心是DOCUMENT服務(wù)還是WRAPPED服務(wù)。
Message
以這種方式部署的話(huà),,會(huì)使AXIS失去意義,,它使你的代碼真正的用XML形式,而不需要轉(zhuǎn)化成JAVA對(duì)象。以這種方式部署的有以下四種服務(wù)方法:
public Element [] method(Element [] bodies); public SOAPBodyElement [] method (SOAPBodyElement [] bodies); public Document method(Document body); public void method(SOAPEnvelope req, SOAPEnvelope resp);
幾種服務(wù)類(lèi)型的主要區(qū)別: 基于RPC(遠(yuǎn)程過(guò)程調(diào)用)方式,,這也是Web服務(wù)最常用的方式,。面向消息/文檔的的類(lèi)型跟RPC不同的是它提供了一個(gè)更底層的抽象,要求更多的編程工作,??蛻?hù)端可以傳入任何的XML文檔,得到的響應(yīng)不一定是SOAPEnvelope,,可以返回任何它所需要的東西,,甚至不返回。雖然這對(duì)開(kāi)發(fā)者來(lái)說(shuō)非常的靈活,,但是這種通訊類(lèi)型在實(shí)際的應(yīng)用中并不常見(jiàn),。面向消息/文檔的Web服務(wù)主要適合于下面幾種情況,比如批量處理,,基于表單的數(shù)據(jù)導(dǎo)入,,有需要返回非XML數(shù)據(jù)時(shí),Web服務(wù)器實(shí)現(xiàn)中要求直接訪(fǎng)問(wèn)傳輸層等等
Ø WSDL Web服務(wù)的接口定義語(yǔ)言,,由Ariba,、Intel、IBM,、MS等共同提出,,通過(guò)WSDL,可描述Web服務(wù)的三個(gè)基本屬性: ·服務(wù)做些什么——服務(wù)所提供的操作(方法) ·如何訪(fǎng)問(wèn)服務(wù)——和服務(wù)交互的數(shù)據(jù)格式以及必要協(xié)議 ·服務(wù)位于何處——協(xié)議相關(guān)的地址,,如URL
WSDL文檔以端口集合的形式來(lái)描述Web服務(wù),,WSDL 服務(wù)描述包含對(duì)一組操作和消息的一個(gè)抽象定義,綁定到這些操作和消息的一個(gè)具體協(xié)議,,和這個(gè)綁定的一個(gè)網(wǎng)絡(luò)端點(diǎn)規(guī)范,。 WSDL在Web 服務(wù)概念性協(xié)議棧中的位置
Ø WSDD WSDD就是WEB服務(wù)分布描述(Web Service Deployment Descriptor), 它定義了WEB服務(wù)的接口,如服務(wù)名,、提供的方法,、方法的參數(shù)等信息。
Ø UDDI UDDI就是統(tǒng)一描述,、發(fā)現(xiàn)和集成(Universal Description, Discovery, and Integration),。UDDI用于集中存放和查找WSDL描述文件,起著目錄服務(wù)器的作用,。
Web 服務(wù)中的角色,、操作和構(gòu)件: * 服務(wù)提供者。從企業(yè)的角度看,,這是服務(wù)的所有者,。從體系結(jié)構(gòu)的角度看,,這是托管訪(fǎng)問(wèn)服務(wù)的平臺(tái)。 * 服務(wù)請(qǐng)求者,。從企業(yè)的角度看,,這是要求滿(mǎn)足特定功能的企業(yè),。從體系結(jié)構(gòu)的角度看,,這是尋找并調(diào)用服務(wù),或啟動(dòng)與服務(wù)的交互的應(yīng)用程序,。服務(wù)請(qǐng)求者角色可以由瀏覽器來(lái)?yè)?dān)當(dāng),,由人或無(wú)用戶(hù)界面的程序(例如,另外一個(gè) Web 服務(wù))來(lái)控制它,。 * 服務(wù)注冊(cè)中心,。這是可搜索的服務(wù)描述注冊(cè)中心,服務(wù)提供者在此發(fā)布他們的服務(wù)描述,。在靜態(tài)綁定開(kāi)發(fā)或動(dòng)態(tài)綁定執(zhí)行期間,,服務(wù)請(qǐng)求者查找服務(wù)并獲得服務(wù)的綁定信息(在服務(wù)描述中)。對(duì)于靜態(tài)綁定的服務(wù)請(qǐng)求者,,服務(wù)注冊(cè)中心是體系結(jié)構(gòu)中的可選角色,,因?yàn)榉?wù)提供者可以把描述直接發(fā)送給服務(wù)請(qǐng)求者。同樣,,服務(wù)請(qǐng)求者可以從服務(wù)注冊(cè)中心以外的其它來(lái)源得到服務(wù)描述,,例如本地文件、FTP 站點(diǎn),、Web 站點(diǎn),、廣告和服務(wù)發(fā)現(xiàn)(Advertisement and Discovery of Services,ADS)或發(fā)現(xiàn) Web 服務(wù)(Discovery of Web Services,,DISCO),。 1.2 WebService用途Ø 異構(gòu)平臺(tái)或分布式平臺(tái)遠(yuǎn)程調(diào)用
2 WebService實(shí)例2.1 Axis包介紹Axis是一個(gè)實(shí)現(xiàn)WebService的Framework,Apache Web Services Project(http://ws. )的一個(gè)子項(xiàng)目 2.1.1 Axis1.4(Axis中最后Release版本)2.1.1.1 基本概念Ø Axis部署方式有兩種: 1,axis最方便的發(fā)布WebServices的方法是把你的.java改成.jws的放到Web發(fā)布文件夾下的根目錄下,此方法叫即時(shí)部署 注意:在你寫(xiě)的類(lèi)中不能有具體包的信息,,因?yàn)檫@正是Axis即時(shí)部署不支持的
2, 通過(guò)WSDD自定義部署 2.1.1.2 Axis自帶web分析Ø 下載axis1.4 Ø 啟動(dòng)tomcat4.1.31 Ø 拷貝webapps\axis到tomcat\ webapps中,tomcat自動(dòng)部署web module Ø 訪(fǎng)問(wèn): http://localhost:8080/axis/ ,一般可以正常訪(fǎng)問(wèn)到Apache-AXIS主頁(yè),并可以點(diǎn)擊list察看已發(fā)布的web service
Ø 重點(diǎn): 1,webservice只需要在一個(gè)web container中配置即可 2,axis自帶web.xml中的配置:
一個(gè)servlet監(jiān)聽(tīng)器:
三個(gè)servlet,其中紅色是主控程序
servlet的映射地址:
3,axis自帶的webservice在哪配的? 可能是寫(xiě)到 org.apache.axis.transport.http.AxisServlet 中的 2.1.1.3 編寫(xiě)自己的webservice下面是如何自己編寫(xiě)并發(fā)布一個(gè)web service的過(guò)程: 服務(wù)器測(cè)試環(huán)境:
2.1.1.3.1 編寫(xiě)并部署服務(wù)器的webservice1,新建一個(gè)類(lèi),如圖: 其中有三個(gè)方法,兩個(gè)簡(jiǎn)單方法和一個(gè)返回類(lèi)型為自定義類(lèi)的方法. 寫(xiě)方法 test3的原因主要是要研究webservice如何傳遞自定義類(lèi)以及如何在異構(gòu)平臺(tái)上傳遞和接收自定義類(lèi).
package com.bell.ws;
public class Class1 { public Class1() { } public String test1(String p1){ return "test1:"+p1; } public void test2(){ System.out.println("i‘m test2"); } public MyVO test3(MyVO myvo){ return myvo; } }
2, 在WEB-INF目錄下加入一個(gè)server-config.wsdd,。這是WebServices的發(fā)布描述文件,作用類(lèi)似于web.xml,。它有自己的格式 其內(nèi)容如下: <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml./axis/wsdd/" xmlns:java="http://xml./axis/wsdd/providers/java"> <service name="Class1" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="com.bell.ws.Class1"/> </service> </deployment>
重啟tomcat后,就可以看到剛剛發(fā)布的service了:
但這時(shí)點(diǎn)進(jìn)wsdl時(shí)會(huì)出錯(cuò):原因: server-config.wsdd中未加全內(nèi)容 把內(nèi)容加全后,測(cè)試成功: <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml./axis/wsdd/" xmlns:java="http://xml./axis/wsdd/providers/java" xmlns:handler="http://xml./axis/wsdd/providers/handler" xmlns:xsi="http://www./2001/XMLSchema-instance" name="defaultClientConfig" xsi:type="deployment"> <globalConfiguration name="defaultClientConfig"> <parameter name="disablePrettyXML" value="true"/> <parameter name="dotNetSoapEncFix" value="true"/> <requestFlow name="RequestFlow1" type=""> <handler name="Handler1" type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="session"/> </handler> <handler name="Handler2" type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="request"/> <parameter name="extension" value=".jwr"/> </handler> </requestFlow> </globalConfiguration> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <transport name="http" type=""> <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/> <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/> <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/> <requestFlow name="RequestFlow1" type=""> <handler name="Handler1" type="URLMapper"/> <handler name="Handler2" type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> </transport> <transport name="local" type=""> <responseFlow name="ResponseFlow1" type=""> <handler name="Handler1" type="LocalResponder"/> </responseFlow> </transport>
<service name="Class1" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="com.bell.ws.Class1"/> </service> </deployment>
成功頁(yè)面
2.1.1.3.2 編寫(xiě)客戶(hù)端程序調(diào)用遠(yuǎn)程webserviceØ 在上面webservice發(fā)布成功的前提下,編寫(xiě)客戶(hù)端程序進(jìn)行遠(yuǎn)程調(diào)用:
<%@ page import="org.apache.axis.client.Call,org.apache.axis.client.Service,org.apache.axis.encoding.XMLType,org.apache.axis.utils.Options" %> <%@ page import="javax.xml.namespace.QName,javax.xml.rpc.ParameterMode" %> <% try { Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL("http://localhost:8080/axis/services/Class1") ); call.setOperationName( new QName("http://ws.", "test1") ); call.addParameter( "arg1", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
String ret = (String) call.invoke( new Object[] { "first test!" } ); System.out.println("You typed : " + ret); out.println("ret"+ret); } catch (Exception e) { // e.printStackTrace(); System.err.println(e.toString()); } %>
正常調(diào)用的結(jié)果頁(yè)面如下:
2.1.1.3.3 編寫(xiě)返回復(fù)合類(lèi)型的webservice上面我們返回的只是簡(jiǎn)單的string型字串,下面舉例說(shuō)明如何返回復(fù)合類(lèi)型的webservice: 還是使用上面的Class1.java,其中方法test3是返回的MyVO類(lèi)型: 對(duì)server-config.wsdd進(jìn)行配置:
目前會(huì)出現(xiàn): java.io.IOException: No serializer found for class com.bell.ws.MyVO in registry org.apache.axis.encoding.TypeMappingDelegate@38fb59 2.1.2 Axis2
2.2 Jbuilder2006實(shí)現(xiàn)WebService
2.3 疑問(wèn)1,安全問(wèn)題 2,有狀態(tài)會(huì)話(huà)問(wèn)題等等 3,如何跨平臺(tái)返回復(fù)雜類(lèi)型 4,即然java源文件+wsdd文件即可部署web service,jbuilder中生成的一堆文件是干嘛用的? 3 WebService開(kāi)發(fā)經(jīng)驗(yàn)(網(wǎng)上摘抄)摘自網(wǎng)址:http://www./topic/73047 去年,,在一個(gè)大型項(xiàng)目(1500w)中用到Web Services,現(xiàn)在項(xiàng)目進(jìn)入了尾聲,,所以對(duì)以前的開(kāi)發(fā)經(jīng)歷做一個(gè)總結(jié),。 如果有以上需求,,我想大家應(yīng)該都比較認(rèn)同這種異構(gòu)分布式解決方案:客戶(hù)端用C# .Net開(kāi)發(fā),通過(guò)Web Services調(diào)用服務(wù)器端Java組件,。 其實(shí),,上面的解決方案太過(guò)于理想,最后我們不得不面對(duì)殘酷的現(xiàn)實(shí):三種客戶(hù)端中的兩種最后被迫改為B/S,。 以下是我們開(kāi)發(fā)中遇到的實(shí)際問(wèn)題,雖然最終都一一解決,,但遇到了幾個(gè)無(wú)法突破的瓶頸:客戶(hù)端不穩(wěn)定,,客戶(hù)端響應(yīng)遲緩,后期測(cè)試和維護(hù)困難巨大,。 一,、異構(gòu)平臺(tái)的Web Services兼容性 由于Axis是一個(gè)嵌入式引擎,,所以可以將其打包到最終的WebSphere AppServer(WAS)上,,也就是說(shuō),我們沒(méi)有用到WAS提供的Web Services引擎,,這引出了后面會(huì)談到的一個(gè)問(wèn)題:Web Services安全性怎么部署,? 用Axis時(shí),,Axis一直都有一個(gè)bug或是說(shuō)缺陷,,官方文檔也詳細(xì)注明,只是我們當(dāng)時(shí)沒(méi)有發(fā)現(xiàn)而走了很多彎路:用Axis發(fā)布的Web Services給.net客戶(hù)端調(diào)用時(shí),,必須用RPC風(fēng)格,,不能用Web Services標(biāo)準(zhǔn)的跨平臺(tái)風(fēng)格Document,而后者是Lomboz axis插件的默認(rèn)方式,。也就是說(shuō),,我們發(fā)布的Web Services總是莫名其妙的不好用。我們用JBuilder2007自帶的Axis插件發(fā)布,,竟然非常順利,。 二、Web Services開(kāi)發(fā)中服務(wù)器端組件問(wèn)題 另外一個(gè)問(wèn)題是,我們的service方法,,如果直接給WebWork這樣的框架在服務(wù)端用的的話(huà),,是不會(huì)出問(wèn)題,,當(dāng)提供給.net客戶(hù)端用時(shí),就會(huì)出現(xiàn)lazy loading的錯(cuò)誤,,因?yàn)?span>.net客戶(hù)端不能接收Proxy對(duì)象,,必須將數(shù)據(jù)全部load出來(lái),但這時(shí)Hibernate的session已經(jīng)關(guān)閉,。項(xiàng)目組很多人遇到這些問(wèn)題,,最后大家不約而同的全部用eager模式,導(dǎo)致了最后的惡果:嚴(yán)重的的性能問(wèn)題,。由于我不是leader,,所以當(dāng)時(shí)這個(gè)問(wèn)題發(fā)現(xiàn)了,也沒(méi)法要求別人,,畢竟很大的一個(gè)團(tuán)隊(duì),。 當(dāng)然,,性能問(wèn)題不只是由Hibernate引起,Web Services本身的性能也非常嚴(yán)重:XML的序列化和反序列化耗時(shí),,XML文件的膨脹導(dǎo)致的網(wǎng)絡(luò)傳輸,,HTTP的無(wú)狀態(tài)導(dǎo)致網(wǎng)絡(luò)IO性能。切身體會(huì):如果系統(tǒng)必須用分布式,,而不是追求所謂的SOA架構(gòu),,Web Services應(yīng)該是下下策,因?yàn)檫€有很多協(xié)議和方式可以選擇:IIOP,、RMI,、Hessian、burlap,、RPC,,另外,做系統(tǒng)集成還有Message方式,。 Web Services開(kāi)發(fā)中其它問(wèn)題比較少,,因?yàn)?span>Web Services本身不用編程,只是部署的事情,,開(kāi)發(fā)工具和服務(wù)器會(huì)自動(dòng)為我們做,,我們只需要理解SOAP引擎的原理和使用就夠了,真的遇到問(wèn)題,,可以通過(guò)Axis的TcpMonitor監(jiān)視SOAP數(shù)據(jù)包,。 三,、Web Services的安全問(wèn)題 最后這些問(wèn)題基本上都解決了,,不過(guò)還是沒(méi)有用上,因?yàn)樵谖覀円呀?jīng)開(kāi)發(fā)的幾種客戶(hù)端和服務(wù)器端部署上很麻煩,,還要測(cè)試,,另外,,客戶(hù)也沒(méi)法驗(yàn)收這個(gè)啊,。 當(dāng)然,我們還回避了一個(gè)嚴(yán)肅的問(wèn)題:我們的Web Services是發(fā)布在Axis引擎上,,還沒(méi)有移植到WAS的Web Services引擎,,而發(fā)布在這個(gè)平臺(tái),必須有RAD這類(lèi)開(kāi)發(fā)工具支持,,幾乎沒(méi)法手動(dòng)做,。WAS引擎的Web Services安全配置異常復(fù)雜:我們當(dāng)時(shí)只配置了Authentication和Integration,沒(méi)有做Encryption,,但完全夠用,。我當(dāng)時(shí)用Sun的NetBean開(kāi)發(fā)工具發(fā)布了一下Web Serivces,也是挺好用的,,不過(guò)沒(méi)有配置安全,。順便說(shuō)一下,Sun的web Services引擎jwsdp2.0設(shè)計(jì)有點(diǎn)類(lèi)似于EJB容器,,很不好用,,移植性特差。 WAS的Web Services安全配置,,對(duì)照IBM的紅皮書(shū),,不是很難,但很復(fù)雜,,安全相關(guān)的xml代碼都好幾百行,,好幾個(gè)文件。配置過(guò)程中,,和.net客戶(hù)端通訊時(shí)遇到一個(gè)問(wèn)題,,怎么也不能互通,但.net和.net客戶(hù)端可以互通,,Java和Java客戶(hù)端也可以互通,最后我通過(guò)攔截soap包,找到了解決辦法: 必須手動(dòng)更改http://docs./wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 后的v3,,IBM工具生成的是v1,這是標(biāo)準(zhǔn)不兼容引起的,,因?yàn)楫?dāng)時(shí)RAD是04年底,而微軟的WSE3.0比較新,。后來(lái)發(fā)現(xiàn)這篇文章有相似的經(jīng)歷:http:///blogs/kirillg/archive/2005/04/13/7315.aspx 在處理Web Services安全過(guò)程中,我通過(guò)emule和IBM網(wǎng)站下載了上10本這方面的書(shū)籍,,我覺(jué)得以下資料對(duì)我?guī)椭畲螅?span> Axis的若干文檔:Reference,、developers-guide、architecture-guide等,,非常詳細(xì) 四,、開(kāi)發(fā)過(guò)程中的的溝通問(wèn)題 從技術(shù)的角度表達(dá)就是:客戶(hù)端開(kāi)發(fā)人員需要的接口,服務(wù)器端開(kāi)發(fā)人員不清楚,;服務(wù)器端開(kāi)發(fā)人員也不知道怎么把握粒度,。譬如,有個(gè)updateUser方法,,但更新用戶(hù)信息時(shí),,可能需要更新很多信息:用戶(hù)信息、用戶(hù)角色,、用戶(hù)所屬組….,。loadUser時(shí)也有同樣的按需加載問(wèn)題。 當(dāng)然,,從技術(shù)角度,,開(kāi)發(fā)Web Serivces有Bottom-up和Top-down兩種開(kāi)發(fā)模式。我們選擇了前者,,也是最常見(jiàn)的方式,,也許用后者更適合我們的項(xiàng)目:從定義的wsdl文件開(kāi)始,客戶(hù)端和服務(wù)器端開(kāi)發(fā)都遵循它,。但問(wèn)題是:我們?cè)趺创_定wsdl,,也就是我們所要求的接口,因?yàn)槲覀冏约簩?duì)業(yè)務(wù)都不是很熟,。 五,、客戶(hù)端和服務(wù)端開(kāi)發(fā)測(cè)試方法 但問(wèn)題是: 服務(wù)器組件測(cè)試一次,,起容器特慢,而且客戶(hù)端調(diào)用也慢,。 我自己認(rèn)為的解決方案,但未必真的好用: 六,、其它問(wèn)題 特別提的一點(diǎn)是,,我們幾乎開(kāi)發(fā)了兩套“業(yè)務(wù)層+持久化”解決方案,,因?yàn)殡x線(xiàn)客戶(hù)端也用了NHibernate持久化,這樣導(dǎo)致開(kāi)發(fā)測(cè)試工作量巨大,,就說(shuō)一點(diǎn)吧:兩邊同步是通過(guò)打包的sql語(yǔ)句,,通過(guò)SOAP傳輸,但Access和DB2的sql有不兼容問(wèn)題,,如果要兼容,,就會(huì)以犧牲性能和靈活性為代價(jià)。 另外,我們寫(xiě)項(xiàng)目建議書(shū)時(shí)很被動(dòng),,但也沒(méi)辦法,,因?yàn)橛泻脦准夜靖?jìng)爭(zhēng)。對(duì)我們影響極大的幾個(gè)問(wèn)題: 1,、IBM的WAS比起WebLogic Server易用性差遠(yuǎn)了,,導(dǎo)致部署時(shí)極其耗時(shí)。而且還有一些bug,,譬如連接池資源,,當(dāng)時(shí)不得不和IBM工程師咨詢(xún)。實(shí)際上,,我們只用到強(qiáng)大的WAS的一個(gè)非常小的部分:Web容器,。 當(dāng)然,,這個(gè)子系統(tǒng)只是我們那個(gè)龐大系統(tǒng)的一個(gè)部分。上面也就算我做的一點(diǎn)點(diǎn)總結(jié)吧,,也是教訓(xùn)?。〔贿^(guò),,從個(gè)人角度考慮,,學(xué)到的東西還是很多的。 這個(gè)子系統(tǒng)花去了我們將近200個(gè)人月,,如果說(shuō)那浪費(fèi)的部分,,估計(jì)至少是100個(gè)人月的工作量。是什么導(dǎo)致,?從我這篇文章只能窺其一角,,因?yàn)檎麄€(gè)系統(tǒng)涉及CMS、OA,、BI,、E-commerce、GIS,、IM,、MIS。我自己總結(jié)一下,,有以下原因: 不過(guò),說(shuō)實(shí)話(huà),,項(xiàng)目團(tuán)隊(duì),,特別是進(jìn)公司一、兩年的員工都很努力,,沒(méi)有人抱怨什么,我和他(她)們一起合作,還是很開(kāi)心的,。
4 參考資料或網(wǎng)站:
WebService學(xué)習(xí),,開(kāi)發(fā)總結(jié) http://www./blog/user1/261/archives/2006/2095.html
Axis初學(xué)手冊(cè) |
|
來(lái)自: 雨憶 > 《soa&webservices》