项目上需要使用Lombardi即IBM Websphere BPM7.5,就由我承担起了研究和部署、实施的任务。由于公司之前没有使用过该平台,所以几乎没有现成的资源。只能从IBM的开发网站上下载英文资料进行研究。值得高兴的是最终成功的完成了lombardi的的部署和实施任务。

下面是之前研究Lombardi中所整理的一些关于WebAPI的一些资料,希望对需要使用lombardi的人有所帮助。

 

1. WebAPI相关接口和类说明

以下是Lombardi提供的WebAPI所有内容。在这里对每个类做了概要说明,详细内容需要参考相关文档。并且每个类的具体应用方法和能够达到的效果需要在通过实践才能最终确定。

 

接口

WebAPI

主要用于连接lombardi,从而获取必要的数据信息;以及涉及到流程的具体操作:

1)获取流程实例、当前用户、所有角色、任务分配;

2)优先级更改;

3)到期日期的修改;

4)终止流程、流程暂停;

5)启动一个新的流程;

6)开始执行任务、关闭任务;

7)执行搜索获取流程实例;

8)创建、删除文档等

  

Action

ActionPermission

确定用户是否可以执行特定的操作与过程实例或任务。可以获取和设置该值

BusinessData

用来获取流程本身定义的变量及其值。

ChartData

ChartData包含的是在记分板中被引用的图像数据。

ClientInfo

获取客户端的信息。

ComplexValue

ComplexValue用于包装复杂类型的值传递给WebAPI操作,并且可以包含任何命名空间中的单个元素。该类是用来传递复杂类型对象的值。

CustomProperty

已字符串键/值对的形式获取和设置用户自定义属性。

Document

保存跟流程实例相关的文件类。

DocumentProperty

已字符串键/值对的形式获取文档中附带的属性。

ExposedItem

ExposedItemType

ExternalActivity

实现活动的自定义属性、输入和输出参数。

ExternalActivityAttachment

用来连接外部活动的定义和外部活动数据

ExternalActivityData

封装和传递ExternalActivityAttachment所需要的变量

Favorite 

我的最爱定义了一种用户启动一个进程或服务中的成员的喜爱。

FavoriteType

InfoPathForm

支持officeinfopath在线表单

InfoPathFormAttachment

Infopath表单相关附件

InfoPathFormData

Infopath表单相关数据

Parameter 

为流程和活动定义参数

Priority 

标示任务的重要性

Process 

一个过程是业务流程的定义,可用于启动新的流程实例或组返回的过程实例,通过这个API的各种操作。

ProcessInstance

流程实例

ProcessInstanceStatus

流程实例状态 

Report 

Role 

角色

SavedSearch

客户端使用一个SavedSearch执行搜索来获取进程实例和/或任务

Scoreboard 

用户可以通过Scoreboard 查看自己的工作效率等信息

ScoreboardData

ScoreboardData包含实际数据

Search 

用来搜素流程实例运行和任务中的数据

SearchableProcessColumn

流程搜索列

SearchableProcessInstanceColumn

流程实例搜索列 

SearchableTaskColumn

任务搜索列

SearchableType

搜索类型 

SearchColumn

一个SearchColumn是用于指定搜索传递列,条件和排序。

SearchColumnMetaData

SearchCondition

搜索条件

SearchMetaData

SearchMetaData用来描述信息,需要执行搜索和搜索结果的描述。

SearchOperator

SearchOrder

SearchOrdering

一个用于指定SearchOrdering,搜索结果中的列进行排序的升序或降序排列。

SearchResultRow

在一个SearchResultRow包含的一组值 符合搜索条件的搜索中的每个列的值。

SearchResults

一个SearchResults对象包含在搜索中指定的列和行包含每一列的值的列表的搜索排序排序的列元数据。

SendTaskInfo

SendTaskInfo可用于构建和发送与流程实例没有直接相关的任务。

ServerInfo

描述服务的相关信息

Service 

一个任务要执行的服务

Task 

任务是包含信息有关的活动的一个实例,通常与流程实例相关联。

TaskListSyncInput

TaskListSyncInput用于同步客户端在服务器上执行已保存的搜索结果。

TaskListSyncOutput

TaskListSyncOutput包含客户端需要同步的任务列表在服务器上的当前状态保存的搜索列表的变化。

TaskStatus

任务状态

TaskSyncAction

TaskSyncItem

一个TaskSyncItem指示客户端应该怎样做同步的任务列表中保存的搜索结果。

UpdateDocument

UpdateDocumentResponse

User 

用户

UserConfiguration

UserConfiguration用于从服务器检索有关当前用户在单个操作中的的信息。

Variable 

变量

 2. Web API 的使用场景及具体实现

下面将使从3个场景进行讲解WebAPI。分别是使用 Web API 查询待办任务使用 Web API 获取业务数据使用 Web API 更新流程数据并推动流程继续流转

 

2.1 WebAPI初始化

具体介绍如何灵活使用 Web API 完成与客户自定义 Web 应用的整合。这里提到的客户自定义应用泛指开发商自行开发的应用或第三方应用。本稿将会介绍如何实现最常用的 Web API 接口,关于更多接口请参考 LombardiInstallDir\web-api 目录。

在使用 Web API 之前,需要先初始 Web API 对象。WebSphere Lombardi Edition 将流程及相关数据封装成 Web Service,并提供了访问 Web Service 的 JAX-PRC 接口的 WebAPIFactory 类。我们可以通过构建 WebAPIFactory 实例来初始 Web API 对象。下面代码 用于初始 Web API 对象。


代码 1. 初始 Web API 对象

                

 private WebAPI WebAPI

 public static String ServerRoot="http://localhost:19086/"; 

    

 /** initialize WebAPI object **/ 

 public void initWebAPI(String username, String password){ 

 WebAPIFactory WebAPIFactory; 

 try { 

 WebAPIFactory = WebAPIFactory.newInstance(this.getProperties(username, password)); 

 WebAPI = WebAPIFactory.newWebAPI(); 

 }catch (Exception e) { 

 e.printStackTrace(); 

 } 

 } 

 

 /** Set process properties **/ 

 public Properties getProperties(String username, String password){ 

        

 Properties properties = new Properties(); 

 properties.put("javax.xml.rpc.security.auth.username", username ); 

 properties.put("javax.xml.rpc.security.auth.password", password); 

 properties.put("javax.xml.rpc.service.endpoint.address", 

 this.ServerRoot + "WebAPI/services/WebAPIService"); 

 properties.put("javax.xml.rpc.session.maintain", "true"); 

 properties.put("com.lombardisoftware.includeNullArrayElements", "true"); 

 

 return properties; 

 } 

 

 

代码中 usernamepassword 为可访问 WLE 流程的用户。

 

 

2.2 使用 Web API 查询待办任务

Web API 提供了 Search 类帮助我们查询流程实例或任务。我们可以通过 Search 类的 setSearchColumn 指定需要查询的项目,通过 setSearchConditions 指定查询条件,通过 setOrderBy 指定查询结果排序。代码 是查询待办任务的代码示例。


代码 2. 查询待办任务

                

 /** Search inbox tasks **/ 

 public SearchResults searchMyTask() throws Exception { 

 //Create a new search instance 

 Search search = new Search(); 

 

 //Set it to be organized by Task 

 search.setOrganizedByType(SearchableType._Task); 

 

 //Specify the columns to return 

 search.setColumns(new SearchColumn[] { 

 new SearchColumn(SearchableType._Process, SearchableProcessColumn._Name, null), 

 new SearchColumn(SearchableType._ProcessInstance,

  SearchableProcessInstanceColumn._Id, null), 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._Id, null), 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._Status, null), 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._Subject, null), 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._Activity, null), 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._ReceivedDate, null), 

  new SearchColumn(SearchableType._Task, SearchableTaskColumn._ClosedDate, null), 

  new SearchColumn(SearchableType._Task, SearchableTaskColumn._AssignedToUser, null), 

 }); 

        

 //Set the conditions - search tasks with status of new or received 

 search.setConditions(new SearchCondition[] { 

 new SearchCondition( 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._Status, null), 

    SearchOperator._EQUALS, 

    TaskStatus._New_or_Received), 

  new SearchCondition( 

 new SearchColumn(SearchableType._Process, SearchableProcessColumn._Name, null), 

    SearchOperator._NOT_EQUALS, 

    null) 

 }); 

 

 //Set the results to be ordered by task ID ascending 

 search.setOrderBy(new SearchOrdering[] { 

    new SearchOrdering( 

 new SearchColumn(SearchableType._Task, SearchableTaskColumn._Id, null), 

      SearchOrder.ASCENDING)                        

 }); 

 

 //Execute the inbox saved search, retrieving the first 20 results 

 SearchResults results = WebAPI.executeSearch(search, 20, null); 

 

 return results; 

 } 

 

 

本稿以 JSP 作为客户端页面,介绍如何在客户自定义的表单里使用上面定义的 SearchResults 类获取查询结果(代码 3)。


代码 3. 将待办任务查询结果返回 JSP 页面

                

 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 

 <%@ page language="java" import="com.myWebAPI.*,teamworks.samples.client.WebAPIFactory, 

 com.lombardisoftware.WebAPI.*"%> 

 <% 

 HttpSession sessionObj= request.getSession(); 

 String username = (String)sessionObj.getAttribute("userName"); 

 String password = (String)sessionObj.getAttribute("password"); 

 

 MyWebAPI WebAPI = new MyWebAPI(); 

 String ServerRoot=WebAPI.getServerRoot(); 

 WebAPI.initWebAPI(username,password); 

 SearchResults results = null; 

 results= WebAPI.searchMyTask(); 

 %> 

 

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

 <html> 

 <head> 

 -- 省略 -- 

 </head> 

 <body> 

 <table border="2"> 

 <% 

 for( int i=0; i<results.getRows().length; i++ ){ 

 SearchResultRow row=results.getRows()[i]; 

 %> 

 <tr> 

 <% 

 String processName = (String)row.getValues(0); 

 long piId = ((Long)row.getValues(1)).longValue(); 

 long taskId = ((Long)row.getValues(2)).longValue(); 

 String status = (String)row.getValues(3); 

 Task task = WebAPI.getTaskByID(taskId); 

 String activity = (String)row.getValues(6); 

 String subject = (String)row.getValues(4); 

 String AssignedToUser = (String)row.getValues(11);       

     %> 

     <td> 

 <%=piId%> 

            </td> 

            <td> 

       <%=processName%> 

            </td> 

            <td> 

       <%=taskId%> 

            </td> 

            <td> 

       <%=activity%> 

            </td> 

            <td> 

       <%=AssignedToUser%> 

            </td> 

            <td> 

            </tr>  

      <% } %>     

     </table> 

 </body> 

 </html> 

 

 

我的博客已经搬家到 七色光  http://www.sevenlight.me