欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot中使用Activiti的方法教程(二)

 更新時間:2018年08月09日 10:34:21   作者:jdon  
工作流(Workflow),就是“業(yè)務(wù)過程的部分或整體在計算機應(yīng)用環(huán)境下的自動化”,下面這篇文章主要給大家介紹了關(guān)于Spring Boot中使用Activiti的相關(guān)資料,需要的朋友可以參考下

前言

前面一節(jié)我們已經(jīng)了解了Activiti的基礎(chǔ)概念,包括流程定義的用語和它的API功能,已經(jīng)如何入手Activiti,在這一節(jié)我們將結(jié)合代碼具體學(xué)習(xí)使用。小圖是我們需要完成的請假流程圖:

正如我們在圖中看到的,這是一個非常簡單的流程:員工提出休假請求,提供休假天數(shù)和開始日期。請求發(fā)送給經(jīng)理。他們可以批準(zhǔn)/拒絕該請求。

如果獲得批準(zhǔn),則會定義一個服務(wù)任務(wù)serviceTask來發(fā)送確認(rèn)電子郵件。如果被拒絕,員工可以選擇修改并重新發(fā)送請求,也可以不執(zhí)行任何操作。

此流程的BPMN 2.0定義文件VacationRequest.bpmn20.xml將start事件定義為:

<startEvent id="startEvent" name="請假" activiti:initiator="employeeName">
 <extensionElements>
  <activiti:formProperty id="numberOfDays" name="Number of days" type="long"
        required="true"/>
  <activiti:formProperty id="startDate" name="Vacation start date (MM-dd-yyyy)"
        type="date" datePattern="MM-dd-yyyy hh:mm" required="true"/>
  <activiti:formProperty id="reason" name="Reason for leave" type="string"/>
  <modeler:editor-resource-id><![CDATA[startEvent1]]></modeler:editor-resource-id>
 </extensionElements>
</startEvent>

分配給用戶組“management”的第一個用戶任務(wù)userTask將如下所示:

<userTask id="handle_vacation_request" name="申請請假">
 <documentation>${employeeName} 請假 ${numberOfDays} 天
  (Motivation: ${reason}).
 </documentation>
 <extensionElements>
  <activiti:formProperty id="vacationApproval"
        name="你要批準(zhǔn)這個請假要求嗎?"
        type="enum"
        required="true"/>
  <activiti:formProperty id="comments" name="經(jīng)理的批示" type="string"/>
  <modeler:allow-send-email><![CDATA[true]]></modeler:allow-send-email>
  <modeler:activiti-idm-initiator><![CDATA[true]]></modeler:activiti-idm-initiator>
  <modeler:editor-resource-id>
   <![CDATA[sid-B9AA8E66-2F11-45D0-A270-B052E1A9248E]]></modeler:editor-resource-id>
 </extensionElements>
 <potentialOwner>
  <resourceAssignmentExpression>
   <formalExpression>management</formalExpression>
  </resourceAssignmentExpression>
 </potentialOwner>
</userTask>

使用ServiceTask,我們需要定義要執(zhí)行的代碼段。我們將SendEmailServiceTask.java類作為這段代碼執(zhí)行者。

<serviceTask id="send-email-confirmation" name="發(fā)送郵件確認(rèn)"
    activiti:class="com.example.activitiwithspring.servicetasks.SendEmailServiceTask.java">
 <extensionElements>
  <modeler:editor-resource-id>
   <![CDATA[sid-2C5E1831-9101-4F70-9AEF-4BA72B704205]]></modeler:editor-resource-id>
 </extensionElements>
</serviceTask>

SendEmailServiceTask的代碼如下:實現(xiàn)JavaDelegate接口,實現(xiàn)其execute方法:

public class SendEmailServiceTask implements JavaDelegate {

 public void execute(DelegateExecution execution) {
  //logic to sent email confirmation
 }

}

通過在“sequenceFlow”中添加“conditionExpression”標(biāo)記來決定發(fā)送郵件在什么條件下觸發(fā),也就是定義一個條件流:

<sequenceFlow id="flow3" name="批準(zhǔn)"
    sourceRef="sid-12A577AE-5227-4918-8DE1-DC077D70967C"
    targetRef="send-email-confirmation">
 <extensionElements>
  <modeler:editor-resource-id>
   <![CDATA[sid-609BEB69-E833-4D2F-BD14-FC8F7FD3E9C7]]></modeler:editor-resource-id>
 </extensionElements>
 <conditionExpression xsi:type="tFormalExpression">
  <![CDATA[${vacationApproved == 'true'}]]></conditionExpression>
</sequenceFlow>

這里,vacationApproved是上面的UserTask的formProperty。

部署流程

為了使我們的流程被Activiti Engine所知,我們需要部署該流程。我們可以使用RepositoryService以編程方式執(zhí)行此操作。讓我們編寫一個JUnit測試來看看:

@Test
public void givenBPMN_whenDeployProcess_thenDeployed() {
 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 RepositoryService repositoryService = processEngine.getRepositoryService();
 repositoryService.createDeployment()
  .addClasspathResource("org/activiti/test/vacationRequest.bpmn20.xml")
  .deploy();
 Long count = repositoryService.createProcessDefinitionQuery().count();
 assertTrue(count >= 1);
}

部署意味著引擎將解析BPMN流程定義文件并將其轉(zhuǎn)換為可執(zhí)行文件。此外,還會將記錄添加到每個部署的Repository表中。之后,我們可以查詢Repository服務(wù)從而獲取已部署的進程:也就是ProcessDefinitions。

啟動流程實例ProcessInstance

在將ProcessDefinition部署到Activiti Engine之后,我們可以通過創(chuàng)建ProcessInstances來執(zhí)行該流程定義。如果說ProcessDefinition繪制的是一幅藍圖,那么processInstance就是它的執(zhí)行實現(xiàn)。

對于一個ProcessDefinition,可以有多個ProcessInstances。

可以通過RuntimeService訪問與ProcessInstances相關(guān)的所有詳細信息。

在我們的示例中,在開始事件中,我們需要傳遞休假天數(shù)、開始日期和原因。我們將使用流程變量,并在創(chuàng)建ProcessInstance時傳遞它們。

編寫一個JUnit測試用例實現(xiàn)上面想法:

@Test
public void givenDeployedProcess_whenStartProcessInstance_thenRunning() {
 //deploy the process definition 
 Map<String, Object> variables = new HashMap >();
 variables.put("employeeName", "John");
 variables.put("numberOfDays", 4);
 variables.put("vacationMotivation", "I need a break!");

 RuntimeService runtimeService = processEngine.getRuntimeService();
 ProcessInstance processInstance = runtimeService
   .startProcessInstanceByKey("vacationRequest", variables);
 Long count=runtimeService.createProcessInstanceQuery().count();

 assertEquals("1", count.toString());
}

某個流程定義的多個實例將因流程變量而異,也就是說,同一份流程定義,因為變量不同,導(dǎo)致流程實例也會不同。

有多種方法啟動流程實例,在這里,我們正在使用該流程的key:vacationRequest啟動流程,啟動流程實例后,我們可以通過查詢RuntimeService來獲取有關(guān)它的信息。

完成任務(wù)

當(dāng)我們的流程實例開始運行時,第一步執(zhí)行的是用戶任務(wù)userTask,分配任務(wù)給用戶組“management”的用戶。該用戶可能有一個收件箱,其中包含要由他們完成的任務(wù)列表?,F(xiàn)在,如果我們想繼續(xù)執(zhí)行流程,則需要用戶完成此任務(wù)。對于Activiti Engine,它被稱為“完成任務(wù)”。

我們可以查詢TaskService,獲取任務(wù)對象,然后完成它。

@Test
public void givenProcessInstance_whenCompleteTask_thenGotNextTask() {
 // 部署流程并開始一個流程實例 
 TaskService taskService = processEngine.getTaskService();
 List<Task> tasks = taskService.createTaskQuery()
   .taskCandidateGroup("management").list();
 Task task = tasks.get(0);

 Map<String, Object> taskVariables = new HashMap<>();
 taskVariables.put("vacationApproved", "false");
 taskVariables.put("comments", "We have a tight deadline!");
 taskService.complete(task.getId(), taskVariables);

 Task currentTask = taskService.createTaskQuery()
   .taskName("修改休假請求").singleResult();
 assertNotNull(currentTask);
}

請注意,TaskService的complete()方法也接受所需的流程變量。我們傳遞了經(jīng)理的回復(fù)。

在此之后,流程引擎將繼續(xù)下一步。在這里,下一步詢問員工是否要重新發(fā)送休假請求。

因此,我們的ProcessInstance正在等待此UserTask,其名稱為“修改休假請求”。 

暫停和激活流程

我們可以暫停ProcessDefinition和ProcessInstance。如果我們暫停一個流程定義ProcessDefinition,則在它暫停掛起時我們就無法創(chuàng)建它的實例。我們可以使用RepositoryService來做到這一點:

@Test(expected = ActivitiException.class)
public void givenDeployedProcess_whenSuspend_thenNoProcessInstance() {
 // deploy the process definition
 repositoryService.suspendProcessDefinitionByKey("vacationRequest");
 runtimeService.startProcessInstanceByKey("vacationRequest");
}

要再次激活它,我們只需要調(diào)用其中一個repositoryService.activateProcessDefinitionXXX方法。

同樣,我們可以使用RuntimeService暫停ProcessInstance 。

結(jié)論

在本文中,我們了解了如何將Activiti與Spring Boot結(jié)合使用。我們創(chuàng)建了一個示例ProcessEngineCofiguration文件,它可以幫助我們創(chuàng)建ProcessEngine。ProcessEngine提供的服務(wù)幫助我們管理和跟蹤ProcessDefinitions,ProcessInstances,UserTasks等。

示例代碼位于GitHub上。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • java刪除指定目錄下指定格式文件的方法

    java刪除指定目錄下指定格式文件的方法

    這篇文章主要為大家詳細介紹了java刪除指定目錄下指定格式文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • maven?解包依賴項中的文件的解決方法

    maven?解包依賴項中的文件的解決方法

    Maven是java中的一種項目管理、項目構(gòu)建、依賴管理的工具,接下來通過本文給大家介紹maven?解包依賴項中的文件,需要的朋友可以參考下
    2022-07-07
  • Spring實現(xiàn)定時任務(wù)的幾種方式總結(jié)

    Spring實現(xiàn)定時任務(wù)的幾種方式總結(jié)

    Spring Task 是 Spring 框架提供的一種任務(wù)調(diào)度和異步處理的解決方案,可以按照約定的時間自動執(zhí)行某個代碼邏輯它可以幫助開發(fā)者在 Spring 應(yīng)用中輕松地實現(xiàn)定時任務(wù)、異步任務(wù)等功能,提高應(yīng)用的效率和可維護性,需要的朋友可以參考下本文
    2024-07-07
  • Java 日期格式加上指定月數(shù)(一個期限)得到一個新日期的實現(xiàn)代碼

    Java 日期格式加上指定月數(shù)(一個期限)得到一個新日期的實現(xiàn)代碼

    這篇文章主要介紹了Java 日期格式加上指定月數(shù)(一個期限)得到一個新日期的實現(xiàn)代碼,需要的朋友可以參考下
    2018-05-05
  • SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng)

    SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng)

    WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。這是一種比較官方的說法,簡單點來說就是,在一次TCP連接中,通信的雙方可以相互通信。這篇文章主要介紹了SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng),需要的朋友可以參考下
    2019-10-10
  • Java實現(xiàn)求數(shù)組最長子序列算法示例

    Java實現(xiàn)求數(shù)組最長子序列算法示例

    這篇文章主要介紹了Java實現(xiàn)求數(shù)組最長子序列算法,涉及java針對數(shù)組的遞歸遍歷、判斷相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Java實現(xiàn)MD5加密的方式與實例代碼

    Java實現(xiàn)MD5加密的方式與實例代碼

    MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上。那么它到底有什么,又什么好處呢,會被這么廣泛的運用在應(yīng)用開發(fā)中
    2021-10-10
  • SpringBoot整合Activiti工作流框架的使用

    SpringBoot整合Activiti工作流框架的使用

    本文主要介紹了SpringBoot整合Activiti工作流框架的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解用JWT對SpringCloud進行認(rèn)證和鑒權(quán)

    詳解用JWT對SpringCloud進行認(rèn)證和鑒權(quán)

    這篇文章主要介紹了詳解用JWT對SpringCloud進行認(rèn)證和鑒權(quán),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • @RequestAttribute和@RequestParam注解的區(qū)別及說明

    @RequestAttribute和@RequestParam注解的區(qū)別及說明

    這篇文章主要介紹了@RequestAttribute和@RequestParam注解的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論