liaowz

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            3 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

          2006年2月27日 #

          用Globus Toolkit 4構(gòu)建WEB服務(wù)

          xzzhouhu 發(fā)表于 2005-12-06
          點(diǎn)擊數(shù):1041 評(píng)論數(shù):0 評(píng)價(jià):3/1
          關(guān)鍵詞:Globus Toolkit

          摘要:

          本文主要介紹了通過(guò)一種新的方法來(lái)構(gòu)建企業(yè)軟件,即通過(guò)調(diào)整Globus Toolkit 4實(shí)現(xiàn)的網(wǎng)格計(jì)算的概念來(lái)實(shí)現(xiàn)。GT4是一種可以通過(guò)開(kāi)放網(wǎng)格服務(wù)架構(gòu)(OGSI)來(lái)實(shí)施的開(kāi)放資源。這種實(shí)施主要目的是為網(wǎng)格服務(wù)架構(gòu)提供了依據(jù),同時(shí)也可以為別的網(wǎng)格服務(wù)架構(gòu)實(shí)施提供參考。本文詳細(xì)介紹了GT4中JAVA的核心服務(wù),這些服務(wù)具備提供代管網(wǎng)格服務(wù)實(shí)時(shí)運(yùn)行環(huán)境的能力,當(dāng)然這些網(wǎng)格服務(wù)都是由JAVA寫(xiě)的。實(shí)時(shí)運(yùn)行環(huán)境在網(wǎng)格服務(wù)的應(yīng)用和網(wǎng)絡(luò)承載之間和傳輸協(xié)議引擎之間起到了協(xié)調(diào)的作用。

          文章工具


          用Globus Toolkit 4(GT4)構(gòu)建WEB服務(wù)

          作者:Birali Hakizumwami

          譯者:xzzhouhu






          版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
          作者:Birali Hakizumwami;xzzhouhu
          原文地址:http://www.onjava.com/pub/a/onjava/2005/10/19/constructing-web-services-with-globus-toolkit.html
          中文地址:http://www.matrix.org.cn/resource/article/44/44032_Globus_Toolkit.html
          關(guān)鍵詞: Globus Toolkit

          摘要:
          本文主要介紹了通過(guò)一種新的方法來(lái)構(gòu)建企業(yè)軟件,即通過(guò)調(diào)整Globus Toolkit 4實(shí)現(xiàn)的網(wǎng)格計(jì)算的概念來(lái)實(shí)現(xiàn)。GT4是一種可以通過(guò)開(kāi)放網(wǎng)格服務(wù)架構(gòu)(OGSI)來(lái)實(shí)施的開(kāi)放資源。這種實(shí)施主要目的是為網(wǎng)格服務(wù)架構(gòu)提供了依據(jù),同時(shí)也可以為別的網(wǎng)格服務(wù)架構(gòu)實(shí)施提供參考。本文詳細(xì)介紹了GT4中JAVA的核心服務(wù),這些服務(wù)具備提供代管網(wǎng)格服務(wù)實(shí)時(shí)運(yùn)行環(huán)境的能力,當(dāng)然這些網(wǎng)格服務(wù)都是由JAVA寫(xiě)的。實(shí)時(shí)運(yùn)行環(huán)境在網(wǎng)格服務(wù)的應(yīng)用和網(wǎng)絡(luò)承載之間和傳輸協(xié)議引擎之間起到了協(xié)調(diào)的作用。


          一.網(wǎng)格的定義

          網(wǎng)格的定義:
          網(wǎng)格就是將收集網(wǎng)絡(luò)上所有可用的分布式計(jì)算資源提供給最終用戶(hù)或組建成一個(gè)巨大的計(jì)算系統(tǒng)。網(wǎng)格計(jì)算給分布式計(jì)算提供了一種全新的方法,不僅在跨地區(qū)而且在跨組織,機(jī)器結(jié)構(gòu)和軟件限制,給連接到網(wǎng)格的每個(gè)用戶(hù)提供更多的資源,計(jì)算機(jī)之間的協(xié)作和信息訪問(wèn)。分布式資源,像計(jì)算周期,存儲(chǔ)和信息,可以在網(wǎng)格中的任何地區(qū)訪問(wèn),同時(shí)也可以在網(wǎng)格中提供這些服務(wù)供其他用戶(hù)訪問(wèn)。這就要通過(guò)在每個(gè)獨(dú)立的組織或資源之間進(jìn)行安全的協(xié)調(diào)資源共享,共同建立一個(gè)動(dòng)態(tài)虛擬組織機(jī)構(gòu)。


          二.Globus Toolkit Version 4

          在本文中,我們主要討論GT4中JAVA的核心服務(wù)。(如圖1),這些服裉峁┝舜芡穹袷凳痹誦謝肪車(chē)哪芰ΑJ凳痹誦謝肪吃謨沒(méi)Фㄒ宓撓τ梅窈虶T4的核心服務(wù)之間,網(wǎng)絡(luò)承載和傳輸協(xié)議引擎之間起到了協(xié)調(diào)的作用。GT4核心服務(wù)還提供了程序開(kāi)發(fā)支持的功能,包括開(kāi)放式開(kāi)發(fā)模式和訪問(wèn)網(wǎng)格服務(wù)的實(shí)現(xiàn),像GRAM(Grid Resource Allocation Management,網(wǎng)格資源管理)。應(yīng)用GT4強(qiáng)有力的理由就是因?yàn)樗墙⒃诂F(xiàn)有的WEB服務(wù)標(biāo)準(zhǔn)和技術(shù)的基礎(chǔ)上,像SOAP和WSDL。網(wǎng)格服務(wù)提供的接口都是通過(guò)WSDL來(lái)描述的。GT4提供了一個(gè)軟件倉(cāng)庫(kù),像安全支持,軟件的探索,軟件的資源管理,軟件的調(diào)用,軟件之間的通信,異常處理和數(shù)據(jù)管理等。

          image
          ?????????????????? (圖1)

          圖1主要描述了在服務(wù)器端的GT4中的主要組件結(jié)構(gòu)。這只是GT4所提供功能的一部分,我們只是認(rèn)為它很適合本文。GT4結(jié)構(gòu)由一個(gè)網(wǎng)格容器組成,網(wǎng)格容器主要用來(lái)管理所有部署的WEB服務(wù),貫穿于每個(gè)WEB服務(wù)的運(yùn)行周期。GT4使用apache的axis作為它的WEB服務(wù)的引擎來(lái)處理所有的SOAP消息,JAX-RPC (Java API for XML-Based RPC)處理和WEB服務(wù)的配置。


          三.貸款償還例子:

          我們列舉這樣一個(gè)例子,主要想向大家展示在企業(yè)內(nèi)部如何通過(guò)Globus Toolkit 來(lái)解決不同類(lèi)操作系統(tǒng)之間進(jìn)行融合。在企業(yè)內(nèi)部,有些應(yīng)用可能是原來(lái)主機(jī)遺留下來(lái)的,技術(shù)比較落后,有些應(yīng)用已經(jīng)采用了現(xiàn)代技術(shù),像J2EE。甚至我們采用最先進(jìn)的技術(shù)在一個(gè)企業(yè)內(nèi)部的應(yīng)用之間進(jìn)行信息共享也要面臨巨大的挑戰(zhàn)。圖2給出了這樣一個(gè)例子,在一個(gè)抵押機(jī)構(gòu)內(nèi),在貸款償還信息處理和會(huì)計(jì)部門(mén)信息處理之間的交互,

          image
          ????????????????(圖2)

          會(huì)計(jì)部門(mén)使用申請(qǐng)貸款處理服務(wù)來(lái)申請(qǐng)貸款。

          為了創(chuàng)建和部署網(wǎng)格服務(wù),我們需要:
          *通過(guò)創(chuàng)建WSDL文件來(lái)定義服務(wù)的接口
          *用JAVA來(lái)實(shí)現(xiàn)
          *通過(guò)創(chuàng)建WSDD文件來(lái)定義服務(wù)的部署參數(shù)
          *使用ANT編譯源代碼并生成GAR文件
          *用GT4分發(fā)工具部署GAR文件
          我們必須使用從上往下的方法來(lái)創(chuàng)建網(wǎng)格服務(wù),(圖3)

          這種方法首先從提供WSDL文件開(kāi)始,在WSDL文件中包括對(duì)WEB服務(wù)的抽象定義,包括服務(wù)類(lèi)型,消息類(lèi)型和端口類(lèi)型。從WSDL文檔開(kāi)始并根據(jù)WSDL文檔創(chuàng)建了JAVA模型,從而導(dǎo)致與其他系統(tǒng)更好交互。

          image

          ??我們使用GT4 toolkit自帶的工具來(lái)進(jìn)行服務(wù)的綁定和產(chǎn)生客戶(hù)段需要的根類(lèi)。這種方法的下一步就是提供接口的實(shí)現(xiàn)。

          貸款償還服務(wù)處理定義:
          對(duì)于貸款償還服務(wù)處理的例子的接口類(lèi)型我們定義為loan.wsdl,它描述了貸款償還服務(wù)所提供的三個(gè)部分的操作(申請(qǐng)貸款,貸款處理和獲得貸款)。首先我們描述貸款償還服務(wù)的請(qǐng)求和響應(yīng):

          <types>

          ??<xsd:element name="createLoan">
          ????<xsd:complexType>
          ??????<xsd:sequence>
          ??????????<xsd:element name="loanNumber" type="xsd:int"/>
          ????????<xsd:element name="amountUPB" type="xsd:double"/>
          ??????</xsd:sequence>
          ????</xsd:complexType>
          ??</xsd:element>
          ??<xsd:element name="createLoanResponse">
          ????<xsd:complexType>
          ??????<xsd:sequence>
          ????????<xsd:element name="returnValue" type="xsd:int"/>
          ??????</xsd:sequence>
          ????</xsd:complexType>
          ??</xsd:element>

          ??<xsd:element name="processLoanPayment">
          ????<xsd:complexType>
          ??????<xsd:sequence>
          ????????<xsd:element name="loanNumber" type="xsd:int"/>
          ????????<xsd:element name="amount" type="xsd:double"/>
          ??????</xsd:sequence>
          ????</xsd:complexType>
          ??</xsd:element>
          ??<xsd:element name="processLoanPaymentResponse">
          ????<xsd:complexType>
          ??????<xsd:sequence>
          ????????<xsd:element name="returnValue" type="xsd:int"/>
          ??????</xsd:sequence>
          ????</xsd:complexType>
          ??</xsd:element>

          ??<xsd:element name="getLoan">
          ????<xsd:complexType>
          ??????<xsd:sequence>
          ????????<xsd:element name="loanNumber" type="xsd:int"/>
          ??????</xsd:sequence>
          ????</xsd:complexType>
          ??</xsd:element>
          ??<xsd:element name="getLoanResponse">
          ????<xsd:complexType>
          ??????<xsd:sequence>
          ????????<xsd:element name="returnValue" type="tns:LoanType"/>
          ??????</xsd:sequence>
          ????</xsd:complexType>
          ??</xsd:element>

          </types>


          我們?cè)谖募?loan.xsd.中定義了貸款的數(shù)據(jù)類(lèi)型,我們通過(guò)使用“ import <xsd:import schemaLocation="loan.xsd"/> ”可以直接將loan.xsd.文件導(dǎo)入到文件loan.wsdl 中,并且用它作為獲得貸款操作返回的類(lèi)型

          <complexType name="LoanType">
          ????<sequence>
          ????????<element name="loanNumber" type="int"/>
          ????????<element name="UPB" type="double"/>
          ????????<element name="status" type="string"/>
          ????????<element name="createDate" type="string"/>
          ????</sequence>
          </complexType>


          下一步,我們要定義所有的消息服務(wù)。一條消息元素可能由一個(gè)或多個(gè)部分組成,消息元素的每個(gè)部分對(duì)應(yīng)一個(gè)參數(shù),并且還有一個(gè)類(lèi)型屬性。消息既可以是一個(gè)請(qǐng)求消息(輸入消息),也可以是一個(gè)響應(yīng)消息(輸出消息)。

          <message name="CreateLoanInputMessage">
          ??<part name="parameters" element="tns:createLoan"/>
          </message>
          <message name="CreateLoanOutputMessage">
          ??<part name="parameters" element="tns:createLoanResponse"/>
          </message>

          <message name="ProcessLoanPaymentInputMessage">
          ??<part name="parameters" element="tns:processLoanPayment"/>
          </message>
          <message name="ProcessLoanPaymentOutputMessage">
          ??<part name="parameters"
          ????element="tns:processLoanPaymentResponse"/>
          </message>

          <message name="GetLoanInputMessage">
          ??<part name="parameters" element="tns:getLoan"/>
          </message>
          <message name="GetLoanOutputMessage">
          ??<part name="parameters" element="tns:getLoanResponse"/>
          </message>


          最后我們定義所有的端口類(lèi)型,每個(gè)接口類(lèi)型定義了一個(gè)或多個(gè)操作來(lái)使用當(dāng)前的操作元素,每個(gè)獨(dú)立的操作元素又定義了一個(gè)操作和與操作有聯(lián)系的消息的輸入輸出。在一個(gè)端口類(lèi)型內(nèi)操作元素定義了端口類(lèi)型內(nèi)所有調(diào)用方法的語(yǔ)法。

          <portType name="LoanPortType">
          ??<operation name="createLoan">
          ????<input message="tns:CreateLoanInputMessage"/>
          ????<output message="tns:CreateLoanOutputMessage"/>
          ????<fault name="Fault" message="ogsi:FaultMessage"/>
          ??</operation>
          ??<operation name="processLoanPayment">
          ????<input message="tns:ProcessLoanPaymentInputMessage"/>
          ????<output message="tns:ProcessLoanPaymentOutputMessage"/>
          ????<fault name="Fault" message="ogsi:FaultMessage"/>
          ??</operation>
          ??<operation name="getLoan">
          ????<input message="tns:GetLoanInputMessage"/>
          ????<output message="tns:GetLoanOutputMessage"/>
          ????<fault name="Fault" message="ogsi:FaultMessage"/>
          ??</operation>
          </portType>


          服務(wù)的實(shí)現(xiàn):
          ??在前面的步驟中,終端貸款端口類(lèi)型的接口已經(jīng)產(chǎn)生,在定義這些端口類(lèi)型的接口時(shí),所有的遠(yuǎn)程操作都要設(shè)為public,并且拋出java.rmi.RemoteException。在本文中給出了LoanServiceImpl類(lèi),主要實(shí)現(xiàn)貸款端口類(lèi)型的接口,這些實(shí)現(xiàn)要用到前面所講到的用loan.wsdl文件所生成的根類(lèi)。

          public class LoanServiceImpl implements LoanPortType


          其中LoanServiceImpl 所實(shí)現(xiàn)的方法定義在LoanPortType接口中,createLoan方法在產(chǎn)生一個(gè)createLoan對(duì)象的構(gòu)造器中要獲取一個(gè)貸款數(shù)字作為它的參數(shù)。

          public CreateLoanResponse createLoan(CreateLoan cl)
          throws java.rmi.RemoteException
          public ProcessLoanPaymentResponse processLoanPayment(ProcessLoanPayment plp)
          throws java.rmi.RemoteException
          public GetLoanResponse getLoan(GetLoan gl) throws java.rmi.RemoteException


          請(qǐng)參考完整代碼詳細(xì)描述方法的實(shí)現(xiàn)。

          編譯并創(chuàng)建貸款/償還處理的WEB服務(wù):
          下面我們介紹通過(guò)以下步驟來(lái)創(chuàng)建易部署的GT4打包文檔。Ant在編譯本文所提供文件時(shí)所產(chǎn)生的build.xml中包含了ant的執(zhí)行任務(wù)的步驟。在build.xml中ant的執(zhí)行任務(wù)調(diào)用GT4中的ant任務(wù),這些任務(wù)伴隨著GT4的發(fā)布可以在編譯文件中找到。

          %GLOBUS_LOCATION%/share/globus_wsrf_common/build-packages.xml
          %GLOBUS_LOCATION%/share/globus_wsrf_tools/build-stubs.xml
          %GLOBUS_LOCATION%/share/schema


          編譯GT4中易部署的GAR文件
          ?? 為了創(chuàng)建易部署的網(wǎng)格打包文件,loan.gar,我們通過(guò)以下步驟來(lái)實(shí)現(xiàn):(這些步驟與builder.xml中的ant任務(wù)是一致的):
          ·????????與WSDL文件綁定
          ·????????通過(guò)WSDL????????文件生成一個(gè)根類(lèi),在安裝時(shí),提供一個(gè)特殊文件來(lái)對(duì)不同的命名空間和包之間進(jìn)行映射,這些包與表格中的目錄結(jié)構(gòu)一致。
          ·????????編譯根類(lèi)
          ·????????編譯接口類(lèi)
          ·????????用JAR壓縮接口類(lèi),和根類(lèi)一樣(loan.jar and loan_stubs.jar).
          ·????????通過(guò)創(chuàng)建部署描述文件deploy-server.wsdd.來(lái)生成易部署的GAR文件,loan.gar
          請(qǐng)參考源代碼中完整的build.xml文件,通過(guò)以上步驟來(lái)實(shí)現(xiàn)一系列的ant編譯任務(wù)。GT4描述我們的WEB服務(wù)文件deploy-server.wsdd就想這樣:

          <service name="loan/impl/LoanService" provider="Handler"
          use="literal" style="document">
          ????<parameter name="className" value="loan.impl.LoanServiceImpl"/>
          ????<wsdlFile>share/schema/loan/Loan_service.wsdl</wsdlFile>
          ????<parameter name="allowedMethods" value="*"/>
          ????<parameter name="handlerClass"
          ????value="org.globus.axis.providers.RPCProvider"/>
          ????<parameter name="scope" value="Application"/>
          ????<parameter name="providers" value="GetRPProvider"/>
          ????<parameter name="loadOnStartup" value="true"/>
          </service>


          讓我們來(lái)介紹一下deploy-server.wsdd中的一些參數(shù):
          服務(wù)名稱(chēng):指定我們所提供的WEB服務(wù)的路徑,我們將它與WEB服務(wù)容器的地址相結(jié)合起來(lái),我們會(huì)得到WEB服務(wù)的完整的URL。為了便于測(cè)試,使用獨(dú)立的GT4容器,URL就像這樣:

          http://localhost:8080/wsrf/services/loan/impl/LoanService

          類(lèi)名:指實(shí)現(xiàn)服務(wù)接口的類(lèi)(LoanServiceImpl).
          WSDL文件:告訴GT4中的WEB服務(wù)容器對(duì)于當(dāng)前的WEB服務(wù)的WSDL文件在那里可以找到。WSDL文件Loan_service.wsdl是在GT4 從loan.wsdl進(jìn)行ANT時(shí)自動(dòng)產(chǎn)生的。
          啟動(dòng)時(shí)裝載:如果我們需要服務(wù)在WEB服務(wù)容器啟動(dòng)時(shí)就開(kāi)始裝載,允許我們控制服務(wù)的裝載。

          部署GAR文件:
          GAR文件loan.gar包含了所有的文件和WEB服務(wù)器需要的部署信息,我們使用GT4部署工具:

          %GLOBUS_LOCATION%/bin/globus-deploy-gar $PROJECT_HOME/loan.gar

          拷貝文檔文件(loan.wsdl,編譯的根類(lèi),編譯的接口實(shí)現(xiàn),loan.wsdd)到GT4容器的目錄下適當(dāng)位置。

          測(cè)試借貸款處理實(shí)例

          在圖1描述了如何將貸款方的子系統(tǒng)和貸款結(jié)算子系統(tǒng)作為借貸款的WEB服務(wù)的客戶(hù)端,現(xiàn)在我們就在GT4網(wǎng)格服務(wù)容器中創(chuàng)建和部署WEB服務(wù),我們需要用一個(gè)客戶(hù)端進(jìn)行測(cè)試,測(cè)試用例模擬一個(gè)貸款事件,一個(gè)貸款月度償還事件和一個(gè)貸款還清事件。作為客戶(hù)端來(lái)說(shuō),他們希望WEB服務(wù)的URI(統(tǒng)一資源標(biāo)識(shí)符)能夠作為客戶(hù)端訪問(wèn)WEB服務(wù)的依據(jù)。客戶(hù)端的程序要獨(dú)立的進(jìn)行編譯,下面來(lái)描述客戶(hù)端訪問(wèn)WEB服務(wù)的主要步驟:

          創(chuàng)建一終端引用類(lèi)型對(duì)象,來(lái)代表終端引用的貸款服務(wù)。我們的終端引用只需要服務(wù)的URI:
          EndpointReferenceType endpoint = new EndpointReferenceType();
          endpoint.setAddress(new Address(serviceURI));

          下一步,我們要獲得引用服務(wù)的端口類(lèi)型,這需要一個(gè)根類(lèi)調(diào)用LoanServiceAddressingLocator, LoanServiceAddressingLocator主要是用來(lái)維持客戶(hù)端與WEB服務(wù)之間的通信和獲得引用貸款端口的類(lèi)型。
          LoanServiceAddressingLocator locator = new LoanServiceAddressingLocator();
          LoanPortType loanPT = locator.getLoanPortTypePort(endpoint);


          一旦我們獲得這個(gè)引用,我們可以作為本地對(duì)象來(lái)操作WEB服務(wù)。例如,調(diào)用遠(yuǎn)程的創(chuàng)建操作,我們僅僅需要在貸款端口類(lèi)型中使用創(chuàng)建方法。
          CreateLoanResponse clr = loanPT.createLoan(new CreateLoan(amount, loanNumber));

          請(qǐng)參考附件中完整的客戶(hù)端代碼。在編譯客戶(hù)端之前,請(qǐng)保證運(yùn)行下面的腳本,以便于GT4的發(fā)布:
          %GLOBUS_LOCATION%/etc/globus-devel-env.bat

          globus-devel-env.bat文件主要是將Globus的類(lèi)庫(kù)注冊(cè)到系統(tǒng)的classpath中,因?yàn)榭蛻?hù)端是作為獨(dú)立的應(yīng)用來(lái)編譯的,同樣,要保證在編譯客戶(hù)端的目錄中所放置的已編譯的根類(lèi)時(shí)能通過(guò)classpath找到,因此我們的客戶(hù)端可以訪問(wèn)服務(wù)器端的根類(lèi),像LoanServiceAddressingLocator。

          啟動(dòng)網(wǎng)格容器
          使用下面的命令來(lái)啟動(dòng)網(wǎng)格容器:

          %GLOBUS_LOCATION%/bin/globus-start-container –nosec

          -nosec參數(shù)主要是為了簡(jiǎn)化測(cè)試,略去安全設(shè)置。如果網(wǎng)格容器啟動(dòng)成功,你將會(huì)看到已部署的服務(wù)的URI列表,如果LoanService正確的部署,在已部署的服務(wù)的列表中有下面的一行:

          [13]: http://localhost:8080/wsrf/services/loan/impl/LoanService

          測(cè)試借貸款處理的WEB服務(wù)
          通過(guò)客戶(hù)端進(jìn)行測(cè)試,我們假設(shè)有以下操作:申請(qǐng)貸款,償還貸款,還清貸款。

          ·????????創(chuàng)建一個(gè)初始化貸款編號(hào)為100并且還有12000未還????????
          java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService createLoan 100 120000
          Loan 100 created successfully.


          ·????????假定兩個(gè)月償還,每個(gè)月還$1100(本例不考慮利息的計(jì)算)
          java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 1100
          Loan 100 processed successfully.
          java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 1100
          Loan 100 processed successfully.


          ·????????查看貸款的狀態(tài)
          java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService getLoanData 100
          Loan Data
          Create Date Mon Jun 06 16:41:06 EDT 2005
          Unpaid Principal Balance 117800.0
          Status ACTIVE


          ·????????第三個(gè)月還清余款($117,800)
          java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 117800
          Loan 100 processed successfully


          ·????????查看貸款狀態(tài)
          java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService getLoanData 100
          Loan Data
          Create Date Mon Jun 06 16:41:06 EDT 2005
          Unpaid Principal Balance 0.0
          Status PAIDOFF


          結(jié)束語(yǔ):

          本文主要描述了在基于現(xiàn)有的WEB服務(wù)標(biāo)準(zhǔn)的基礎(chǔ)上,如何調(diào)整GT4網(wǎng)格結(jié)構(gòu)來(lái)創(chuàng)建一個(gè)網(wǎng)格服務(wù)應(yīng)用。盡管GT4已經(jīng)主要的應(yīng)用在大型的科學(xué)計(jì)算問(wèn)題上,但是在一個(gè)企業(yè)內(nèi)部它可以作為實(shí)現(xiàn)面向服務(wù)結(jié)構(gòu)(SOA)的一種方法。本文主要是通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)描述如何使用GT4中的JAVA核心服務(wù)來(lái)創(chuàng)建和部署一個(gè)網(wǎng)格服務(wù),但是并沒(méi)有覆蓋到更多的其他的更先進(jìn)的關(guān)于如何使用網(wǎng)格服務(wù)概念,向網(wǎng)格服務(wù)的分配和管理,文件傳輸?shù)目煽啃裕W(wǎng)格異常和安全。

          資源
          ·本文的示例代碼
          ·Matrix-Java開(kāi)發(fā)者社區(qū):http://www.matrix.org.cn
          ·onjava.com:onjava.com
          posted @ 2006-04-19 13:13 wenzhao 閱讀(223) | 評(píng)論 (0)編輯 收藏

          一:說(shuō)明
          Digester是jakarta commons里面的一個(gè)包,最早運(yùn)用于Struts中xml文件的解析.后來(lái)獨(dú)立出來(lái)
          歸到commons下面.主要的開(kāi)發(fā)人員是:Craig McClanahan。Craig McClanahan是我比較崇拜的開(kāi)發(fā)
          人員之一。他開(kāi)發(fā)了無(wú)數(shù)的OpenSource項(xiàng)目。包括大家都知道的Tomcat、Struts同時(shí)還是jsp,servlet
          Spec制定成員之一,并是Java Server Face(jsf)的Team Leader.在此向Craig McClanahan致敬。
          Digester把xml文件解析為Java Object有點(diǎn)象Castor。在本文中我使用一個(gè)簡(jiǎn)單的例子來(lái)介紹
          Digester的使用,詳細(xì)的文檔看下面的連接:http://jakarta.apache.org/commons/digester.html
          我做一個(gè)最簡(jiǎn)單的例子,因?yàn)镈igester功能比較強(qiáng)大,需要更詳細(xì)的例子參閱下面的文章
          http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html?page=1
          http://www.javaworld.com/javaworld/jw-10-2002/jw-1025-opensourceprofile.html
          使用Digester,需要jakarta下的如下包: BeanUtils, Collections, Logging.
          Digester的下載地址:
          http://apache.linuxforum.net/dist/jakarta/commons/digester/binaries/
          目前版本為1.4

          二:開(kāi)始使用Digester.
          現(xiàn)在有一個(gè)如下的xml文件
          user.xml(e:/user.xml)
          -------
          <users>
          <name>BASIC</name>
          <pass>Example Basic Authentication Area</pass>
          </users>

          一個(gè)如下的java Object
          com.henry.test.digester.BaseObject
          -----------------------------------
          public class BaseObject {
          private String name = "";
          private String pass = "";
          /**
          * Returns the name.
          * @return String
          */
          public String getName() {
          return name;
          }

          /**
          * Returns the pass.
          * @return String
          */
          public String getPass() {
          return pass;
          }

          /**
          * Sets the name.
          * @param name The name to set
          */
          public void setName(String name) {
          this.name = name;
          }

          /**
          * Sets the pass.
          * @param pass The pass to set
          */
          public void setPass(String pass) {
          this.pass = pass;
          }

          public void setInfo(String name,String pass){
          this.name = name;
          this.pass = pass;

          }

          public void info() {
          log("name:" + name + "...pass :" + pass);
          }

          private void log(String str) {
          System.out.println(str);
          }
          }
          現(xiàn)在我們要把user.xml里面的內(nèi)容解析為一個(gè)BaseObject.
          在以前我使用JDOM做解析。代碼估計(jì)需要100行左右。
          現(xiàn)在我使用Digester完成此項(xiàng)工作,你會(huì)發(fā)現(xiàn)非常的容易,而且很簡(jiǎn)單。

          三:解析xml文件
          Test.java
          ---------------
          //import org.apache.commons.digester.Digester;
          ...............

          public void parse() {
          Digester digester = new Digester();
          //創(chuàng)建Digester對(duì)象
          BaseObject obj = new BaseObject();
          try {
          digester.addObjectCreate("users", "com.henry.test.digester.BaseObject");
          //創(chuàng)建一個(gè)對(duì)象com.henry.test.digester.BaseObject
          //對(duì)象對(duì)應(yīng)的xml中為容users下的配置
          digester.addCallMethod("users/name", "setName", 0);
          //調(diào)用對(duì)象的方法setName并把users/name節(jié)點(diǎn)的值作為對(duì)象方法的參數(shù)
          digester.addCallMethod("users/pass", "setPass", 0);
          /*下面是調(diào)用setInfo(String,String)設(shè)置信息的使用
          *digester.addObjectCreate("users", "com.henry.test.digester.BaseObject");
          *digester.addCallMethod("users","setInfo",2);
          *digester.addCallParam("users/name",0);
          *digester.addCallParam("users/pass",1);
          */
          //上面的兩段代碼功能一樣都是使用反射實(shí)現(xiàn)對(duì)象的創(chuàng)建和方法的調(diào)用
          //第二段是一個(gè)方法有多個(gè)參數(shù)的情況
          obj=(BaseObject)(digester.parse("e:/user.xml"));
          obj.info();
          } catch (Exception ex) {
          log(ex.getMessage());
          }
          }
          ............

          上面的如此簡(jiǎn)單的代碼就可以實(shí)現(xiàn)一個(gè)配置文件的解析。不錯(cuò)吧。

          四:結(jié)束語(yǔ)
          xml解析的方式有很多種,簡(jiǎn)單的運(yùn)用jdom就可以解決問(wèn)題.再不行使用Xerces等等。但對(duì)于一些
          配置文件的解析使用Digester不失為一個(gè)很好的選擇.簡(jiǎn)單,而且基本可以滿(mǎn)足需要。夠用為原則.
          我沒(méi)有去比較使用Digester,jdom的運(yùn)行效率,因?yàn)閷?shí)在是沒(méi)有必要。但我使用過(guò)jdom去解析,雖然
          很簡(jiǎn)單,但肯定比Digester復(fù)雜.
          如果你對(duì)Digester有更深的理解,記得聯(lián)系我:henry_ge@mail.com.如果上面的文章有什么錯(cuò)誤
          或者不足,也請(qǐng)給我指出,發(fā)送到上面的地址.

          ????
          ?

          posted @ 2006-04-10 09:19 wenzhao 閱讀(356) | 評(píng)論 (0)編輯 收藏

          SSH:就是Struts+Spring+Hibernate的組合
          (草稿:編輯中)      
          Spring
          首先,是關(guān)于Struts和Spring的整合:

                需要在Struts中加載
          posted @ 2006-02-27 14:04 wenzhao 閱讀(250) | 評(píng)論 (1)編輯 收藏

          主站蜘蛛池模板: 呼伦贝尔市| 夏津县| 客服| 铜梁县| 龙里县| 高要市| 舞阳县| 兴和县| 巩留县| 宝山区| 赤壁市| 长阳| 句容市| 平乐县| 宜良县| 榆林市| 南木林县| 运城市| 天台县| 临江市| 孙吴县| 彰武县| 界首市| 泰兴市| 英山县| 锡林郭勒盟| 来宾市| 邵东县| 通州市| 武乡县| 蓝田县| 龙门县| 梅河口市| 淳安县| 璧山县| 曲阳县| 吉安县| 报价| 朝阳县| 丘北县| 桦甸市|