6.業(yè)務(wù)與流程的綁定

2022-07-24 11:16 更新

       UFLO是一套基于JAVA的流程引擎,它即可以用在基于J2EE的B/S系統(tǒng)之上,也可以用于基于J2EE的C/S系統(tǒng)之中。所以UFLO在設(shè)計(jì)之初就不與任何UI表現(xiàn)層綁定,它所要做的就是提供一系列的可供外部調(diào)用的API接口,對(duì)于我們的業(yè)務(wù)系統(tǒng)而言,可以調(diào)用UFLO中提供的API,實(shí)現(xiàn)業(yè)務(wù)流程的開啟、任務(wù)的開始與完成等操作。

      我們知道,UFLO中有三個(gè)子項(xiàng)目,分別是uflo-core、uflo-console與uflo-client。uflo-core提供了流程運(yùn)行的核心環(huán)境,負(fù)責(zé)整個(gè)流程生命周期的管理工作;uflo-console則是一個(gè)基于dorado7表現(xiàn)層的分支項(xiàng)目,這個(gè)項(xiàng)目中提供了B/S項(xiàng)目中基于dorado7的流程模版控制與測(cè)試中心、提供了用戶待辦頁面及節(jié)假日配置等流程引擎運(yùn)行的輔助模塊;最后一個(gè)uflo-client則是提供給我們的程序員使用的,通過調(diào)用uflo-client模塊中的ProcessClient與其中的TaskClient就可實(shí)現(xiàn)在我們的業(yè)務(wù)系統(tǒng)與流程引擎的交互。下面是開啟一個(gè)流程實(shí)例操作的代碼片段。

開啟流程示例代碼

import javax.annotation.Resource;
import com.bstek.bdf2.core.context.ContextHolder;import com.bstek.uflo.client.service.ProcessClient; import com.bstek.uflo.service.StartProcessInfo; 
public class BusinessTest {
   @Resource(name=ProcessClient.BEAN_ID)
   private ProcessClient processClient;
     public void saveDataAndStartProcess(BusinessData data){
    String primaryKeyValue=saveBusinessData(data);
    StartProcessInfo info=new StartProcessInfo(ContextHolder.getLoginUserName());        
    info.setBusinessId(primaryKeyValue);
    processClient.startProcessById(101, info);
  } }

從上面的代碼中可以看到,在開始流程之前,我們首先將提交上業(yè)的BusinessData這個(gè)業(yè)務(wù)數(shù)據(jù)對(duì)象保存,保存后產(chǎn)生該對(duì)象的主鍵值primaryKeyValue,接下來創(chuàng)建一個(gè)StartProcessInfo對(duì)象,將業(yè)務(wù)對(duì)象主鍵值賦給這個(gè)對(duì)象,并設(shè)置流程開啟人,最后調(diào)用ProcessClient接口的ProcessInstance startProcessById(longprocessId,StartProcessInfostartProcessInfo)方法開啟一個(gè)ID為101的流程模版對(duì)應(yīng)的流程實(shí)例。在上面的代碼當(dāng)中,ProcessClient我們通過Spring注入到當(dāng)前類中,ProcessClient配置在Spring中的Bean的ID就是ProcessClient.BEAN_ID的常量值,所以這里可以直接使用。

下面我們?cè)賮砜匆欢瓮瓿扇蝿?wù)的業(yè)務(wù)代碼:
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import com.bstek.bdf2.core.context.ContextHolder; import com.bstek.uflo.client.service.TaskClient; import com.bstek.uflo.service.StartProcessInfo; 
public class BusinessTest {
  @Resource(name=TaskClient.BEAN_ID)
  private TaskClient taskClient;
  public void saveDataAndStartProcess(BusinessData data,long taskId){
    saveBusinessData(data);
    Map<String,Object> variables=new HashMap<String,Object>(); 
    variables.put("businessName", data.getName()); 
    variables.put("businessOwner", data.getBusinessOwner());    taskClient.start(taskId);    taskClient.complete(taskId,variables);
} }

     比較開始流程的代碼片段,我們會(huì)發(fā)現(xiàn)操作模式基本一樣,都是先進(jìn)行業(yè)務(wù)數(shù)據(jù)操作(保存、更新之類),再進(jìn)行流程操作(開始流程實(shí)例或完成任務(wù)),在這段完成任務(wù)的示例代碼當(dāng)中,首先調(diào)用saveBusinessData方法來保存提交上來的業(yè)務(wù)數(shù)據(jù),接下來創(chuàng)建一個(gè)Map集合,用于存放需要寫入流程的流程變量的值,這里的我們從BusinessData中取了兩個(gè)值放入這個(gè)Map,接下來調(diào)用TaskClient的start方法開始指定的人工任務(wù)(UFLO中人工任務(wù)的完成必須要先開始,某些時(shí)候?qū)τ谔幚碇芷诒容^長(zhǎng)的人工任務(wù),可以先開始,再不斷設(shè)置處理進(jìn)度progress的值,最后再完成,這里就直接開始后完成),最后調(diào)用TaskClient的complete方法完成指定人工任務(wù)并回將流程變量的Map寫入到流程實(shí)現(xiàn)。

同開始流程的代碼一樣,TaskClient也是通過Spring注入,其在Spring中Bean的ID為TaskClient.BEAN_ID。

前面提到,UFLO的使用支持嵌入式與獨(dú)立服務(wù)兩種方式,但對(duì)于我們程序員來說,它只需要使用uflo-client模塊中的ProcessClient與其中的TaskClient與我們的業(yè)務(wù)系統(tǒng)交互即可,究竟項(xiàng)目做好之后,采用哪種部署方式,我們的uflo-client模塊中的ProcessClient與其中的TaskClient都可以通過設(shè)置一個(gè)外部屬性實(shí)現(xiàn)自由轉(zhuǎn)換,這個(gè)屬性就是uflo.restAccessBaseUrl,該屬性值的作用就是指定獨(dú)立部署的遠(yuǎn)程ufloserver的地址。默認(rèn)該屬性值為空,那么我們的引擎就會(huì)認(rèn)為我們采用的是嵌入式模式,所以它會(huì)通過訪問我們項(xiàng)目?jī)?nèi)部配置的數(shù)據(jù)源實(shí)現(xiàn)與流程引擎數(shù)據(jù)庫的互動(dòng);一旦我們定義了該屬性的值,那么UFLO引擎就知道我們采用的是獨(dú)立服務(wù)模式,它會(huì)通過該屬性定義的URL值來訪問遠(yuǎn)程的uflo server,實(shí)現(xiàn)本地業(yè)務(wù)邏輯與遠(yuǎn)程流程引擎的交互。

ProcessClient對(duì)于我們程序員來說,主要是實(shí)現(xiàn)業(yè)務(wù)流程的開啟、流程模版與實(shí)例的刪除、流程模版與變量的獲取等操作;而TaskClient則提供了大量針對(duì)人工任務(wù)的操作。在這兩個(gè)接口當(dāng)中,我們?yōu)槊總€(gè)方法都添加了詳細(xì)的注釋,使用時(shí)查看注釋應(yīng)該就可以明確具體用法。

在項(xiàng)目當(dāng)中,如果我們需要查詢流程流轉(zhuǎn)相關(guān)歷史信息,那么可以通過HistoryService來實(shí)現(xiàn)。在HistoryService當(dāng)中提供了大量的與流程相關(guān)的歷史信息查詢功能,比如根據(jù)流程實(shí)例的ID查詢當(dāng)前實(shí)例流轉(zhuǎn)過程當(dāng)中經(jīng)過了哪些流程節(jié)點(diǎn),或者根據(jù)流程實(shí)例查詢當(dāng)前實(shí)例流轉(zhuǎn)時(shí)產(chǎn)生了哪些人工任務(wù),這些人工任務(wù)在處理時(shí)處理人是誰,所有者是誰,花費(fèi)多長(zhǎng)時(shí)間等。同樣HistoryService也配置在Spring當(dāng)中,其bean的ID為“uflo.historyService”,我們的業(yè)務(wù)系統(tǒng)可根據(jù)需要調(diào)用這個(gè)HistoryService查詢所需要的歷史流程信息。





以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)