1. 程式人生 > >Activiti 工作流入門指南

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方法中執行。