Contents

Activiti Kickstart 应用程序简介

1. 概述

在我们之前的文章(基于JavaSpring 的 Activiti API) 中,我们看到了如何以编程方式管理进程。如果我们想设置一个演示,连同 Activiti 的 UI,我们有两个 web 应用程序可以让我们在几分钟内完成。

activiti-app提供了一个用户界面,用户可以通过它执行任何身份管理和任务管理相关的操作,创建用户和组。

类似地,activiti-rest是一个 webapp,它提供 REST API 用于对进程、任务、进程等执行任何操作。 在本文中,我们将研究如何使用这些 web 应用程序,以及它们提供的功能。

2. 下载

我们可以从Activiti 网站 本身下载两个 webapp 的war文件。

对于 v6.0.0,我们只需下载activiti-6.0.0.zip并解压,war文件可以在activiti-6.0.0/wars目录中找到。

3. 激活 Kickstart 应用程序

我们需要一个有效的Java 运行时 和一个Apache Tomcat 安装来部署应用程序。任何 Web 容器都可以工作,但 Activiti 主要在 Tomcat 上进行测试。

现在,我们只需要在 Tomcat 上部署战争并使用http://localhost:8080/activiti-app访问它。

主页应如下所示:

/uploads/activiti_kickstart_and_rest_apps/1.png

3.1. 数据库

默认情况下,它使用 H2 内存数据库。如果我们想更改数据库配置,我们可以查看代码 并修改activiti-app.properties 文件。

完成此操作后,我们需要重新生成 war 文件,这可以通过运行start.sh 脚本来完成。这将构建activiti-app以及所需的依赖项。

3.2. 启动应用程序

当我们单击 Kickstart 应用程序时,我们会获得使用Process的选项。我们可以创建/导入进程并从这里运行它们。

让我们创建一个小进程,它有一个User Task,它接收来自用户的消息。进入 Kickstart 应用程序后,要创建流程,请选择Process选项卡,然后单击Create Process

/uploads/activiti_kickstart_and_rest_apps/3.png

流程编辑器将打开,我们可以在其中拖放开始事件、各种类型的任务和结束事件的各种符号来定义Process

当我们将User Task添加到我们的流程中时,我们需要将其分配给某人。我们可以通过单击此任务选项中的分配并选择Assignee来完成。

为简单起见,让我们将任务分配给流程发起者:

/uploads/activiti_kickstart_and_rest_apps/5.png

我们还希望此User Task从用户那里获得输入消息。为此,我们需要将带有单个文本字段的Form与此任务相关联。

选择User Task并选择Referenced Form。目前,没有与任务关联的Form,因此单击New Form,并添加所需的详细信息:

/uploads/activiti_kickstart_and_rest_apps/7.jpg

在此之后,它将带我们到Form部分,我们可以在表单中拖放我们想要的各种字段,并为它们设置标签:

/uploads/activiti_kickstart_and_rest_apps/9.jpg

请注意,我们勾选了Required,这意味着如果不输入*Message *,*User *任务将无法完成。

完成后,我们将保存它并转到“*Apps *”选项卡。为了能够运行我们创建的流程,我们需要创建一个 Process App。

在 Process App 中,我们可以添加一个或多个Process Definitions。完成此操作后,我们需要发布此应用程序,以便其他用户可以使用*Process *:

/uploads/activiti_kickstart_and_rest_apps/11.png

3.3. 任务应用

在任务应用程序中,有两个选项卡:*Tasks *——用于当前运行的任务,*Processes ——用于当前运行的Processes *。

单击“*Processes *”选项卡中的“*Start Process ”后,我们将获得可以运行的可用进程列表。从这个列表中,我们将选择我们的进程并单击start *按钮:

/uploads/activiti_kickstart_and_rest_apps/13.png

我们的流程只包含一个任务,它是一个User Task。因此,该进程正在等待用户完成此任务。当我们点击进程正在等待的任务时,我们可以看到我们创建的表单:

/uploads/activiti_kickstart_and_rest_apps/15.jpg

如果我们点击Show Diagram,它不仅会显示Process 图,还会突出显示已完成的任务和待处理的任务。在我们的例子中,User Task仍处于未决状态,突出显示:

/uploads/activiti_kickstart_and_rest_apps/17.png

要完成这个任务,我们可以点击Complete 按钮。如前所述,我们需要输入Message,因为我们保持它是强制性的。因此,输入Message后,我们就可以Complete任务了。

3.4. 身份管理应用

除了管理流程外,我们还有一个身份管理应用程序,它允许我们添加用户和组。我们还可以为用户定义角色。

4. Activiti REST

Activiti 为 Activiti Engine 提供了一个 REST API,可以通过将activiti-rest.war文件部署到像 Apache Tomcat 这样的 servlet 容器来安装它。

默认情况下,Activiti Engine 将连接到内存中的 H2 数据库。就像我们在activiti-app中看到的那样,在这里我们可以更改WEB-INF/classes文件夹中db.properties文件中的数据库设置并重新创建 war 文件。

随着应用程序启动并运行,我们可以将这个基本 URL 用于所有请求:

http://localhost:8080/activiti-rest/service/

默认情况下,所有 REST 资源都需要一个有效的 Activiti 用户进行身份验证。每个 REST 调用都应使用基本 HTTP 访问身份验证。

4.1.创建和运行进程

要创建流程,首先,我们需要流程的 BPMN 文件。我们可以创建文件,如我们之前基于Activiti with Java 的文章中所述,也可以从 Kickstart App 的 Process 部分下载。

我们需要发出一个 POST 请求以及contentType: multipart/form-data,我们将在其中为我们的新流程上传 BPMN 文件:

POST repository/deployments

当我们通过为我们创建的流程传递 BPMN 文件来进行此调用时,它将给出以下输出:

{    
    "id": "40",
    "name": "user_msg.bpmn20.xml",
    "deploymentTime": "2017-10-04T17:28:07.963+05:30",
    "category": null,
    "url": "http://localhost:8080/activiti-rest/service/repository/deployments/40",
    "tenantId": ""
}

现在,如果我们获得所有流程定义,我们可以看到我们列出的流程定义:

GET repository/process-definitions

接下来,我们可以使用我们在 BPMN 文件中提到的processKey运行此流程:

POST /runtime/process-instances

使用此请求正文:

{
    "processDefinitionKey":"user_msg"
}

响应将是:

{
    "id": "44",
    "url": "http://localhost:8080/activiti-rest/service/runtime/process-instances/44",
    "businessKey": null,
    "suspended": false,
    "ended": false,
    "processDefinitionId": "user_msg:1:43",
    "processDefinitionUrl": "http://localhost:8080/activiti-rest/service/repository/process-definitions/user_msg:1:43",
    "processDefinitionKey": "user_msg",
    //other details...
}

我们可以使用上一个响应返回的流程实例的id来查看我们正在运行的流程的图表:

GET runtime/process-instances/44/diagram

如前所述,该过程正在等待用户任务完成,因此在图中突出显示:

/uploads/activiti_kickstart_and_rest_apps/19.png

4.2. 完成任务

现在让我们看看我们的待处理任务:

GET runtime/tasks

响应将包含待处理任务的列表。目前,只有一项任务——我们的用户任务

{
    "data": [
        {
            "id": "49",
            "url": "http://localhost:8080/activiti-rest/service/runtime/tasks/49",
            "owner": null,
            "assignee": "$INITIATOR",
            "delegationState": null,
            "name": "User Input Message",
            "description": "User Task to take user input",
            "createTime": "2017-10-04T17:33:07.205+05:30",
            "dueDate": null,
            // other details...
        }
}

最后,让我们使用任务id 49完成这个任务:

POST runtime/tasks/49

这是一个 POST 请求,我们需要发送指示我们想要对任务执行什么操作的*action *字段。我们可以“解决”、“完成”或“删除”一项任务。此外,我们可以传递任务所需的变量数组来完成。

在我们的例子中,我们必须传递一个字段“消息”,它是用户消息文本字段。所以我们的请求正文是:

{
    "action": "complete",
     "variables": [{
         "name": "message",
         "value": "This is a User Input Message"
     }]
}