程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在IBM Lotus Expeditor中構建並部署簡單的Web服務資源

在IBM Lotus Expeditor中構建並部署簡單的Web服務資源

編輯:關於JAVA

Web 服務資源框架(Web Services Resource Framework,WSRF)規范為使用 Web 服務有狀態地訪問資源的機制制定了標准。IBM Lotus Expeditor 將 WSRF 作為一項特性整合進來,使您可以將 Open Service Gateway initiative(OSGi )服務作為資源公開。本文介紹了 WSRF 所涉及的概念,並闡明了與建模和公開 簡單的有狀態資源(使用 Web 服務作為 OSGi 包實現)相關的步驟。然後進一步 說明了如何使用 WSRF 規范中所定義的消息交換模式標准集,訪問這種有狀態資 源。本文使用的示例代碼是為 IBM Lotus Expeditor Client for Desktop V6.1.0 所提供的 OSGi 運行時開發的。

在本文中,您將學習以下內容:

如何建模簡單的有狀態資源。

如何使用 Lotus Expeditor Toolkit 來實現 WS-Resource 提供程序端組件。

如何使用 Lotus Expeditor Toolkit 來創建 WS-Resource 客戶端組件。

如何在 Lotus Expeditor Client 中部署 WS-Resource。

如何開發與 WS-Resource 一起工作的應用程序。

本文假定您已具備核心 Java 開發技能,以及 Web 服務、XML 和 OSGi 的基 礎知識。同時,為了運行示例應用程序,您必須在 Windows/Linux 系統上安裝以 下軟件:

Java 1.4.2

Lotus Expeditor Client V6.1.0(帶有 Web Services Resource Framework 6.1.0.0)

Eclipse 3.2.0 和 Web Tools Project (WTP) 1.5.1

Lotus Expeditor Toolkit(帶有 Mobile Web Services 6.1.0)

Lotus Expeditor 中的 WS-Resource

WS-Resource 是資源和 Web 服務的組合,通過此 Web 服務可以訪問資源。 Lotus Expeditor Client for Desktop 使用以下組件原型來實現 WS-Resource:

資源

資源是封裝了一個或多個必須公開為 WS-Resource 的有狀態 OSGi 服務對象 的 OSGi bundle。這些服務對象可以是業務實體視圖(如 ShoppingCart 或 PrintJob),或是物理資源的軟件 facade(如 Printer)。您需要提供服務對象 的實現作為 OSGi bundle。

Web 服務

Web 服務是充當 WS-Resource 的 Web 服務 facade 的 OSGi bundle。此組件 公開了 WSRF 標准端口類型和定制端口類型,如 WS-Resource 的 Web 服務描述 語言(Web Services Description Language,WSDL)中所述。您可以使用 Mobile Web Services 生成器向導為給定的資源描述生成完整的 Web 服務 bundle。

適配器

適配器是充當 Web 服務 bundle 和資源 bundle 之間橋梁的 OSGi bundle。 它將傳入的 Web 服務消息(包括 WSRF 標准端口類型和定制端口類型)發送到請 求方選定的資源實例。資源的任何響應(包括異常)將通過適配器和 Web 服務 bundle 作為正常響應或錯誤返回給請求方。生成 Web 服務 bundle 時,Mobile Web Services 生成器向導也生成了帶有占位符的適配器 bundle。您需要提供將 適配器綁定到資源實例的實現。

客戶機存根(client stub)

客戶機存根是通過應用程序可用於訪問 WS-Resource 並與 WS-Resource 一起 工作的 Java 歸檔。這種客戶端組件(也稱為 Web 服務客戶機存根)將 Java API 調用轉換為訂閱由 WS-Resource 發布的 WSDL 文件的 SOAP 消息。您完全可 以使用生成器向導來生成這些客戶機存根。

更多信息請參考 Lotus Expeditor Help 部分的 “Developing Applications for Lotus Expeditor”。

設置並驗證開發環境(Lotus Expeditor Toolkit)

使用帶有 Mobile Web Services 的 Lotus Expeditor Toolkit 作為 WS- Resource 提供程序組件和 WS-Resource 客戶機組件的開發平台,並在此平台上 測試組件。

請按照下面的步驟來設置開發環境:

安裝帶有 Web Tools Project(WTP)1.5.1 的 Eclipse 3.2.0。

安裝 Lotus Expeditor Toolkit。

重新啟動 Eclipse。

注意;Mobile Web Services 6.1.0 是作為 Lotus Expeditor Toolkit 的一 部分安裝的。更多信息請參考 Lotus Expeditor Toolkit Help。

請按照這些步驟來驗證開發環境的設置:

運行 Eclipse。

選擇 File - New - Other。

在 Select a wizard 窗口中,展開 Mobile Web Services。

驗證 WS-Resource Client 和 WS-Resource Provider 是否顯示為 Mobile Web Services 的子節點。

構建樣本 WS-Resource

在本部分中,將介紹用來開發簡單 WS-Resource 的方法和工具,並使用 Lotus Expeditor Toolkit 進行測試。您可以在本文的 下載部分 找到完整的 WS-Resource 源代碼。在本部分,您將按照以下步驟從頭開發 WS-Resource 的所 有組件:

構造樣本 WS-Resource 的設計模型。

實現 WS-Resource 的資源 bundle。

使用生成器工具來生成提供程序端組件。

實現將適配器組件綁定到資源組件的邏輯。

使用適配器工具來生成客戶端組件。

開發並執行測試應用程序。

在後面的部分中,我們將介紹打包並部署 Lotus Expeditor Client for Desktop 中的 WS-Resource 以及 WS-Resource 的客戶機應用程序組件的步驟。 開發並訪問安全的 WS-Resource 不在本文討論的范圍內。

建模樣本 WS-Resource

為了將精力集中在用來開發 WS-Resource 的方法和工具上,我們將使用一個 非常簡單的數據對象(例如 Address)作為 WS-Resource 進行建模。資源的屬性 包括 eMailID、preference 和 personDetails(參見圖 1)。請注意其中將 PersonDetails 和 ContactInfo 看作是 Address 資源的資源屬性。同時,為了 創建多個 Address WS-Resource 實例(並與其一起工作),我們在設計模型中包 含了 AddressFactory 類。

圖 1. Address 資源 —— 設計模型

注意:對自己的 WS-Resource 的進行建模時,請參考 Lotus Expeditor Help 部分的 “Developing Applications for Lotus Expeditor”,了解受支持的數 據類型。

開發資源 bundle

現在必須使用 Lotus Expeditor Toolkit 來將上述設計模型作為 OSGi bundle 實現。使用 Eclipse SDK 3.2.0(或更新版本)的插件開發向導將資源 bundle 作為 Eclipse 插件開發。為此,在插件開發向導中創建新的插件項目時 ,請選擇 OSGi Framework 作為標准。

下載部分 給出了資源 bundle 的完整源代碼。請注意,在 AddressInterface 中將 Address 資源的資源屬性編碼為 get/set 方法:

清單 1. com.ibm.wsrf.sampleapp.address.service.AddressInterface

public interface AddressInterface {
public void setEmailId(String emailId);
public String getEmailId();
public boolean getStatus();
public void setStatus(boolean status);
public String getPreference();
public void setPreference(String pref) throws Exception;
public float getVersionNumber();
public void setVersionNumber(float VersionNumber);
public Date getValidUntil();
public void setValidUntil(Date ValidUntil);
public PersonDetails getPersonDetails();
public void setPersonDetails(PersonDetails pDetails);
public ContactInfo getContactInfo();
/*****************************************************
* Service Methods          
*****************************************************/
public ContactDetails[] getContactDetails(int type)
throws ContactDetailsNotFoundException, InvalidAddressTypeException;
public void addContactDetails(ContactDetails contactObj);
public void addDependents(String[] names);
}

稍後使用 Mobile Web Services 生成器向導時,這個類似 bean 的接口將用 於描述 WS-Resource 的 Resource Property 文檔。

適配器組件將使用 AddressFactoryInterface 來創建新的 Address 資源實例 或定位 Address 實例:

清單 2. com.ibm.wsrf.sampleapp.address.service.AddressFactoryInterface

public interface AddressFactoryInterface {
   public String createAddress(String eMailId) throws Exception;
   public void deleteAddress(String eMailId) throws Exception;
   public AddressInterface getAddress(String eMailId) throws Exception;
}

您必須將生成的激活器修改為包含 start() 和 stop() 方法:

清單 3. com.ibm.wsrf.sampleapp.address.bundle.AddressActivator

public class AddressActivator implements BundleActivator {
   private ServiceRegistration serviceRegistration = null;
   public AddressActivator() {
   }
  public void start(BundleContext context) throws Exception {
    Hashtable properties = new Hashtable();
    serviceRegistration = context.registerService
     (AddressFactoryInterface.class.getName(), new  AddressFactoryImpl(), properties);
  }
  public void stop(BundleContext context) throws Exception {
     serviceRegistration.unregister();
  }
}

請注意,將 AddressFactoryImpl(而不是 AddressImpl)實例注冊為服務實 現。這樣做是為了簡化創建多個 Address 資源,以及定位相關的 Address 資源 實例並與其一起工作。

生成資源 bundle 的提供程序端組件

您可以使用 Lotus Expeditor Toolkit 的 Mobile Web Services 來生成資源 適配器和 WS-Resource 的 Web 服務 bundle。請參考 Lotus Expeditor Toolkit Help 部分的 “Developing Applications for Lotus Expeditor”,查看關於如 何使用生成器向導來生成提供方端組件的說明。

使用 WS-Resource Provider 向導時,請將 AddressFactoryInterface 指定 為資源類。向導將自查 Java 接口以獲得 bean 屬性,並給出提示,說明它們是 預期的資源屬性。您可以選擇這些資源屬性,或指定新的資源屬性名稱。這些屬 性將用於構造 Resource Property 文檔。

在 WS-Resource Provider 向導中,請確保完成以下操作:

選擇 WS-Resource Lifetime 和 Expose Service Methods 屬性。

未選擇 Enable Security 屬性。

選擇向導的 Resource Property 面板中所列示的所有資源屬性。

僅選擇向導的 Service Methods 面板中 Address 資源設計模型(圖 1)中被 標識為服務方法的那些方法。

根據需要,在向導中編輯插件屬性和項目屬性。

綁定生成的代碼和資源 bundle

WS-Resource Provider 向導將在 Eclipse 工作區中生成兩個項目,用於兩個 提供程序端 bundle,即適配器 bundle 和 Web 服務 bundle。Web 服務 bundle 不需要修改,可直接進行部署。但是,適配器 bundle 必須進行編輯並綁定到資 源 bundle。

如果浏覽所生成的適配器代碼,會注意到下面的 Java 類帶有 TODO 占位符:

<Address>LifeTimeManager.java

<Address>PropertyManager.java

在 AddressLifeTimeManager 類中,必須給出 createResource()、 destroyResource() 和 getResource() 操作的實現。這些操作將被綁定,以便使 用由 Address 資源 bundle 中的 AddressFactoryImpl 提供的相應服務。

綁定 createResource() 操作

當客戶機應用程序要創建新的 Address 資源時,它會發送 createResource() 消息到 WS-Resource 提供程序。WSRF 將該消息發送到適配器組件的 AddressLifeTimeManager 類。在 ConfigInfo 參數中,將 createResource() 的 初始化參數作為 XML 文檔進行發送。在作為 ResourceConfiguration 對象的 AddressLifeTimeManager 的 createResource() 操作中,可以得到該 XML 文檔 。

請注意,此初始化參數是從 ResourceConfiguration 中提取出來並隨 createAddress() 消息發送到 AddressFactoryImpl 的:

清單 4. createResource 代碼片段

public ResourceConfiguration createResource(Element configInfo)
         _throws ResourceUnavailableFault, ResourceUnknownFault, Exception {
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     Element ele = (Element)configInfo.getElementsByTagName ("eMailID").item(0);
     System.out.println(ele.getFirstChild().getNodeValue());
     String emailIdfromClient = ele.getFirstChild().getNodeValue ();
     String eMailIdValue = getAddressFactory().createAddress (emailIdfromClient);
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|

     ResourceConfiguration resourceConfiguration = new ResourceConfiguration();
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     DocumentBuilder db = dbf.newDocumentBuilder();
     Document document = db.newDocument();
     Text text = document.createTextNode(eMailIdValue);
     resourceConfiguration.addConfigurationInfo(emailIdQName, text);

     return resourceConfiguration;
   }

使用 AddressFactory 創建了資源後,LifeTimeManager 的 createResource 操作將以 ResourceConfiguration(用於以後識別 Address 實例)響應客戶機。 ResourceConfiguration 信息將封裝在返回到客戶機應用程序的 EndPointReference 的 ReferenceParameter 中。

綁定 getResource() 操作

同樣,當客戶機應用程序要訪問資源,以便使用其 Resource Property 文檔 、銷毀 WS-Resource、或是調用 WS-Resource 上的服務方法時,WSRF 首先將嘗 試使用 AddressLifeTimeManager 中的 getResource() 操作來獲取 Address 資 源實例。在 AddressFactoryImpl 的協助下,ResourceConfiguration 信息再次 用於惟一地識別 Address 資源實例。請注意 getResource() 操作調用了 AddressFactoryImpl 的 getAddress() 方法來定位 Address 對象:

清單 5. getResource 代碼片段

public Object getResource(ResourceConfiguration resourceConfiguration)

     throws ResourceUnavailableFault, Exception {
     Node emailIdValue = resourceConfiguration.getConfigurationInfo(emailIdQName);
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     System.out.println(emailIdValue);
     Text textInfo = (Text) emailIdValue;
     System.out.println(textInfo);
     String eid = textInfo.getNodeValue();
     System.out.println("ID from getResource::AddressLifeTimeManager :"+eid);
     Object addressObj = getAddressFactory().getAddress(eid);
     if(addressObj == null){
       throw new ResourceUnavailableFault("Resource Not Available !!", new Exception());
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     }else{
       return addressObj;
     }
   }

綁定 destroyResource() 操作

Address 資源可通過客戶機應用程序的 destroy() 方法銷毀,或者在達到 TerminationTime 後銷毀。銷毀資源時,資源框架將調用適配器組件的 AddressLifeTimeManager 類中的 destroyResource() 方法。 ResourceConfiguration 信息用於惟一地識別 Address 資源實例:

清單 6. destroyResource 代碼片段

public void destroyResource(ResourceConfiguration resourceConfiguration)

   throws ResourceUnavailableFault, ResourceNotDestroyedFault,Exception {
     Node emailIdValue = resourceConfiguration.getConfigurationInfo(emailIdQName);
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     Text textInfo = (Text) emailIdValue;
     String eid = textInfo.getNodeValue();
     System.out.println("ID from destroyResource::AddressLifeTimeManager :"+eid);
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     getAddressFactory().deleteAddress(eid);
   }

綁定 PropertyManager 操作

Resource Property 文檔的資源屬性值始終由資源實例保存。資源框架不會緩 存這些值;但是框架將為任何給定的 WS-Resource 實例維護 Resource Property 文檔中所有有效資源屬性名稱的列表。導致 WS-Resource 的 Resource Property 文檔發生變化的所有 WSRF 消息將由適配器的 PropertyManager 類進行處理。您 可以選擇使用消息,也可將這些消息轉發給資源 bundle。

在 AddressPropertyManager 類中,生成的代碼包含用於所有屬性的 get/update/delete/insert 操作的占位符。如前所述,您可以提供實現用來傳遞 get 或 update 消息到 Address 資源。同樣地,您可以選擇傳遞 delete 和 insert 消息到 Address 資源實例。

在本例中,請注意 (a) 將 preference 屬性的 update 操作作為 setPreference() 消息發送到 Address 資源實例,(b) 將 get 操作作為 getPreference 消息發送到 Address 資源,(c) 將 insert 操作作為 setPreference() 消息發送到 Address 資源實例,(d) delete 操作沒有任何附 加的實現:

清單 7. AddressPropertyManager 代碼片段

(a)  public void updatePreference(Object resource, Object value)
     throws ResourceUnavailableFault,
     UnableToModifyResourcePropertyFault,
     UpdateResourcePropertiesRequestFailedFault,
     InvalidModificationFault,
     BaseFault, Exception {
     com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
   (com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
     java.lang.String inValue = (java.lang.String)value;
     resourceRef.setPreference(inValue);
   }
(b)  public Object getPreference(Object resource)
     throws ResourceUnavailableFault, Exception {
     com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
   (com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
     java.lang.String retValue = resourceRef.getPreference();
     return retValue;
   }
(c)  public void insertPreference(Object resource, Object value)
     throws ResourceUnavailableFault,
     UnableToModifyResourcePropertyFault,
     InsertResourcePropertiesRequestFailedFault,
     InvalidModificationFault,
     BaseFault, Exception {
     com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
   (com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
     java.lang.String inValue = (java.lang.String)value;
     resourceRef.setPreference(inValue);
   }
(d)  public void deletePreference(Object resource)
     throws ResourceUnavailableFault,
     DeleteResourcePropertiesRequestFailedFault, Exception {
     com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef =
   (com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
   }

當客戶機應用程序要獲得 Address 通過 EndPointReference 指向的資源屬性 值時,會將帶有資源屬性的 QName 的 getResourceProperty 消息作為參數進行 傳遞。資源框架將該消息發送到適配器組件,以便首先獲得 Address 資源實例。 AddressLifeTimeManager 的 getResource() 操作獲得了 Address 資源實例。接 著,資源框架調用 AddressPropertyManager 中的 getPreference() 操作。然後 ,AddressPropertyManager 的 getPreference() 操作將該消息傳遞給 Address 資源中相應的操作。

您必須為其它資源屬性提供類似的實現。

提示:如果將資源屬性設置為只讀屬性,則不必為這些操作提供任何附加的實 現就可以使用 update 和 insert 消息,或者在 update 和 insert 操作的實現 中拋出異常(例如,InvalidModificationFault)。如果將資源屬性設置為強制 屬性,則可以在 delete 操作的實現中拋出 DeleteResourcePropertiesRequestFailedFault 異常。

綁定服務管理器操作

WS-Resource 的定制端口類型(也稱為服務方法)是適配器組件的 AddressServiceManager 的一部分。默認情況下,代碼生成器所生成的代碼將這 些操作分別綁定到 Address 資源的方法上。在這方面,您不必對所生成的代碼進 行任何更改。

生成樣本 WS-Resource 的客戶端組件

完成了所有提供程序端組件(資源 bundle、適配器 bundle 和 Web 服務 bundle)的開發後,在 Lotus Expeditor Toolkit 中將這些 WS-Resource 提供 程序組件部署為 WS-Resource。有關通過 WS-Resource 提供程序 bundle 啟動 Client Services Server 的更多信息,請參考 Lotus Expeditor Help 部分的 “Developing Applications for Lotus Expeditor”。

若要確定 WS-Resource 是否為使用做好准備,請在浏覽器中輸入該 URL http://localhost/ws/pid/Address?wsdl,其中 WS-Resource 的 pid 是 Address。浏覽器中應顯示描述 Address 資源的 WSDL 文件。

現在,您可以使用 Mobile Web Services 工具來生成客戶機組件。使用 (Mobile Web Services toolkit 的)WS-Resource Client 向導來生成 client stub 代碼。請參考 Lotus Expeditor Help 部分的 “Developing Applications for Lotus Expeditor”,獲取關於如何使用生成器向導來生成客戶端組件的說明 。

您不需要對所生成的代碼進行任何更改。

為 WS-Resource 開發簡單的測試客戶機應用程序

為了測試 WS-Resource,您必須開發測試應用程序。該測試應用程序使用客戶 端組件進行以下操作:

創建新的 WS-Resource(Address)實例。

發送標准的 WSRF 消息。

通過定制 portType 調用操作。

測試客戶機應用程序的 main() 方法如下所示:

清單 8. 測試客戶機代碼片段

public static void main(String[] args) {
     String resourceUniqueId = "[email protected]";
     TestClient tc = new TestClient();
     EndpointReference resEPR = null;
     /**
     * Creates the WS-Resource with the given resource configuration and
     * returns the EPR for further interaction with the WS- Resource.
     */
     try {
       resEPR = tc.createResource(resourceUniqueId);
       if (resEPR != null)System.out.println("Resource created !! \n");
     } catch (Exception e) {
       e.printStackTrace();
     }
     OperationContext opContextObj = new OperationContext();
     opContextObj.setToEPR(resEPR);
     AddressSoap_Stub stubObj = new AddressSoap_Stub();
     stubObj.setCurrentOperationContext(opContextObj);
     boolean updateResult = tc.testUpdateResourceProperty();
     if(updateResult == true)System.out.println("Update Resource Property :: SUCCESS");
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     else System.out.println("Update Resource Property :: FAILED");
     boolean addResult = tc.testAddDependants();
     if(addResult == true)System.out.println("Add Dependants :: SUCCESS");
     else System.out.println("Add Dependants :: FAILED");
   }
}

請注意,上述代碼包括以下步驟:

創建新的 Address 資源並獲得 EndPointReference(EPR)。

設置 OperationContext。

測試 WSRF 標准操作,即 preference 資源屬性的 updateResourceProperties。

測試服務方法,即 Address 資源的 addDependents 方法,該方法是添加一個 依賴項。

請參考 下載部分 以獲得完整代碼。

在前面的代碼片段中,OperationContext 用於建立客戶機和 WS-Resource 之 間的信道。OperationContext 容納消息源(在 fromEPR 中)和消息目標(在 fromEPR 中)。必須確保 OperationContext 包含有效的 toEPR。在調用 WS- Resource 上的任何操作前,先通過調用 stub 對象的 setCurrentOperationContext(opContextObj) 操作來設置當前的 OperationContext。

如前所述,若要創建新的 Address 資源,在 ConfigInfo 參數和 TerminationTime 屬性的初始值中必須將初始化參數作為 XML 文檔進行發送。因 為使用 AddressLifeTimeManager 來解析以下 ResourceConfiguration XML 文檔 ,所以 ConfigInfo XML 文檔具有相同的結構:

清單 9. ConfigInfo XML 文檔

<ConfigInfo>
      <AddressResource/>
      <eMailID>
[email protected]
      </eMailID>
</ConfigInfo>

用於創建 WS-Resource 的代碼如下所示:

清單 10. createResourcein 測試客戶機代碼片段

public EndpointReference createResource(String uniqueId)
       throws Exception {
     String hostName = "localhost"; // Hostname of the WebService
     String serviceName = "Address"; // Service Name of the Resource
     String uriString = "http://" + hostName + "/ws/pid/" + serviceName+ "?wsdl";
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     WSAddressingService addressingObj = new WSAddressingServiceImpl();
     // creating the EPR of resourceFactory
     EndpointReference resourceFactoryEPR = addressingObj.createEndpointReference(uriString);
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|

     // prepare configInfo parameter for createResource()
     Node[] configInfo = getConfigInfo(uniqueId);

     // prepare initTerminationTime parameter for createResource ()
     Calendar initTermTime = Calendar.getInstance();
     int curr = initTermTime.get(Calendar.HOUR);
     initTermTime.set(Calendar.HOUR, curr + 1);
     // Prepare the channel for communicating with Resource Factory
     OperationContext opContextObj = new OperationContext();
     opContextObj.setToEPR(resourceFactoryEPR); // Set the resourceFactoryEPR as toEPR
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     stubObj.setCurrentOperationContext(opContextObj);// Set the current OperationContext
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     // Send createResource() message to the resourceFactory
     EndpointReference resourceEPR = stubObj.createWSResource (configInfo, initTermTime);
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
     return resourceEPR;
   }

請注意清單 10 的以下內容:

為資源工廠構造了 EndpointPointReference 對象。在本例中, EndPointReference 的 URL 與 Address 資源本身的 URL 相同。

創建了從客戶機到資源工廠的信道。創建了 OperationContext 對象,並將資 源工廠的 EndPointReference 設置為 toEPR。

使用 Address 資源的 stub 對象將 createResource() 消息發送到資源工廠 。

資源工廠使用新構造的 Address 資源對象的 EndPointReference 進行響應。

最後,執行測試應用程序時,將看到以下結果:

清單 11. 測試客戶機的輸出

Start Of Program !!
   Resource created !!
   Update Resource Property :: SUCCESS
   Add Dependants :: SUCCESS
End Of Program !!

設置運行時環境 (Lotus Expeditor Client V6.1.0)

Lotus Expeditor Client for Desktop 是用於部署 Address 資源的運行時。 在本部分,我們將介紹運行示例 WS-Resource 的運行時環境的設置步驟。

若要設置運行時,請參考 Lotus Expeditor Help 中的安裝說明,以便在 Windows / Linux 上安裝 Lotus Expeditor Client V6.1.0,以及在 Lotus Expeditor Client 上安裝 WSRF V6.1.0.0。

若要驗證運行時設置,請執行以下步驟:

使用 -console 選項,啟動 Lotus Expeditor Client。

在 console 窗口中,鍵入 ss 來查看所有已安裝插件的狀態。

在插件列表中,檢查 com.ibm.pvcws.osgi_6.1.0 插件和所有 WSRF 插件是否 處於活動狀態。如果未處於活動狀態,則啟動這些插件。

在 Lotus Expeditor 中部署樣本 WS-Resource

啟動並運行 Lotus Expeditor Client for Desktop 後,請按照以下步驟來部 署 Address WS-Resource 提供程序組件。請參考 下載部分 的 README.txt 來部 署 AddressResource 的預構建功能。

為部署准備 Address WS-Resource 特性

若要在 Lotus Expeditor Client for Desktop 中安裝 Address WS-Resource ,則必須將 WS-Resource 打包成一項特性。請按照以下步驟來創建特性:

例如,選擇 File - New - AddressFeature,在 Lotus Expeditor Toolkit 中創建新特性項目。

在 Referenced Plug-ins and Fragments 窗口中,選擇 AddressResource、 AddressAdapter 和 AddressWebservice 插件。

單擊 Finish。

右鍵單擊新建的特性項目,然後選擇菜單中的 Export。

在 Export 窗口中,選擇 Deployable features 選項,然後單擊 Next。

輸入目錄並單擊 Finish。

將 WS-Resource 部署為特性

若要將 WS-Resource 部署為特性,請執行以下步驟:

在 Lotus Expeditor Client 中,選擇 File - Applications - Install。

選擇 “Search for new features to install”,然後單擊 Next。

單擊 Add Folder Location,選擇在上述步驟 5 中導出特性的位置,然後單 擊 Finish。

重新啟動 Lotus Expeditor Client 使部署生效。

驗證 WS-Resource 的部署

啟動 Lotus Expeditor Client (帶有 -console 選項)後,通過檢查 console 窗口來確保已啟動新安裝的插件。

在浏覽器中輸入 URL http://HostAddress:Port/ws/pid/ResourcePID?wsdl, 可以驗證是否正確發布了 Address 資源的 WSDL,其中 HostAddress 是承載 Lotus Expeditor Client 的節點的 IP 地址,Port 是運行 Web 服務的端口, ResourcePID 是資源的名稱。

例如,示例 URL 可能是 http://localhost/ws/pid/Address?wsdl,假定 Lotus Expeditor Client V6.1.0 Web 容器組件運行在端口 80 上並接受所有 IP 地址。

執行樣本客戶機應用程序

在 Lotus Expeditor Client for Desktop 中部署了 Address 資源後,您可 以執行本文所提供的樣本客戶機應用程序。該示例應用程序是基於 Standard Widget Toolkit(SWT)的 Java 程序,允許您發送各種 WSRF 標准消息以及由 Address 資源定義的定制消息。

該客戶機應用程序演示了 Lotus Expeditor Client 的 WSRF 的所有 API 特 性。可以使用菜單選項 WSRF Standard Operations 和 WSRF Custom Operations 來研究這些特性。在 WSRF Custom Operations 菜單中,您可以嘗試工廠和服務 方法(參見圖 2)。

圖 2. WSRF Custom Operations 菜單

在 WSRF Standard Operations 菜單中,您可以嘗試所有 WSRF 資源屬性操作 和 WSRF lifetime 操作(參見圖 3)。

圖 3. WSRF Standard Operations 菜單

結束語

您已經學習了如何構建簡單的 WS-Resource 以及如何將其部署到 Lotus Expeditor Client for Desktop。另外,還學習了用於生成提供程序端和客戶端 組件的工具,以及如何開發可用來測試本文中所開發的 WS-Resource 的測試客戶 機。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved