監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

Web Service Case Study: 認(rèn)證考試申請(qǐng)服務(wù)

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

AMTeam.org

Web Service Case Study: 認(rèn)證考試申請(qǐng)服務(wù)  



柴曉路 (
fennivel@uddi-china.org)

Chief System Architect

2002年4月10日

本文是Web Service Case Study系列文章的第二篇。在這篇文章中,我將圍繞一個(gè)認(rèn)證考試申請(qǐng)系統(tǒng)展開設(shè)計(jì)和討論,這個(gè)應(yīng)用與本文的系統(tǒng)不同,主要是面向B2C模式的應(yīng)用,著眼點(diǎn)在于如何將這個(gè)系統(tǒng)的客戶端插入到盡可能多的公共平臺(tái)、桌面系統(tǒng)中去,同時(shí)借助這個(gè)Case Study,我將著重講解在Web服務(wù)設(shè)計(jì)的時(shí)候,如何有效地使用XML Schema設(shè)計(jì)系統(tǒng)中使用的XML數(shù)據(jù)模式。
本文中針對(duì)的應(yīng)用實(shí)例是一個(gè)認(rèn)證考試系統(tǒng),應(yīng)用背景如下:(以下陳述純屬虛構(gòu))

UDDI-China.org是中國(guó)的Web Services技術(shù)組織,提供Web服務(wù)系列技術(shù)的技術(shù)認(rèn)證服務(wù),具體負(fù)責(zé)這個(gè)技術(shù)認(rèn)證服務(wù)的是UDDI-China.org下的WSTA機(jī)構(gòu)。任何技術(shù)人員都可以向WSTA機(jī)構(gòu)提出申請(qǐng),要求進(jìn)行某一項(xiàng)Web服務(wù)技術(shù)(比如XML Schema、SOAP、WSDL、UDDI等)的技術(shù)認(rèn)證,一般流程是要經(jīng)過申請(qǐng)、修讀相應(yīng)課程、考試這三個(gè)主要步驟。WSTA認(rèn)證考試系統(tǒng)就是為了管理和加速這個(gè)流程而開發(fā)的一套系統(tǒng)。

在介紹具體的系統(tǒng)流程之前,我們先來(lái)看看這個(gè)系統(tǒng)的實(shí)體關(guān)系圖:

Figure 1.   認(rèn)證考試系統(tǒng)實(shí)體關(guān)系圖 


 

結(jié)合圖1中,我們的系統(tǒng)中,基本上可以有這樣三個(gè)主要的流程:

注冊(cè):申請(qǐng)人需要填寫申請(qǐng)表,經(jīng)過申請(qǐng)審核其資格,通過后準(zhǔn)許進(jìn)入課程修讀以及考試流程;

課程修讀:通過了申請(qǐng)之后,系統(tǒng)將為這個(gè)申請(qǐng)人自動(dòng)安排一個(gè)課程的修讀日程,并安排指定授課老師;

考試:當(dāng)申請(qǐng)人經(jīng)過課程的修讀(當(dāng)然也可以不讀書直接考試),可以申請(qǐng)參加考試,系統(tǒng)將自動(dòng)為其安排一個(gè)考試日程,當(dāng)申請(qǐng)人完成考試后,將得到相應(yīng)的成績(jī)單以及認(rèn)證證書(當(dāng)然要是通過的)。

設(shè)計(jì)人員希望這個(gè)系統(tǒng)的使用者不但能夠通過UDDI-China.org的Web Page來(lái)使用認(rèn)證考試系統(tǒng),同時(shí)設(shè)計(jì)人員還希望能讓各種桌面工具能夠直接與UDDI-China.org的認(rèn)證考試系統(tǒng)集成,比如用戶在使用個(gè)人事務(wù)計(jì)劃軟件時(shí),就能夠?qū)⑸暾?qǐng)、聽課和考試等事務(wù)納入系統(tǒng)的安排,涉及的事務(wù)安排可以通過個(gè)人事務(wù)計(jì)劃軟件與UDDI-China.org的認(rèn)證考試系統(tǒng)的交互來(lái)自動(dòng)完成。交互的界面被設(shè)計(jì)為使用Web服務(wù)調(diào)用接口,而Web服務(wù)接口中輸入/輸出的數(shù)據(jù)應(yīng)當(dāng)是XML格式的,拋開Web服務(wù)調(diào)用接口先不談,我們先來(lái)看看系統(tǒng)接口中需要使用的XML數(shù)據(jù)模型。

經(jīng)過系統(tǒng)分析,設(shè)計(jì)人員認(rèn)為以下實(shí)體是需要使用XML來(lái)描述的:

Application,在這個(gè)XML描述實(shí)體中,將涉及圖1中的Applicant和Application;

CourseSession,在這個(gè)XML描述實(shí)體中,將涉及圖1中的Applicant、Employee、CourseSession和Course;

ExamSession,在這個(gè)XML描述實(shí)體中,將涉及圖1中的Applicant、ExamSession、Exam和Test。

下面,我們分別給出這三個(gè)XML實(shí)例文檔的模式。

XML Schema建模

Application

首先,我們給出Application文檔的XML Schema定義及其模式圖示,隨后我們?cè)僖灰辉敿?xì)解釋模式的細(xì)節(jié)。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema"
       elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="Application" type="applicationType">
    <xs:annotation>
      <xs:documentation>Application的模式定義</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="applicationType">
    <xs:annotation>
      <xs:documentation>Application類型定義</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="person" type="personType"/>
      <xs:element name="company" type="xs:string"/>
      <xs:element name="experience" type="xs:string"/>
      <xs:element name="reference" type="xs:string" minOccurs="0" maxOccurs="3"/>
      <xs:element name="certificationID" type="xs:long"/>
      <xs:element name="applicationDate" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="personType">
    <xs:annotation>
      <xs:documentation>個(gè)人信息類型定義</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="personID" type="xs:long"/>
      <xs:element name="name">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="surname" type="xs:string"/>
            <xs:element name="givenName" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="contact" type="contactType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="contactType">
    <xs:annotation>
      <xs:documentation>聯(lián)系方法類型定義</xs:documentation>
    </xs:annotation>
    <xs:choice>
      <xs:element name="email"/>
      <xs:element name="phone"/>
      <xs:group ref="mailAddress"/>
    </xs:choice>
  </xs:complexType>
  <xs:group name="mailAddress">
    <xs:sequence>
      <xs:element name="streetAddress" type="xs:string"/>
      <xs:element name="postCode" type="xs:string"/>
    </xs:sequence>
  </xs:group>
</xs:schema>

上面的代碼給出了Application的XML Schema文檔,其中定義了一個(gè)Application元素,這個(gè)元素是Application數(shù)據(jù)文檔的根元素。Application元素使用了applicationType這個(gè)復(fù)合類型作為它的類型定義。而applicationType類型定義引用了personType這個(gè)類型定義作為個(gè)人信息的描述,personType類型定義中使用了contactType類型定義來(lái)描述個(gè)人的聯(lián)系方式,而contactType類型定義還使用了mailAddress這個(gè)組定義,以支持choice的定義方式。

在詳細(xì)介紹這個(gè)層次結(jié)構(gòu)之前,我們可以先來(lái)看一看圖2的模式圖示。

Figure 2.   Application模式圖示 


 

applicationType復(fù)合類型用于描述一個(gè)申請(qǐng)表,applicationType復(fù)合類型定義包含了6個(gè)子元素:person、company、experience、reference、certificationID、applicationDate,分別表示個(gè)人信息、所屬公司、工作經(jīng)驗(yàn)、參考技能認(rèn)證、認(rèn)證考試ID、申請(qǐng)日期。其中person的類型是復(fù)合類型personType,而其他5個(gè)元素都是簡(jiǎn)單類型。company、experience、reference的類型都是字符串xs:string,certificationID的類型是xs:long,而applicationDate的類型是xs:date。其中除reference的出現(xiàn)次數(shù)可以是0到3次以外,其他的元素都是出現(xiàn)且僅出現(xiàn)1次。

person子元素應(yīng)用了personType復(fù)合類型,personType復(fù)合類型定義包含了3個(gè)子元素:personID、name和contact,分別表示個(gè)人ID、姓名和聯(lián)系方法。personID是一個(gè)簡(jiǎn)單類型元素,類型為xs:long。name是一個(gè)復(fù)合結(jié)構(gòu),包含了兩個(gè)子元素surname和givenName,共同描述了人的姓名。

而contact子元素則是應(yīng)用了contactType復(fù)合類型定義,contactType是一個(gè)選擇類型,應(yīng)用contactType類型的元素可以選擇是包含一個(gè)email子元素、或是包含一個(gè)phone子元素,或是包含一個(gè)mailAddress子元素,mailAddress使用了在后面定義的元素組定義mailAddress。

為了使得對(duì)contact元素的定義理解地更為具體一些,我們下面給出一些contact元素的實(shí)例表示的例子,具體的,包含在person元素內(nèi)。

<person>
  <personID>20302290</personID>
  <name>
    <surname>Joe</surname>
    <givenName>Huang</givenName>
  </name>
  <contact><email>Joe.Huang@hotmail.com</email></contact>
  <contact><email>Joe.Huang@yahoo.com</email></contact>
  <contact>
    <mailAddress>
      <streetAddress>No.2000, Huangxing Road, Shanghai</streetAddress>
      <postCode>200433</postCode>
    </mailAddress>
  </contact>
</person>

上面的代碼給出了一個(gè)person的實(shí)例文檔,其中這個(gè)個(gè)人信息包含了三個(gè)聯(lián)絡(luò)方式,兩個(gè)是email地址,一個(gè)是寄信地址,此人沒有留下聯(lián)系電話。

最后,我們給出Application模式的一個(gè)完整的實(shí)例文檔。

<?xml version="1.0" encoding="UTF-8"?>
<Application>
  <person>
    <personID>20302290</personID>
    <name>
      <surname>Joe</surname>
      <givenName>Huang</givenName>
    </name>
    <contact><email>Joe.Huang@hotmail.com</email></contact>
    <contact><email>Joe.Huang@yahoo.com</email></contact>
    <contact>
      <mailAddress>
        <streetAddress>No.2000, Huangxing Road, Shanghai</streetAddress>
        <postCode>200433</postCode>
      </mailAddress>
    </contact>
  </person>
  <company>Innoteck Company</company>
  <experience>System Architect of Innoteck</experience>
  <certificationID>X00910</certificationID>
  <applicationDate>2002-2-18</applicationDate>
</Application>

CourseSession

同樣,我們先給出CourseSession的XML模式文檔,CourseSession用于描述一門課程的某一個(gè)學(xué)期的安排。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema"
       elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="CourseSession" type="CourseSessionType">
    <xs:annotation>
      <xs:documentation>CourseSession Schema Definition</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="CourseSessionType">
    <xs:sequence>
      <xs:element name="Course" type="CourseType"/>
      <xs:element name="Session" type="SessionType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="SessionType">
    <xs:sequence>
      <xs:element name="CourseSessionID" type="xs:long"/>
      <xs:element name="CourseLocation" type="xs:string"/>
      <xs:element name="CourseDate" type="CourseDateListType"/>
      <xs:element name="Teacher" type="EmployeeType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="CourseType">
    <xs:sequence>
      <xs:element name="courseID" type="xs:long"/>
      <xs:element name="certificationID" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="CourseDateListType">
    <xs:list itemType="xs:date"/>
  </xs:simpleType>
  <xs:complexType name="EmployeeType">
    <xs:complexContent>
      <xs:extension base="personType">
        <xs:sequence>
          <xs:element name="jobTitle"/>
          <xs:element name="department"/>
          <xs:element name="roomNumber"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="personType">
    <xs:sequence>
      <xs:element name="personID" type="xs:long"/>
      <xs:element name="name">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="surname" type="xs:string"/>
            <xs:element name="givenName" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="contact" type="contactType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="contactType">
    <xs:choice>
      <xs:element name="email"/>
      <xs:element name="phone"/>
      <xs:group ref="mailAddress"/>
    </xs:choice>
  </xs:complexType>
  <xs:group name="mailAddress">
    <xs:sequence>
      <xs:element name="streetAddress" type="xs:string"/>
      <xs:element name="postCode" type="xs:string"/>
    </xs:sequence>
  </xs:group>
</xs:schema>

其中復(fù)合類型personType、contactType以及元素組mailAddress的定義與前面代碼中的Application模式文檔中的定義是一樣的,在這個(gè)文檔中,我們給出這部分定義是為了EmployeeType的定義需要,在這里,EmployeeType類型定義擴(kuò)展繼承了personType的類型定義。

其次,CourseSession模式文檔的其他部分分別定義了CourseSessionType、CourseType和SessionType三個(gè)復(fù)合類型以及一個(gè)列表類型CourseDateListType。在詳細(xì)介紹這些類型定義之前,我們先給出CourseSession的模式圖示,以加深形象認(rèn)識(shí)。

Figure 3.   CourseSession模式圖示 


 

下面我們結(jié)合圖3的模式圖示來(lái)講解一下CourseSession模式定義。

課程學(xué)期安排描述CourseSession由兩部分組成(定義在CourseSessionType中):Course課程和Session學(xué)期安排。其中Course子元素應(yīng)用了CourseType復(fù)合類型,該復(fù)合類型包含了兩個(gè)子元素CourseID和certificationID,分別表示這個(gè)課程的ID標(biāo)識(shí)以及這個(gè)課程對(duì)應(yīng)的認(rèn)證考試ID標(biāo)識(shí)。而Session子元素則是應(yīng)用了SessionType復(fù)合類型,該復(fù)合類型包含四個(gè)子元素:CourseSessionID、CourseLocation、CourseDate和Teacher。CourseSessionID、CourseLocation是兩個(gè)簡(jiǎn)單類型的子元素,分別表示課程學(xué)期安排的標(biāo)識(shí)ID以及課程的授課地點(diǎn)。CourseDate是一個(gè)列表類型的元素,它的值是日期列表,表示課程的授課時(shí)間。而Teacher子元素應(yīng)用了EmployeeType復(fù)合類型,表示該課程這個(gè)學(xué)期的授課老師。

其中EmployeeType復(fù)合類型定義擴(kuò)展繼承了personType的類型定義。關(guān)于擴(kuò)展繼承的特性,在這里暫時(shí)先不詳細(xì)介紹,我將在后面的章節(jié)中給出描述的細(xì)節(jié)。

最后,按照前面的慣例,我們給出CourseSession模式的一個(gè)實(shí)例文檔作為本節(jié)的結(jié)尾。

<?xml version="1.0" encoding="UTF-8"?>
<CourseSession>
  <Course>
    <CourseID>X0091001</CourseID>
    <certificationID>X00910</certificationID>
  </Course>
  <Session>
    <CourseSessionID>X009100120020220</CourseSessionID>
    <CourseLocation>Shanghai Education Center</CourseLocation>
    <CourseDate>2002-2-20 2002-2-22 2002-2-26</CourseDate>
    <Teacher>
      <personID>10307827</personID>
      <name>
        <surname>Mike</surname>
        <givenName>Liu</givenName>
      </name>
      <contact><email>Mike.Liu@uddi-china.org</email></contact>
      <contact><phone>13717652090</phone></contact>
      <contact>
        <mailAddress>
          <streetAddress>No.1 UDDI-China Way, Shanghai</streetAddress>
          <postCode>200400</postCode>
        </mailAddress>
      </contact>
    </Teacher>
  </Session>
</CourseSession>

ExamSession

同樣,我們先給出ExamSession的XML模式文檔,ExamSession用于描述某一門認(rèn)證考試的某一場(chǎng)考試的安排。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema"
       elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="ExamSession" type="ExamSessionType">
    <xs:annotation>
      <xs:documentation>ExamSession Schema Definition</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="ExamSessionType">
    <xs:sequence>
      <xs:element name="Exam" type="ExamType"/>
      <xs:element name="Session" type="eSessionType"/>
      <xs:element name="finished" type="xs:boolean"/>
      <xs:element name="ScoreReport" type="ScoreReportType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ExamType">
    <xs:sequence>
      <xs:element name="examID" type="xs:long"/>
      <xs:element name="certificationID" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="eSessionType">
    <xs:sequence>
      <xs:element name="examSessionID" type="xs:long"/>
      <xs:element name="examLocation" type="xs:string"/>
      <xs:element name="examDate" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ScoreReportType">
    <xs:sequence>
      <xs:element name="personID" type="xs:long"/>
      <xs:element name="score" type="xs:integer"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

這個(gè)模式文檔相對(duì)于Application模式文檔和CourseSession模式文檔來(lái)說比較簡(jiǎn)單。在這個(gè)模式文檔中,主要為定義一個(gè)XML文檔元素ExamSession,ExamSession元素應(yīng)用了ExamSessionType復(fù)合類型。ExamSessionType復(fù)合類型定義包含了三個(gè)四元素Exam、Session、finished和ScoreReport,分別表示認(rèn)證考試、認(rèn)證考試的某一場(chǎng)考試的安排、考試是否完成以及成績(jī)單。這個(gè)XML文檔用于在客戶端和服務(wù)器端互相交換ExamSession,比如用戶期望申請(qǐng)某一項(xiàng)認(rèn)證考試,當(dāng)然會(huì)希望獲得所有的相關(guān)ExamSession信息。當(dāng)某一個(gè)ExamSession結(jié)束后,這個(gè)XML文檔也用于傳輸用戶的成績(jī)。

圖4給出了這個(gè)XML模式的模式圖示,通過這個(gè)模式圖示,大家應(yīng)該能夠更好地理解這個(gè)模式的結(jié)構(gòu)。

Figure 4.   ExamSession模式圖示 


 

最后我們按照這個(gè)模式文檔,給出它的一個(gè)實(shí)例文檔,作為本節(jié)的結(jié)束。

<?xml version="1.0" encoding="UTF-8"?>
<ExamSession>
  <Exam>
    <examID>EX00910</examID>
    <certificationID>X00910</certificationID>
  </Exam>
  <Session>
    <examSessionID>EX0091020020309</examSessionID>
    <examLocation>Shanghai Education Center</examLocation>
    <examDate>2002-3-9</examDate>
  </Session>
  <finished>true</finished>
  <ScoreReport>
    <personID>20302290</personID>
    <score>92</score>
  </ScoreReport>
</ExamSession>

應(yīng)用模式演示

在這里,我們將外部的應(yīng)用假設(shè)也加入到整個(gè)應(yīng)用模式中來(lái),參照下圖,其中National Education Information Portal是一個(gè)國(guó)家范圍的教育信息門戶網(wǎng)站,而Global IT Education Web Service則是一個(gè)全球IT教育機(jī)構(gòu)提供的一個(gè)在線Web服務(wù)。它們都以這個(gè)認(rèn)證考試申請(qǐng)系統(tǒng)的Web服務(wù)客戶端應(yīng)用的角色出現(xiàn)在應(yīng)用模式中。(以下的應(yīng)用模式發(fā)展流程完全屬于應(yīng)用假設(shè),其中的所有實(shí)體和細(xì)節(jié)純屬虛構(gòu))

Figure 5.   應(yīng)用模式演示 


 

如圖所示,Web服務(wù)認(rèn)證機(jī)構(gòu)WSTA開始向公眾提供Web服務(wù)技術(shù)認(rèn)證服務(wù),一開始這個(gè)服務(wù)僅在機(jī)構(gòu)內(nèi)部工作,工作人員通過手工或Email收取報(bào)名表格,然后在自己的桌面應(yīng)用中為客戶完成相關(guān)的注冊(cè),上課和考試等申請(qǐng)流程,按照這種方式,整個(gè)機(jī)構(gòu)的運(yùn)行效率不高,所有的流程瓶頸集中在機(jī)構(gòu)內(nèi)部的桌面應(yīng)用上。隨著申請(qǐng)認(rèn)證考試的學(xué)員不斷增多,WSTA不得不使用其提供認(rèn)證的技術(shù):Web服務(wù)技術(shù)來(lái)改造他的應(yīng)用。完成認(rèn)證考試各項(xiàng)申請(qǐng)的邏輯被包裝成EJB Web Service,并部署在機(jī)構(gòu)內(nèi)部的BEA Weblogic Application Server上,而桌面應(yīng)用也被升級(jí)以支持對(duì)Web服務(wù)調(diào)用(也就是成為了一個(gè)Web Service Client),為了使得這個(gè)認(rèn)證申請(qǐng)Web服務(wù)(WSTK Web Service)能夠被更多的人通過各種平臺(tái)進(jìn)入并使用,這個(gè)Web服務(wù)被注冊(cè)進(jìn)了Public UDDI Registry,并發(fā)布了它的WSDL描述文檔。同時(shí),WSTA也積極與公共教育平臺(tái)進(jìn)行接觸并嘗試合作可能。經(jīng)過一番接觸,國(guó)家教育信息門戶(National Educastion Information Portal, NEIP)同意與WSTA進(jìn)行系統(tǒng)對(duì)接,以實(shí)現(xiàn)在NEIP平臺(tái)上直接對(duì)WSTA提供的Web服務(wù)技術(shù)認(rèn)證考試處理申請(qǐng)流程。NEIP采用的是Microsoft .NET的平臺(tái),因此在這里實(shí)施了J2EE和.NET平臺(tái)的連接集成。同時(shí)由于將自身注冊(cè)入了Public UDDI Registry,WSTA的認(rèn)證考試申請(qǐng)服務(wù)有機(jī)會(huì)被更多的外部平臺(tái)集成使用。如圖中的Global IT Education Web Service就是一例,Global IT Education通過對(duì)Public UDDI Registry的搜索,搜索全球提供IT認(rèn)證的機(jī)構(gòu),WSTK的Web服務(wù)是處于搜索結(jié)果集中的,Global IT Education通過處理搜索到的WSDL文檔,完成了對(duì)WSTK的Web服務(wù)的綁定,實(shí)現(xiàn)了Global IT Education Web Service與WSTK Web Service的連接。

下面,我們按照?qǐng)D中的序號(hào)標(biāo)明的順序,逐一講解在這個(gè)Web服務(wù)的應(yīng)用場(chǎng)景下,各個(gè)組件是如何協(xié)同實(shí)施和運(yùn)作的:

用戶可以通過NEIP的Web界面申請(qǐng)Web服務(wù)技術(shù)認(rèn)證的注冊(cè)、課程和考試;

NEIP的Web站點(diǎn)把請(qǐng)求通過Internet發(fā)送給WSTK的認(rèn)證管理Web服務(wù);

WSTK的認(rèn)證申請(qǐng)管理Web服務(wù)通過與機(jī)構(gòu)數(shù)據(jù)庫(kù)的交互,完成申請(qǐng)事務(wù),并響應(yīng)NEIP的Web站點(diǎn),并最終將響應(yīng)返回終端用戶;

WSTK認(rèn)證服務(wù)的技術(shù)信息(比如WSDL文檔)被注冊(cè)入了Public UDDI Registry供公共查詢;

Global IT Education的在線服務(wù)通過搜索Public UDDI Registry,尋找到了WSTK認(rèn)證申請(qǐng)服務(wù);

Global IT Education獲得WSTK認(rèn)證申請(qǐng)服務(wù)的技術(shù)信息,實(shí)現(xiàn)動(dòng)態(tài)綁定;

Global IT Education建立與WSTK認(rèn)證申請(qǐng)服務(wù)的應(yīng)用集成;

任何使用Global IT Education的應(yīng)用(包括各種應(yīng)用、Web站點(diǎn)、Web服務(wù))都可以通過Global IT Education的Web服務(wù)來(lái)使用WSTK認(rèn)證申請(qǐng)服務(wù);
WSTK內(nèi)部的桌面應(yīng)用同樣是使用Web服務(wù)界面綁定的技術(shù)來(lái)調(diào)用WSTK認(rèn)證申請(qǐng)服務(wù)的。

服務(wù)的可用性和連接的持久性

既然這個(gè)認(rèn)證考試申請(qǐng)服務(wù)是面向廣大的個(gè)人用戶的,用戶不但可以通過WSTK機(jī)構(gòu)進(jìn)行申請(qǐng),同時(shí)也可以通過任何的集成了WSTK認(rèn)證考試申請(qǐng)服務(wù)的應(yīng)用、平臺(tái)、網(wǎng)站等使用這個(gè)認(rèn)證考試申請(qǐng)服務(wù)。對(duì)于WSTK而言,使用的用戶越多,就越證明WSTK認(rèn)證考試申請(qǐng)服務(wù)的成功,而使用的用戶越多,一般而言,也意味著與WSTK認(rèn)證考試申請(qǐng)服務(wù)建立Web服務(wù)連接的應(yīng)用程序、平臺(tái)或網(wǎng)站也越多。然后,任何事情都有其正反兩方面的影響,如果使用的用戶非常多,接入的平臺(tái)、應(yīng)用的數(shù)量也非常多的話,WSTK認(rèn)證考試申請(qǐng)服務(wù)的可用性,以及連接的持久性就成為了一個(gè)非常非常關(guān)鍵的問題。

關(guān)于傳統(tǒng)軟件領(lǐng)域,甚至是硬件領(lǐng)域中涉及的穩(wěn)定性、可用性和持久性方面,我就不再在這里探討了,這不屬于我們正面對(duì)的基于Internet的分布式應(yīng)用環(huán)境的這個(gè)分布式應(yīng)用集成。那么我們需要面對(duì)的是什么呢?

如果WSTK認(rèn)證考試申請(qǐng)服務(wù)這個(gè)Web Service所在的系統(tǒng)發(fā)生崩潰或者因?yàn)橄到y(tǒng)維護(hù)的原因,WSTK不得不把這個(gè)服務(wù)臨時(shí)遷移到備份服務(wù)器上,服務(wù)所在服務(wù)器的IP地址發(fā)生了變化,甚至,服務(wù)入口的URL也可能發(fā)生了變化。此時(shí),現(xiàn)存的所有連接將不再有效(地址和入口都變了,自然不會(huì)持續(xù)有效),那么快速地恢復(fù)連接是我們需要處理的問題。

回顧一下,以前我們?cè)谧鯡AI時(shí)候的方法,對(duì)每個(gè)相關(guān)模塊/系統(tǒng)的開發(fā)人員、維護(hù)人員發(fā)出通知,要求他們更改相應(yīng)的代碼,這在企業(yè)內(nèi)部情況尚好,我們還是能夠在一定時(shí)間內(nèi)通知到每個(gè)人,然后各個(gè)模塊依照人員的技術(shù)能力和工作時(shí)間的多少,一一完成了連接的恢復(fù),不過萬(wàn)一負(fù)責(zé)某個(gè)模塊的技術(shù)人員出差或其他一些原因無(wú)法更新相應(yīng)的代碼,那么這個(gè)模塊將有一段時(shí)間無(wú)法使用。現(xiàn)在將這一情況從企業(yè)內(nèi)拓展到了企業(yè)間、機(jī)構(gòu)與個(gè)人之間后,情況似乎變得更為復(fù)雜,相同的意外情況往往導(dǎo)致非常惡劣的后果。

首先,我們是否還能通知到每個(gè)與WSTK服務(wù)相連接的企業(yè)或機(jī)構(gòu),其中部分按照合約方式建立連接的也許可以,然而由于是位于不同企業(yè),之間的協(xié)同存在問題。同時(shí)還有一大部分是通過查詢Public UDDI Registry找到WSTK的服務(wù)從而和WSTK服務(wù)建立連接的應(yīng)用,這些應(yīng)用的維護(hù)者,我們根本無(wú)法通過一般的途徑找到他們,如果仍然只能使用人與人的交流方式,那么這些連接將在一段時(shí)間內(nèi)中斷,如果服務(wù)被永久性地遷移了,那么這些好不容易發(fā)展起來(lái)的連接將從此中止。

其次,WSTK服務(wù)是一個(gè)最終服務(wù),中間會(huì)有很多門戶網(wǎng)站、機(jī)構(gòu)網(wǎng)站以WSTK服務(wù)的代理的形式直接向最終用戶提供服務(wù)。如果WSTK服務(wù)的質(zhì)量出現(xiàn)問題,這些門戶網(wǎng)站、機(jī)構(gòu)網(wǎng)站可能因他們自身網(wǎng)站、服務(wù)的聲譽(yù)問題,而考慮是否以后還要在他們的網(wǎng)站、服務(wù)中提供對(duì)WSTK認(rèn)證考試申請(qǐng)的服務(wù)。因?yàn)閷?duì)于最終用戶而言,他們使用的就是這些網(wǎng)站、機(jī)構(gòu)所提供的服務(wù),他們并不知道最終WSTK認(rèn)證考試申請(qǐng)服務(wù)才是最終的服務(wù)提供者,因此如果WSTK認(rèn)證考試申請(qǐng)服務(wù)不工作,他們就是認(rèn)為是這些網(wǎng)站、機(jī)構(gòu)的服務(wù)不工作了。

再次,還有相當(dāng)一部分是直接被集成到終端用戶的桌面應(yīng)用的,對(duì)于這種情況,WSTK更是沒有辦法通過傳統(tǒng)的方式重建連接了……

我們面臨的問題是很嚴(yán)峻,不過由于我們采用的是Web服務(wù)架構(gòu),利用的是UDDI作為我們的服務(wù)發(fā)現(xiàn)機(jī)制,因此這種服務(wù)連接恢復(fù)的問題,我們可以通過UDDI所提供的機(jī)制來(lái)嘗試解決。

我們知道,WSTK一開始就把WSTK認(rèn)證申請(qǐng)服務(wù)注冊(cè)到了UDDI注冊(cè)中心,具體的說,是在UDDI注冊(cè)中心中注冊(cè)了一個(gè)businessService(對(duì)應(yīng)于這個(gè)服務(wù)),這個(gè)businessService中包含了一個(gè)bindingTemplate用于描述這個(gè)服務(wù)的技術(shù)調(diào)用規(guī)范,其中包含了這個(gè)Web服務(wù)的訪問入口以及如何訪問這個(gè)Web服務(wù)的WSDL文檔等等。對(duì)于搜索UDDI Registry的企業(yè)/機(jī)構(gòu)而言,他們需要得到的就是bindingTemplate信息,從UDDI注冊(cè)中心中獲得的bindingTemplate信息集中的數(shù)據(jù)表示了一個(gè)指定的遠(yuǎn)端Web服務(wù)的調(diào)用規(guī)范實(shí)例。這些企業(yè)/機(jī)構(gòu)的應(yīng)用程序應(yīng)當(dāng)緩存該信息并且使用這個(gè)調(diào)用規(guī)范通過該WSTK服務(wù)注冊(cè)的地址來(lái)訪問這個(gè)WSTK Web Service。

當(dāng)使用從UDDI注冊(cè)中心中獲得并緩存下來(lái)的信息(調(diào)用入口等)進(jìn)行調(diào)用發(fā)生失敗時(shí),正確的做法是去查詢當(dāng)初獲得該數(shù)據(jù)的UDDI注冊(cè)中心并獲取與其對(duì)應(yīng)的更新了的bindingTemplate信息。也就是說,當(dāng)一個(gè)服務(wù)因?yàn)榫S護(hù)或?yàn)?zāi)難恢復(fù)發(fā)生遷移時(shí),一旦遷移完成這個(gè)服務(wù)應(yīng)當(dāng)主動(dòng)去更新在UDDI Registry中相應(yīng)的bindingTemplate記錄。對(duì)應(yīng)于前面的WSTK服務(wù)的情形,WSTK服務(wù)應(yīng)當(dāng)去更新其對(duì)應(yīng)的bindingTemplate中的訪問入口地址URL等。

在使用Web服務(wù)中,使用這樣的調(diào)用模式,那么使用UDDI操作入口站點(diǎn)(Operator Site)的商業(yè)實(shí)體就得以在不加重通信與協(xié)調(diào)開銷的情況下自動(dòng)完成與大量合作伙伴的服務(wù)恢復(fù)。這一過程的詳細(xì)程序式描述如下:

服務(wù)提供者使用save_xx在UDDI注冊(cè)中心中注冊(cè)了Web服務(wù)S;

調(diào)用者使用find_xx查詢UDDI注冊(cè)中心,獲得所需的服務(wù)S的概要信息;

調(diào)用者使用get_xx再一次查詢UDDI注冊(cè)中心,獲得所需服務(wù)S的詳細(xì)信息;

調(diào)用者緩存服務(wù)S的bindingTemplate信息,通過服務(wù)綁定,實(shí)施對(duì)服務(wù)S的調(diào)用;

服務(wù)S由于某種原因出現(xiàn)問題,無(wú)法繼續(xù)提供服務(wù);

服務(wù)提供者在新的位置重新部署了服務(wù)S,同時(shí)更新了UDDI注冊(cè)中心的關(guān)于Web服務(wù)S的技術(shù)描述;

調(diào)用者使用緩存的服務(wù)S的bindingTemplate信息再一次進(jìn)行調(diào)用,調(diào)用失??;(服務(wù)S的部署位置已經(jīng)更改)

調(diào)用者使用緩存的bindingTemplate的bindingKey鍵值查詢UDDI注冊(cè)中心,獲得服務(wù)S的更新后的bindingTemplate信息。

調(diào)用者緩存服務(wù)S的新的bindingTemplate信息,通過服務(wù)綁定,重新實(shí)施對(duì)服務(wù)S的調(diào)用。

服務(wù)的延伸

由于WSTK認(rèn)證考試申請(qǐng)服務(wù)已經(jīng)以Web服務(wù)的方式架構(gòu)起來(lái)了,在成功應(yīng)用一定時(shí)間之后,這個(gè)服務(wù)架構(gòu)將成為一個(gè)解決方案在一定范圍內(nèi)實(shí)施推廣,一個(gè)快速有效的辦法是將這個(gè)認(rèn)證考試申請(qǐng)服務(wù)升級(jí)為一個(gè)ASP服務(wù),供各種提供認(rèn)證考試的機(jī)構(gòu)通過Internet租用。這是一個(gè)有效利用資源和盈利的渠道。不過此時(shí)我們面臨的情況將更加復(fù)雜。由于是ASP服務(wù),一般來(lái)說,在ASP服務(wù)中,租用者并不是ASP服務(wù)的所有者,他們各自的服務(wù)入口可能是彼此不同的,但不排除彼此相同的實(shí)現(xiàn)可能(比如通過提供不同的用戶名/密碼,但入口是一個(gè)),同時(shí)這些入口調(diào)用信息并不是由租用者來(lái)管理的,事實(shí)上,當(dāng)ASP服務(wù)的提供者更改入口地址也是可能發(fā)生的異常情況。此時(shí)仍然要求由服務(wù)提供者去更新bindingTemplate信息以滿足服務(wù)遷移的平滑性變得不再實(shí)際了。

那么,馬上可以想到的,就是所有與這個(gè)ASP服務(wù)相關(guān)的bindingTemplate都由ASP服務(wù)的提供者來(lái)管理。不過,這仍然不切實(shí)際,因?yàn)槿绱艘粊?lái),就違背UDDI Registry搜索的初衷了,首先搜索者是要搜索商業(yè)實(shí)體businessEntity,如果不同的機(jī)構(gòu)的businessService都被保存在ASP服務(wù)提供者的businessEntity下,顯然與用戶的搜索方式相悖,同時(shí)對(duì)于businessService的描述信息,那些提供認(rèn)證考試的機(jī)構(gòu)都期望自己來(lái)維護(hù),顯然這不是一個(gè)正確的合適的解決方案。UDDI在bindingTemplate機(jī)制里面提供了一個(gè)重定向的方法來(lái)試圖解決這個(gè)問題,關(guān)于這個(gè)方法我將在本系列的下一篇文章中結(jié)合下一個(gè)實(shí)例給出。

大家對(duì)于這兩個(gè)問題的任何建議以及大家想到的其他可能的問題,都?xì)g迎到論壇來(lái)提出意見或給出評(píng)論。

參考資料

  • Web Service 技術(shù)/評(píng)論網(wǎng)站

    • UDDI-China.ORG, 以UDDI為主的Web服務(wù)技術(shù)網(wǎng)站。
    • WebServices.ORG, Web服務(wù)的綜合類技術(shù)網(wǎng)站。
    • IBM developerWorks/Web Service Zone, IBM的Web服務(wù)技術(shù)資源中心
    • MSDN Online Web Services Developer Resources, Microsoft的Web服務(wù)的開發(fā)者資源網(wǎng)站
    • ITPapers/Web Service, ITPapers的Web服務(wù)評(píng)論文章
  • 解決B2B電子商務(wù)應(yīng)用交互和集成的InterOP Stack系列技術(shù)標(biāo)準(zhǔn)規(guī)范

    • UDDI執(zhí)行白皮書, UDDI-China.org, UDDI.org
    • UDDI技術(shù)白皮書, UDDI-China.org, UDDI.org
    • UDDI程序員API規(guī)范, UDDI-China.org, UDDI.org
    • UDDI數(shù)據(jù)結(jié)構(gòu)參考, UDDI-China.org, UDDI.org
    • Web Service Description Language (WSDL) 1.0, IBM, 25 Sep 2000
    • SOAP: Simple Object Access Protocol Specification 1.1, IBM, Microsoft, DevelopMentor, 2000
    • XML Schema Part 0: Primer , W3C, 2 May 2001
    • Extensible Markup Language (XML) 1.0 (Second Edition), W3C, 6 Oct 2000
  • Web Service Case Study 系列

    • 軟件反饋跟蹤平臺(tái)

作者簡(jiǎn)介

 柴曉路: 上海得易電子商務(wù)技術(shù)有限公司(DealEasy)首席系統(tǒng)架構(gòu)師、XML Web Sevices技術(shù)顧問,UDDI-China.org創(chuàng)始人,UDDI Advisory Group成員,現(xiàn)在是WS-I.org 的 Working Group 的成員,參與 Profile 和 Usage Scenario的工作。 IBM developerWorks專欄作家。2000年獲復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)碩士學(xué)位,曾在國(guó)際計(jì)算機(jī)科學(xué)學(xué)術(shù)會(huì)議(ICSC)、亞太區(qū)XML技術(shù)研討會(huì)(XML Asia/Pacific'99)、中國(guó)XML技術(shù)研討會(huì)(北京)、計(jì)算機(jī)科學(xué)期刊等各類國(guó)際、國(guó)內(nèi)重要會(huì)議與期刊上發(fā)表論文多篇。專長(zhǎng)于Web Services技術(shù)架構(gòu)、基于XML的系統(tǒng)集成和數(shù)據(jù)交換應(yīng)用及方法,同時(shí)對(duì)數(shù)據(jù)庫(kù)、面向?qū)ο蠹夹g(shù)及CSCW等技術(shù)比較擅長(zhǎng)。

 

發(fā)布:2007-03-25 13:24    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
石家莊OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢