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用於內存存儲。

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/pom.xml#L45

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

我們建議使用我們的BOM(物料清單)

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/pom.xml#L30

<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);
  ...
}

例如,您可以通過執行以下操作來創建任務:

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/src/main/java/org/activiti/examples/DemoApplication.java#L45

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”示例以查看根本不需要此實用程序類的更多真實場景。

從示例中突出顯示的最后一件事是任務事件監聽器的注冊:

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/src/main/java/org/activiti/examples/DemoApplication.java#L89

@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:

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-process-example/src/main/java/org/activiti/examples/DemoApplication.java#L32

@Autowired
private ProcessRuntime processRuntime;
​
@Autowired
private SecurityUtil securityUtil;

與以前一樣,我們需要SecurityUtil幫助器來代表我們與API交互的用戶進行定義。

現在我們可以開始與ProcessRuntime進行交互:

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-process-example/src/main/java/org/activiti/examples/DemoApplication.java#L47

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功能每秒啟動一個進程,從數組中獲取隨機值來處理:

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-process-example/src/main/java/org/activiti/examples/DemoApplication.java#L67

@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屬性中獲取的:

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-process-example/src/main/resources/processes/categorize-content.bpmn20.xml#L22

<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秒創建一個新的流程實例,模擬用戶檢查是否有可用的任務。

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-full-example/src/main/java/org/activiti/examples/DemoApplication.java#L63

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-full-example/src/main/java/org/activiti/examples/DemoApplication.java#L85

UserTask創建給一組潛在的用戶,在本例中為“activitiTeam”組。但在這種情況下,我們不會像第一個示例那樣手動創建任務。每次啟動進程時,流程實例都會為我們創建任務。

https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-full-example/src/main/resources/processes/categorize-human-content.bpmn20.xml#L38

<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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM