Activiti 工作流入門指南
概覽
如我們的介紹部分所述,Activiti目前分為兩大類:
如果你想上手Activiti的核心是否遵循了新的執行時API的入門指南:Activiti Core
如果你想基於Kuberantes構建Activiti,你可以參考Activiti Cloud HELM Charts:Activiti Cloud
Activiti Core入門
Activiti Core Runtime API入門
建立新API的目的明確,以滿足以下要求:
-
為我們的雲方法提供明確的途徑
-
隔離內部和外部API以提供向後相容性
-
遵循單一責任方法,提供模組化的未來之路
-
減少以前版本的API的混亂
-
將安全和身份管理作為一等公民
-
減少您希望依賴流行框架提供的約定的常見用例的價值時間
-
提供底層服務的替代實現
-
使社群能夠在尊重既定合同的同時進行創新
我們尚未棄用舊API,因此您仍然可以自由使用它,但我們強烈建議您使用新API以獲得長期支援。
我們尚未棄用舊API,因此您仍然可以自由使用它,但我們強烈建議您使用新API以獲得長期支援。
是時候通過幾個示例專案弄清楚了 。
TaskRuntime API
如果要構建業務應用程式,則可以為組織中的使用者和組建立任務。
TaskRuntime API可以幫助您。
您可以從GitHub克隆這個例子:https://github.com/Activiti/activiti-examples
本節中的程式碼可以在“activiti-api-basic-task-example”maven模組中找到。
如果您在Spring Boot 2應用程式中執行,則只需新增activiti-spring-boot-starter依賴項和DB驅動程式,您可以將H2用於記憶體儲存。
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>
我們建議使用我們的BOM(物料清單)
<dependencyManagement> <dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-dependencies</artifactId> <version>7.0.0.Beta1</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
現在讓我們切換到我們的DemoApplication.class : https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/src/main/java/org/activiti/examples/DemoApplication.java#L25
現在讓我們切換到我們的DemoApplication.class
@Autowired private TaskRuntime taskRuntime;
將bean注入應用程式後,您應該能夠建立任務並與任務互動。
public interface TaskRuntime { TaskRuntimeConfiguration configuration(); Task task(String taskId); Page tasks(Pageable pageable); Page tasks(Pageable pageable, GetTasksPayload payload); Task create(CreateTaskPayload payload); Task claim(ClaimTaskPayload payload); Task release(ReleaseTaskPayload payload); Task complete(CompleteTaskPayload payload); Task update(UpdateTaskPayload payload); Task delete(DeleteTaskPayload payload); ... }
例如,您可以通過執行以下操作來建立任務:
taskRuntime.create( TaskPayloadBuilder.create() .withName("First Team Task") .withDescription("This is something really important") .withGroup("activitiTeam") .withPriority(10) .build());
只有屬於activitiTeam的使用者和所有者(當前登入的使用者)才能看到此任務。
您可能已經注意到,您可以使用TaskPayloadBuilder以流暢的方式引數化將要傳送到TaskRuntime的資訊。
為了處理安全性,角色和組,我們依賴於Spring Security模組。因為我們在Spring Boot應用程式中,所以我們可以使用UserDetailsService來配置可用使用者及其各自的組和角色。我們目前在@Configuration類中執行此操作:https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/src/main/java/org/activiti/examples /DemoApplicationConfiguration.java#L26
需要注意的一點是,為了與使用者互動TaskRuntime API,您需要具有以下角色:ACTIVITI_USER(授權機構:ROLE_ACTIVITI_USER)。
雖然與REST端點互動授權機制將建立在當前登入的使用者,但對於例如起見,我們使用的是實用類(https://github.com/Activiti/activiti-examples/blob/master/activiti -api-basic-task-example / src / main / java / org / activiti / examples / SecurityUtil.java#L26)允許我們在上下文中設定手動選擇的使用者。請注意,除非您正在嘗試並且想要在不通過REST端點的情況下更改使用者,否則不應該這樣做。檢視“web”示例以檢視根本不需要此實用程式類的更多真實場景。
從示例中突出顯示的最後一件事是任務事件監聽器的註冊:
@Bean public TaskRuntimeEventListener taskAssignedListener() { return taskAssigned -> logger.info( ">>> Task Assigned: '" + taskAssigned.getEntity().getName() +"' We can send a notification to the assignee: " + taskAssigned.getEntity().getAssignee()); }
您可以根據需要註冊任意數量的TaskRuntimeEventListeners。這將使您的應用程式能夠通過服務觸發的執行時事件得到通知。
ProcessRuntime API
以類似的方式,如果要開始使用ProcessRuntime API,則需要包含與以前相同的依賴項。我們的目標是在未來提供更多的靈活性和單獨的執行時,但是現在相同的Spring Boot Starter提供了TaskRuntime和ProcessRuntime API。
本節中的程式碼可以在“activiti-api-basic-process-example”maven模組中找到。
public interface ProcessRuntime { ProcessRuntimeConfiguration configuration(); ProcessDefinition processDefinition(String processDefinitionId); Page processDefinitions(Pageable pageable); Page processDefinitions(Pageable pageable, GetProcessDefinitionsPayload payload); ProcessInstance start(StartProcessPayload payload); Page processInstances(Pageable pageable); Page processInstances(Pageable pageable, GetProcessInstancesPayload payload); ProcessInstance processInstance(String processInstanceId); ProcessInstance suspend(SuspendProcessPayload payload); ProcessInstance resume(ResumeProcessPayload payload); ProcessInstance delete(DeleteProcessPayload payload); void signal(SignalPayload payload); ... }
與TaskRuntime API類似,為了與ProcessRuntime API互動,當前登入的使用者需要具有角色“ACTIVITI_USER”。
首先,讓我們自動裝配我們的ProcessRuntime:
@Autowired private ProcessRuntime processRuntime; @Autowired private SecurityUtil securityUtil;
與以前一樣,我們需要SecurityUtil幫助器來代表我們與API互動的使用者進行定義。
現在我們可以開始與ProcessRuntime進行互動:
Page processDefinitionPage = processRuntime .processDefinitions(Pageable.of(0, 10)); logger.info("> Available Process definitions: " + processDefinitionPage.getTotalItems()); for (ProcessDefinition pd : processDefinitionPage.getContent()) { logger.info("\t > Process definition: " + pd); }
流程定義需要放在/ src / main / resources / processes /中。對於此示例,我們定義了以下過程:
我們使用Spring Scheduling功能每秒啟動一個程序,從陣列中獲取隨機值來處理:
@Scheduled(initialDelay = 1000, fixedDelay = 1000) public void processText() { securityUtil.logInAs("system"); String content = pickRandomString(); SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yy HH:mm:ss"); logger.info("> Processing content: " + content + " at " + formatter.format(new Date())); ProcessInstance processInstance = processRuntime .start(ProcessPayloadBuilder .start() .withProcessDefinitionKey("categorizeProcess") .withProcessInstanceName("Processing Content: " + content) .withVariable("content", content) .build()); logger.info(">>> Created Process Instance: " + processInstance); }
這些聯結器使用Bean名稱自動連線到ProcessRuntime,在此示例中為“processTextConnector”。這個bean名稱是從我們的流程定義中的serviceTask元素的implementation屬性中獲取的:
<bpmn:serviceTask id="Task_1ylvdew" name="Process Content" implementation="processTextConnector">
這個新的Connector介面是JavaDelegates的自然演變,新版本的Activiti Core將嘗試通過將它們包裝在Connector實現中來重用JavaDelagates:
public interface Connector { IntegrationContext execute(IntegrationContext integrationContext); }
聯結器接收帶有過程變數的IntegrationContext,並返回一個修改後的IntegrationContext,其結果需要映射回過程變數。
在前面的示例中,聯結器實現正在接收“content”變數並基於內容處理邏輯新增“approved”變數。
在這些聯結器中,您可能包括系統到系統呼叫,例如REST呼叫和基於訊息的互動。這些互動往往變得越來越複雜,因此我們將在未來的教程中看到如何從ProcessRuntime(雲聯結器)的上下文之外的執行中提取這些聯結器,從而將這些外部互動的責任分離出去。 ProcessRuntime範圍。
檢查maven模組activiti-api-spring-integration-example以獲得更高階的示例,使用Spring Integrations基於File輪詢器來啟動程序。
完整的例子
您可以使用ProcessRuntime和TaskRuntime API找到一個示例來自動執行以下過程:
本節中的程式碼可以在“activiti-api-basic-full-example”maven模組中找到。
僅作為ProcessRuntime示例,這也是對某些輸入內容進行分類,但在這種情況下,該程序依賴於Human Actor來決定是否批准內容。我們像以前一樣有一個計劃任務,每5秒建立一個新的流程例項,模擬使用者檢查是否有可用的任務。
和
UserTask建立給一組潛在的使用者,在本例中為“activitiTeam”組。但在這種情況下,我們不會像第一個示例那樣手動建立任務。每次啟動程序時,流程例項都會為我們建立任務。
<bpmn:userTask id="Task_1ylvdew" name="Process Content"> <bpmn:incoming>SequenceFlow_09xowo4</bpmn:incoming> <bpmn:outgoing>SequenceFlow_1jzbgkj</bpmn:outgoing> <bpmn:potentialOwner> <bpmn:resourceAssignmentExpression> <bpmn:formalExpression>activitiTeam</bpmn:formalExpression> </bpmn:resourceAssignmentExpression> </bpmn:potentialOwner> </bpmn:userTask>
屬於該組的使用者將能夠宣告並處理該任務。
我們建議您執行這些示例並進行實驗,如果您有疑問或發現問題,請與我們聯絡。
概要
在這篇博文中,我們已經瞭解瞭如何開始使用新的Activiti Core Beta1專案中的新ProcessRuntime和TaskRuntime API。
我們建議您檢查Activiti的例子庫,為更多的例子:https://github.com/Activiti/activiti-examples
幫助我們編寫更多這些示例可能是一個非常好的初始社群貢獻。如果您有興趣,請聯絡我們,我們非常樂意為您提供指導。
如果您對這些示例和教程有疑問或反饋,請隨時通過Gitter與我們聯絡:https://gitter.im/Activiti/Activiti7 ? utm_source = share-link & utm_medium = link & utm_campaign = share-link 。
更多部落格文章將介紹Runtime Admin API以及如何調整這些示例以在我們的新Activiti Cloud方法中執行。