利用 Lotus Web Service Consumer 整合 WebSphere Process Server 業務流程

CloudSpace發表於2010-05-19

轉自 http://www.ibm.com/developerworks/cn/lotus/domino-wsc-wps/

背景知識介紹

Lotus Domino 介紹

IBM Lotus Domino 是 IBM Lotus Notes 系列企業級協作軟體的伺服器端產品。在 Lotus Domino 中,業務資料和業務流程儲存在 NSF 格式的資料庫檔案中。一個 NSF 資料庫檔案也稱為一個應用。在 Lotus Domino 中,所有的資料,例如電子郵件,討論文章或者是結構化的業務資料,都以文件的方式儲存,同一類文件都按同一個表單展現。通過 Lotus Domino Designer,可以設計 Lotus Domino 應用的業務資料格式,即設計表單 Form;也可以使用 Lotus Script. 或 Java 語言開發業務流程程式。結合表單和業務流程程式,就可以實現多種多樣複雜的應用。本文在後面的章節將結合 Web Service Consumer 的使用介紹如何利用 Lotus Script. 或 Java 語言開發業務流程程式,本文中使用的 Lotus Domino 示例應用包括 Lotus Script. 和 Java 程式碼在 TestWebS.nsf 中。

WebSphere Process Server 介紹

IBM WebSphere Process Server(WPS)是 IBM 的一款企業級業務流整合伺服器。WPS 是基於 WebSphere Application Server (WAS) 構建的面向服務架構 (SOA) 平臺。WPS 的開發工具是 WebSphere Integration Developer (WID),通過 WID,使用者可以很方便的將基於各種不同標準的服務部署到 WPS 上。WPS 上提供對 Business Process Execution Language (BPEL),狀態機和 Java 等多種業務流實現方式的支援。在本文中,將利用 WID 在 WPS 上部署一個示例 Web Service,以模擬在 WPS 上實現的某部分業務流,並通過示例介紹如何在 Lotus Domino 業務流中呼叫它,本文中使用的 WPS 示例應用在 MyWebServiceSample.zip 中。

Web Service 介紹

Web Service 是一種面向服務架構(Service Oriented Architecture)的實現技術,用以實現網路間不同應用服務之間的互操作。Web Service 系統是一個跨平臺,跨語言的軟體系統,通過 Web Service,系統間共享服務的資料格式和呼叫方式,而服務的具體實現隱藏在後端。這樣,一個執行在 Windows 上的軟體可以呼叫執行在另一臺 Unix 機器上的服務,一段 Java 程式可以呼叫另一個實際由 C++ 編寫的服務。

正因為 Web Service 的這種跨平臺,跨語言的特性,它經常被用來整合不同軟體系統。本文將通過程式碼示例介紹如何利用 Web Service 整合兩種業務流程伺服器 Lotus Domino Server 和 WebSphere Process Server。在進入本文的關鍵技術之前,將在本小節簡單介紹的關鍵技術,特別是 WSDL (Web Service Description Language).

XML

XML 是可擴充套件標記語言(Extensible Markup Language)的簡稱,因為其可擴充套件性,被廣泛使用作為各種結構化資料描述語言的基礎。WSDL 就是基於 XML 的。

WSDL

對於一個 Web Service 來說,服務的請求者並不關心服務的提供者如何實現該服務,但是服務的資料格式和呼叫方式必須是雙方共享的,只有這樣,服務的輸入資料和輸出資料才能被正確地傳遞和解析。Web Service 描述語言(WSDL)就是用 XML 來描述 Web Service 的資料格式和呼叫方式的語言。WSDL 定義了以下元素:

  • 資料型別 types:採用通用的 XML 資料模型定義了 Web Service 中需要用到的資料型別。
  • 訊息 message:定義一個用以傳遞服務資料一個單向訊息,可以是請求訊息,也可以是答覆訊息,可以是正常訊息,也可以是故障訊息。一個訊息可能包含多個資料元素。
  • 操作 operation:定義了一個單向或雙向的互動操作。一個操作可能包含輸入訊息,輸出訊息和故障訊息。
  • 埠型別 portType 或介面 interface:定義了一個服務介面,介面是一個服務呼叫方式的完整描述。一個介面中可能包含多個操作。
  • 繫結 binding:繫結定義了服務介面的傳輸方式。一個繫結中指定了所繫結的服務介面和對應的傳輸方式。目前最常用的繫結型別是 SOAP。
  • 埠 port 或 endpoint:埠指定了提供某個繫結的服務的計算機埠位置。對於繫結而言,就是提供的 HTTP 地址的 URL。
  • 服務 service:定義了一個 Web Service 服務,一個服務可能包含多個埠。

SOAP

簡單物件訪問協議 (Simple Object Access Protocol)是利用 HTTP 或 SMTP 傳輸 XML 資料的協議。由於 HTTP 的易用性,大多數 Web Service 採用作為資料傳輸協議。

Lotus Web Service Consumer 介紹

Web Service Consumer 是由 Lotus Domino 提供的在業務流中呼叫其他 Web Service 服務的機制。在 Lotus Domino 中,業務流是通過 Lotus Script. 或 Java 語言程式設計實現的。Web Service Consumer 的功能就是將一個描述 Web Service 服務的 WSDL 轉化成 Lotus Script. 或 Java 的庫函式,使它可以在 Lotus Script. 或 Java 程式中呼叫。後文將通過例子程式分別介紹如何建立和使用基於 Lotus Script. 或 Java 語言的 Web Service Consumer。


在 WPS 上建立並部署 Web Service

開發工具和平臺

本節將使用 WID (WebSphere Integration Developer) 作為開發 Web Service 的工具,WPS 作為部署平臺。利用 WID (WebSphere Integration Developer) 可以方便的建立 Web Service 並部署到 WPS 上。本節將用 WID 建立一個簡單的服務 changValue,將一個輸入物件 Value 屬性改變並返回結果物件。

建立業務模組

在 WID 的 Business Integration透視窗下,選擇 File – New Module,並填寫 MyWebServiceSample 作為模組名。

建立業務物件

右鍵選擇 MyWebServiceSample 的 Data Types目錄,選擇 New – Business Object,填寫 MyBO 作為業務物件名,新增兩個 string 型別的屬性 Name 和 Value 作為該業務物件的域。建立完成的業務物件如圖 1 所示。


圖 1. 業務物件 MyBO
圖 1. 業務物件 MyBO

建立業務介面

右鍵選擇 MyWebServiceSample 的 Interfaces目錄,選擇 New – Interface,填寫 MyInterface 作為介面名。開啟介面編輯器後,在右鍵選單中選擇 Add Request Response Operation新增一個操作 changeValue;操作的輸入和輸出型別都選擇 MyBO 為業務物件,如圖 2 所示。


圖 2. 業務介面 MyInterface
圖 2. 業務介面 MyInterface

建立 Export 並新增實現程式碼

雙擊 MyWebServiceSample 的 Assembly Diagram開啟編輯器,在編輯器中新增一個名為 MyExport 的 Export。選擇 MyExport,在右鍵選單中選擇 Add Interface將介面 MyInterface 新增到編輯器中。在編輯器中新增一個名為 MyJavaImpl 的 Java模組。將 MyExport 同 MyJavaImpl 相連線,WID 將提示新增該介面的實現程式碼。WID 將自動為類 MyJavaImpImpl 填寫一些空函式,我們只需要實現其中的 changeValue 方法。在 changeValue 方法中新增清單 1 中的程式碼。MyWebServiceSample 的如圖 3 所示。


圖 3. 業務應用 MyWebServiceSample 的組裝圖
圖 3. 業務應用 MyWebServiceSample 的組裝圖

清單 1. changeValue 方法程式碼

				 
public DataObject changeValue(DataObject input1) { 
    String name = input1.getString("Name"); 
    String value = input1.getString("Value"); 
    System.out.println("Request: Name=" + name + ", Value=" + value); 
    // Create output data object using BOFactory service 
    BOFactory boFactory = (BOFactory)ServiceManager.INSTANCE
        .locateService("com/ibm/websphere/bo/BOFactory"); 
    DataObject output1 = boFactory.create("http://MyWebServiceSample", "MyBO"); 
    output1.setString("Name", name); 
    if (null != value) { 
        output1.setString("Value", value.toUpperCase()); 
    } 
    System.out.println("Response: Name=" + output1.getString("Name") + 
        ", Value=" + output1.getString("Value")); 
    return output1; 
} 

將 Export 繫結到 Web Service 服務並部署到 WPS 上

選擇 MyExport,在右鍵選單中選擇 Generate Binding – Web Service Binding – SOAP1.1/HTTP繫結,WID 會在 Web Service Ports目錄中自動生成一個名為 MyExport_MyInterfaceHttpPort 的服務。這個自動生成的服務的埠預設為 9080,我們需要將其改成執行中 WPS 的 HTTP 服務埠,筆者的埠為 9086。在 WID 中檢查整個 MyExport 可以看到圖中的業務工件如圖 4 所示。在確認應用建立無錯誤後,便可將該業務整合應用部署到 WPS 上。


圖 4. 業務應用 MyWebServiceSample 的業務工件
圖 4. 業務應用 MyWebServiceSample 的業務工件

收集呼叫 Web Service 所需的 WSDL 和 XSD 檔案

部署成功後,changeValue 的 Web Service 提供者部分的工作就完成了。我們需要在的專案目錄中收集該服務的 WSDL 檔案以及該服務 WSDL 所引用的所有其他 WSDL 和 XSD 檔案。所有這些表 1 中檔案要在請求者一方可以訪問,服務請求者才能成功呼叫這個服務。


表 1. 專案 MyWebServiceSample 的 Web Service 描述檔案列表

檔名 作用
MyWebServiceSample_MyExport.wsdl 描述了 Web Service 服務
MyInterface.wsdl 定義了介面 MyInterface
MyBO.xsd 定義了物件 MyBO


利用 Web Service Consumer 呼叫 Web Service

開發工具和平臺

本節將用到 Lotus Domino Designer 作為開發工具,Lotus Domino 伺服器作為工作平臺。我們利用 Lotus Domino Designer 在 Lotus Domino 伺服器上建立一個新的名為 Test Web Service 的應用,其檔名為 TestWebS.nsf。本文所有的示例都將在 Test Web Service 中展示。

建立基於 Lotus Script. 的 Web Service Consumer

在 Lotus Domino Designer 中開啟 Test Web Service 應用,選擇 Code – Web Service Consumer,在右鍵選單中選擇 New Web Service Consumer,在建立對話方塊中填寫 MyLotusScriptConsumer 作為名稱,型別選擇為 LotusScript. 並通過檔案瀏覽對話方塊選擇 Web Service 服務的描述檔案 MyWebServiceSample_MyExport.wsdl,如圖 5 所示,點選 OK,Lotus Domino Designer 會為我們自動生成呼叫對應 Web Service 所需的所有 LotusScript. 程式碼,如程式碼清單 2 所示。不過這裡有一點要注意,就是要將表一中所有相關的描述檔案都放在同一個 Lotus Domino Designer 可以訪問到的目錄。


圖 5. 建立 Lotus Script. Web Service Consumer
圖 5. 建立 Lotus .. Web Service Consumer

清單 2. 生成的 MyLotusScriptConsumer 程式碼

				 
%INCLUDE "lsxsd.lss"
Class MyBO_n16 As XSD_ANYTYPE 
    Public Name As XSD_STRING 
    Public Value As XSD_STRING 
    Sub NEW 
    End Sub 
End Class 
Const n17 = "http://MyWebServiceSample/MyInterface"
Const n16 = "http://MyWebServiceSample"
Class MyInterface_n17 As PortTypeBase 
    Sub NEW 
        Call Service.Initialize (
            "HttpMyWebServiceSampleMyInterfaceBindingMyExport_MyInterfaceHttpService", _ 
            "MyExport_MyInterfaceHttpService.MyExport_MyInterfaceHttpPort", _
	        "http://localhost:9086/MyWebServiceSampleWeb/sca/MyExport", _ 
            "MyInterface_n17") 
    End Sub 
    Function changeValue(input1 As MyBO_n16) As MyBO_n16 
        Set changeValue = Service.Invoke("changeValue", input1) 
    End Function 
End Class 

程式碼總結

瀏覽 MyLotusScriptConsumer 程式碼,我們可以看到以下特點:

  • 所有 WSDL 中定義的物件型別都是 XSD_ANYTYPE 的子類
  • 業務物件類是 MyBO_n16
  • 呼叫的服務類是 MyInterface_n17
  • 呼叫的方法是 MyInterface_n17 中的 changeValue 方法

建立基於 Java 的 Web Service Consumer

基於 Java 的 Web Service Consumer 與基於 Lotus Script. 的基本相同,只是型別選擇為 Java,名稱命名為 MyJavaConsumer 如圖 6 所示。Lotus Domino Designer 會為 WSDL 中定義的每一個物件生成一個 Java 類。生成的呼叫介面類 MyInterface 如清單 3 所示,其他生成的類請參照本文的示例應用 TestWebS.nsf。


圖 6. 建立 Java Web Service Consumer
圖 6. 建立 Java Web Service Consumer

清單 3. 生成的 MyInterface.java 程式碼

				 
package MyWebServiceSample.MyInterface; 

public interface MyInterface extends lotus.domino.types.PortTypeBase, java.rmi.Remote { 
    public MyWebServiceSample.MyBO changeValue(MyWebServiceSample.MyBO input1) 
        throws java.rmi.RemoteException; 
}

程式碼總結

瀏覽 MyJavaConsumer 程式碼,可以發現以下特點

  • 所有 WSDL 都會生成一個相應的 Java 類。
  • 業務物件類是 MyBO。
  • 呼叫的服務類是 MyExport_MyInterfaceHttpServiceLocator,通過 MyExport_MyInterfaceHttpServiceLocator 的 getMyExport_MyInterfaceHttpPort 方法可以得到呼叫介面。
  • 呼叫的介面類是 MyInterface。
  • 呼叫的方法是 MyInterface 中的 changeValue 方法。

在 Lotus Domino 業務流中使用 Web Service

本節示例介紹

在本節中我們將通過示例,利用一個簡單的表單 TestWebServiceForm. 來展示如何在業務流中通過 Web Service Consumer 來呼叫外部的 Web Service。一方面,呼叫的方式按實現的指令碼語言型別可以分為 Lotus Script. 和 Java;另一方面,按照指令碼執行的環境可以分為 Notes 客戶端和 Domino 伺服器端。按照通常的情況,執行在客戶端的指令碼的操作物件是介面顯示中的文件;而執行在伺服器端的指令碼的操作物件是儲存到資料庫檔案的文件。客戶端指令碼通過嵌在表單中的一個名為 Invoke MyLotusScriptConsumer 的 Action觸發;而伺服器端的指令碼則在後臺自動針對所有剛剛建立或更改過的文件執行。

在本例的表單 TestWebServiceForm. 中,我們有一個域 input 作為使用者新增 MyBO 中 Value 的輸入值,一個域 output 用於顯示通過客戶端呼叫 changeValue 後,MyBO 中 Value 的返回值,一個域 outputOnServer 用於顯示通過伺服器端呼叫 changeValue 後,MyBO 中 Value 的返回值。同時在表單中新增一個名為 Invoke MyLotusScriptConsumer 的 Action。一個典型按表單 TestWebServiceForm. 建立的文件如圖 7 所示。


圖 7. 符合 TestWebServiceForm. 表單的文件
圖 7. 符合 TestWebServiceForm. 表單的文件

在客戶端呼叫 Web Service Consumer

為了在客戶端手動觸發對 MyLotusScriptConsumer 的呼叫,我在表單中新增了一個同時在表單中新增一個名為 Invoke MyLotusScriptConsumer 的 Action,這個 Action呼叫一個執行在客戶端的名為 LotusScriptClientAgent 的 Agent,再通過 LotusScriptClientAgent 呼叫 MyLotusScriptConsumer 程式碼。Action呼叫 Agent有多種方式,最簡單的是利用 Fomular,如清單 4 所示,Invoke MyLotusScriptConsumer 通過 Fomular指令碼呼叫了 LotusScriptClientAgent。本節將通過 LotusScriptClientAgent 來介紹如何編寫客戶端指令碼。

在 Lotus Domino Designer 中開啟 Test Web Service 應用,選擇 Code – Agents,在右鍵選單中選擇 New Agent,填寫 LotusScriptClientAgent 作為名稱,LotusScript作為型別,屬性按照圖 8 填寫,程式碼參照程式碼清單 5。


圖 8. LotusScriptClientAgent 屬性
圖 8. Lotus.ClientAgent 屬性

清單 4. Invoke MyLotusScriptConsumer 的 Fomular 程式碼

				 
 @Command([ToolsRunMarco];”(LotusScriptCientAgent)”) 


清單 5. LotusScriptClientAgent 程式碼
				 
 Option Public 
 Use "MyLotusScriptConsumer"
 Option Declare 

 Sub Initialize() 
    Dim ws As New NotesUIWorkspace 
    Dim docui As NotesUIDocument 
    Dim inputName As New Xsd_string 
    Dim inputValue As New Xsd_string 
    Dim service As New MyInterface_n17 
    Dim inputBO As New MyBO_n16 
    Dim outputBO As MyBO_n16 
	
    'Update Notes client 
    Set docui = ws.CurrentDocument 
    Set inputBO.Name = New Xsd_string 
    Call inputBO.Name.Setvaluefromstring("Input from Notes") 
    Set inputBO.Value = New Xsd_string 
    Call inputBO.Value.Setvaluefromstring(docui.Getselectedtext("input")) 
    Set utputBO = service.Changevalue(inputBO) 
    Call docui.Fieldsettext("output", outputBO.Value.Getvalueasstring()) 
    Call docui.Refresh 
    Call ws.Viewrefresh() 
 End Sub 

程式碼總結

以本節的指令碼為例,我們可以得到以下編寫 Lotus Script. 的經驗:

  • 如果要 Agent只作為一個被呼叫的庫函式,而不讓它自動地或者定期地執行,那麼該 AgentTrigger應設定為 On event – Agent list selectionTarget應設定為 None。這種不自動執行的 Agent在儲存後,Lotus Domino Designer 會自動為其名字加括號。
  • Use關鍵字匯入其他指令碼或 Web Service Consumer 作為指令碼庫。
  • 對於操作客戶端介面的指令碼,主要的工具類有 NotesUIWorkspace 和 NotesUIDocument 等,這些類讀寫的是 GUI 介面顯示的屬性值,而與資料庫中的實際儲存值無關。
  • 執行時的上下文入口為建立一個新的 NotesUIWorkspace 物件。
  • 在更改完成後,呼叫 NotesUIDocument 的 Refresh 方法重新整理文件,或呼叫 NotesUIWorkspace 的 Viewrefresh 方法重新整理檢視。

測試本小節示例

要測試本節示例中的指令碼,只需以編輯方式開啟任何一個 TestWebServiceForm. 文件,如圖所示,在 Input屬性中填寫任意字元,然後點選 Invoke MyLotusScriptConsumer,則呼叫後的返回值會在 Output屬性中顯示。需要注意這裡改變的只是介面的顯示值,只有儲存文件後,這些更新後的值才會儲存到資料庫中。

在伺服器端呼叫 Lotus Script. Web Service Consumer

在伺服器端執行的 Agent,主要分為定期觸發和根據事件觸發兩類,本小節通過編寫一個根據事件觸發的 Agent介紹如何用 Lotus Script. 編寫伺服器端指令碼處理那些最新被建立或更改的文件。因為伺服器端的指令碼都是在後臺執行,所以一般來說指令碼的操作物件是文件的資料結構,這一點跟客戶端指令碼是不同的。

在 Lotus Domino Designer 新增一個名稱為 LotusScriptServerAgent 作為名稱,LotusScript作為型別,屬性按照圖 9 填寫,程式碼參照程式碼清單 6。


圖 9. LotusScriptServerAgent 屬性
圖 9. Lotus.ServerAgent 屬性

清單 6. LotusScriptServerAgent 程式碼

				 
 Option Public 
 Use "MyLotusScriptConsumer"
 Option Declare 

 Sub Initialize() 
   Dim session As New NotesSession 
   Dim database As NotesDatabase 
   Dim notesCollection As NotesDocumentCollection 
   Dim note As NotesDocument 
   Dim inputArray As Variant 
   Dim inputName As New Xsd_string 
   Dim inputValue As New Xsd_string 
   Dim service As New MyInterface_n17 
   Dim inputBO As New MyBO_n16 
   Dim outputBO As MyBO_n16 
	
   'Update Notes Server 
   Print "Agent started to run"
   Set notesCollection = session.Currentdatabase.Unprocesseddocuments 
   Set note = notesCollection.Getfirstdocument() 
   While Not (note Is Nothing) 
       Set inputBO.Name = New Xsd_string 
       Call inputBO.Name.Setvaluefromstring("Input from Notes") 
       Set inputBO.Value = New Xsd_string 
       Print "Input string:" & note.Getfirstitem("input").Text 
       Call inputBO.Value.Setvaluefromstring(note.Getfirstitem("input").Text) 
       Set utputBO = service.Changevalue(inputBO) 
       Print "Input string:" & outputBO.Value.Getvalueasstring() 
       Call note.Replaceitemvalue("outputOnServer", outputBO.Value.Getvalueasstring()) 
       Call note.Save(True, True, True) 
       Call session.Updateprocesseddoc(note) 
       Set note = notesCollection.Getnextdocument(note) 
   Wend 
 End Sub 

程式碼總結

以本節的指令碼為例,我們可以得到以下編寫 Lotus Script. 的經驗:

  • 對於操作伺服器端文件的指令碼,主要的工具類有 NotesSession,NotesDatabase 和 NotesDocument 等,這些類讀寫的是記憶體中文件所對應的各個屬性。
  • 執行時的上下文入口為建立一個新的 NotesSession 物件。
  • 在更改完成後,呼叫 NotesDocument 的 Save 方法儲存對文件的修改。
  • 對於新建立或更改的文件,Lotus Domino 會將它們標記為未處理的文件,通過 NotesDatabase 的 Unprocesseddocuments 方法可以得到所有未被處理的文件。在處理過文件後,要呼叫 NotesSession 的 Updateprocesseddoc 方法將文件標註為已處理。不過當同一個文件再次被更改的時候,它又會自動被標記為未處理。

測試本小節示例

伺服器端的 Agent一旦儲存成功就開始在後臺自動執行了。本小節的 LotusScriptServerAgent 指令碼一旦儲存成功,會在後臺定期的檢查是否有未被處理的新更新文件,如果有新更新的文件,指令碼會根據儲存的 input 值呼叫,將返回值放到 outputOnServer 中。

要測試本節示例中的指令碼,只需 TestWebServiceForm. 文件中的 input 值,儲存該文件,等待一段時間後再開啟該文件,會發現 outputOnServer 的值也發生了相應的改變。

後臺執行的 Agent對文件的處理總會相對與文件的更改時刻有一些延遲。如果要減小這種延遲,可以更改 notes.ini 中與 Agent相關的 AMgr_DocUpdateAgentMinInterval,AMgr_DocUpdateEventDelay 和 AMgr_SchedulingInterval 等幾個屬性。需要注意的是更改配置後要重新啟動 Lotus Domino 才能發揮作用,此外,減小延遲勢必增加伺服器的執行開銷,對伺服器效能有影響,在實際執行的系統中要綜合考慮才能更改相應設定。

在伺服器端呼叫 Java Web Service Consumer

在伺服器端執行的 Agent呼叫 JavaWeb Service Consumer 的方法同呼叫 Lotus Script. Web Service Consumer 的方法基本一致,只是 Agent的指令碼語言選擇為 Java即可。本小節示例的程式如清單 7 所示。


清單 7. JavaServerAgent 程式碼

				 
import MyWebServiceSample.MyBO; 
import MyWebServiceSample.MyInterface.Binding.MyExport_MyInterfaceHttpServiceLocator;
import lotus.domino.*; 

public class JavaAgent extends AgentBase { 
    public void NotesMain() { 
        try { 
            Session session = getSession(); 
            AgentContext agentContext = session.getAgentContext(); 
          
            // (Your code goes here) 
            System.out.println("Start running agent: JavaServerAgent"); 
            MyExport_MyInterfaceHttpServiceLocator service = 
                new MyExport_MyInterfaceHttpServiceLocator(); 
            DocumentCollection collection = agentContext.getUnprocessedDocuments(); 
            for (Document document = collection.getFirstDocument(); document != null; 
                document = collection.getNextDocument()) { 
                MyBO input1 = new MyBO(); 
                input1.setName("Input from Notes"); 
                input1.setValue(document.getItemValueString("input")); 
                System.out.println("document.getItemValueString:" 
		    + document.getItemValueString("input")); 
                MyBO output1 = service.getMyExport_MyInterfaceHttpPort()
		    .changeValue(input1);
                System.out.println("input:" + input1.getValue());
                document.replaceItemValue("outputOnServer", output1.getValue());
                System.out.println("outputOnServer:" + output1.getValue());
                document.save();
                agentContext.updateProcessedDoc(document);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
 }

程式碼總結

以本節的 Java 程式為例,我們可以得到以下用 Java 編寫 Agent 的經驗:

  • 對於操作伺服器端文件的 Java 程式,主要的工具類有 NotesSession,NotesDatabase,AgentContext 和 NotesDocument 等,這些類讀寫的是記憶體中文件所對應的各個屬性。
  • 實現的方法 Agent 是實現基類 lotus.domino.AgentBase 的一個子類。而執行時的上下文入口就是當前物件 this。通過呼叫 lotus.domino.AgentBase 的各種方法,可以得到程式設計所需要的執行期引數。
  • 在更改完成後,呼叫 NotesDocument 的 Save 方法儲存對文件的修改。
  • 對於新建立或更改的文件,Lotus Domino 會將它們標記為未處理的文件,通過 NotesDatabase 的 Unprocesseddocuments 方法可以得到所有未被處理的文件。在處理過文件後,要呼叫 NotesSession 的 Updateprocesseddoc 方法將文件標註為已處理。不過當同一個文件再次被更改的時候,它又會自動被標記為未處理。

測試本小節示例

本小節中示例 Agent 的作用和上一小節基本相同,可以按照測試伺服器端 Lotus Script. Web Service Consumer 一樣測試。但需要注意的是,兩個 Agent 同時執行的時候只有一個能發生作用,因此在測試一個 Agent 的時候要停用另一個。停用一個 Agent的方法是將該 AgentTrigger 應設定為 On event – Agent list selection

在 Lotus Domino 業務流程式碼編寫小結

在本節中,我們通過實現呼叫 Web Service Consumer 的 Agent, 介紹瞭如何利用 Lotus Script. 或 Java 編寫業務流程式碼。 在 Lotus 業務流系統中,與人工操作相關的處理邏輯,例如介面操作等通常是在客戶端執行的,這一部分邏輯用 Lotus Script. 來實現比較合適。在 Lotus Domino 8.5.1 中雖然也引入了進行介面操作的 Java 程式設計介面,包括 com.ibm.notes.java.ui.* 下的 Java 類,但是還沒有清晰的程式碼示例展示如何使用,有興趣的話可以繼續關注。對於一些自動處理的業務流邏輯,程式碼通常在伺服器端執行,這一類 Agent 既可以用 Lotus Script. 實現也可以用 Java 實現,不過如果業務流邏輯較複雜的話,用 Java 實現更容易實現較好的封裝特性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-663083/,如需轉載,請註明出處,否則將追究法律責任。

相關文章