概覽
如我們的介紹部分所述,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方法中執行。
原文地址:https://blog.csdn.net/tanjie_123/article/details/82598157