本篇文章給大家分享的是有關如何在Spring Boot中使用Activiti,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
隆回網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、成都響應式網(wǎng)站建設公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選成都創(chuàng)新互聯(lián)。
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”的第一個用戶任務userTask將如下所示:
<userTask id="handle_vacation_request" name="申請請假"> <documentation>${employeeName} 請假 ${numberOfDays} 天 (Motivation: ${reason}). </documentation> <extensionElements> <activiti:formProperty id="vacationApproval" name="你要批準這個請假要求嗎?" 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ā)送郵件確認" 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”標記來決定發(fā)送郵件在什么條件下觸發(fā),也就是定義一個條件流:
<sequenceFlow id="flow3" name="批準" 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服務從而獲取已部署的進程:也就是ProcessDefinitions。
啟動流程實例ProcessInstance
在將ProcessDefinition部署到Activiti Engine之后,我們可以通過創(chuàng)建ProcessInstances來執(zhí)行該流程定義。如果說ProcessDefinition繪制的是一幅藍圖,那么processInstance就是它的執(zhí)行實現(xiàn)。
對于一個ProcessDefinition,可以有多個ProcessInstances。
可以通過RuntimeService訪問與ProcessInstances相關的所有詳細信息。
在我們的示例中,在開始事件中,我們需要傳遞休假天數(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()); }
某個流程定義的多個實例將因流程變量而異,也就是說,同一份流程定義,因為變量不同,導致流程實例也會不同。
有多種方法啟動流程實例,在這里,我們正在使用該流程的key:vacationRequest啟動流程,啟動流程實例后,我們可以通過查詢RuntimeService來獲取有關它的信息。
完成任務
當我們的流程實例開始運行時,第一步執(zhí)行的是用戶任務userTask,分配任務給用戶組“management”的用戶。該用戶可能有一個收件箱,其中包含要由他們完成的任務列表?,F(xiàn)在,如果我們想繼續(xù)執(zhí)行流程,則需要用戶完成此任務。對于Activiti Engine,它被稱為“完成任務”。
我們可以查詢TaskService,獲取任務對象,然后完成它。
@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)理的回復。
在此之后,流程引擎將繼續(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"); }
springboot一種全新的編程規(guī)范,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。
以上就是如何在Spring Boot中使用Activiti,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當前文章:如何在SpringBoot中使用Activiti
文章轉(zhuǎn)載:http://jinyejixie.com/article28/ipicjp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設、小程序開發(fā)、網(wǎng)站建設、微信公眾號、App開發(fā)、移動網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)