如何使用Spring Boot示例实现Activiti REST API

@高效码农  May 27, 2019

I. Activiti REST API概述

Activiti Engine包含一个REST API,可以通过以下方式使用:

  • 将activiti-rest.war文件部署到servlet容器,
  • 或者包括servlet及其在应用程序中的映射,并将所有的activiti-rest依赖项添加到类路径中。

默认情况下,Activiti Engine将连接到内存中的H2数据库,因此使用Spring Boot,我们只需要添加依赖项,如下所示:

    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
    </dependency>
 
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-spring-boot-starter-basic</artifactId>
      <version>5.22.0</version>
    </dependency>
 
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>spring-boot-starter-rest-api</artifactId>
      <version>5.17.0</version>
    </dependency>

Activiti REST API支持:

  • 部署:获取/创建/删除部署,获取部署中的资源。

流程定义:获取流程定义的一个或列表,获取流程定义的资源内容或BPMN模型,激活/暂停,获取/添加/删除候选启动器。
模型:获取/更新/创建/删除模型,获取/设置模型的编辑器源。
流程实例:获取/删除/激活/暂停流程实例,添加/删除用户,获取/创建/更新变量。
执行:获取执行,执行操作或获取活动活动,查询,获取/创建/更新变量。
任务:获取/更新/删除任务,查询任务,获取/创建/更新变量,获取/创建/删除身份链接,获取事件,获取/创建/删除附件。
历史记录:get / delete / query for Historic Process Instances,Task Instances,Activities Instances,Variables Intances。
用户和组:获取/创建/更新/删除信息。
数据库表,引擎,运行时,作业 ......
有关更多详细信息,请访问:Activiti用户指南 - REST API

在示例中,我们将测试其中一些以查看其工作原理。

II。实践

1.技术

  • Java 1.8
  • Maven 3.3.9
  • Spring Tool Suite - 版本3.8.4.RELEASE
  • Spring Boot:1.5.3.RELEASE

2.一步一步
2.1创建Spring Boot项目
使用Spring Tool Suite / Eclipse创建Project并将依赖项添加到pom.xml文件:

   <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
    </dependency>
 
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-spring-boot-starter-basic</artifactId>
      <version>5.22.0</version>
    </dependency>
 
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>spring-boot-starter-rest-api</artifactId>
      <version>5.17.0</version>
    </dependency>

2.2定义过程
在src / main / resources下,创建processes文件夹并添加simple-process.bpmn20.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
  xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples">
 
  <process id="simpleProcess" name="Simple Process">
    <startEvent id="theStart" />
    <sequenceFlow sourceRef="theStart" targetRef="theTask" />
 
    <userTask id="theTask" name="Task" activiti:assignee="${person}">
      <documentation>
        Do the task.
      </documentation>
    </userTask>
 
    <sequenceFlow sourceRef="theTask" targetRef="theEnd" />
    <endEvent id="theEnd" />
  </process>
 
</definitions>
我们使用${person}expression和activiti:assignee属性来分配任务。

2.3初始化用户
默认情况下,所有Activiti REST资源都需要对有效用户进行身份验证。所以我们应该创建一个管理员用户。打开Application类,添加Bean以初始化User:

package com.javasampleapproach.restactiviti;
 
import org.activiti.engine.IdentityService;
import org.activiti.engine.identity.User;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
 
@SpringBootApplication
public class SpringRestActivitiApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(SpringRestActivitiApplication.class, args);
  }
 
  @Bean
  InitializingBean usersAndGroupsInitializer(final IdentityService identityService) {
 
    return new InitializingBean() {
      public void afterPropertiesSet() throws Exception {
 
        User admin = identityService.newUser("admin");
        admin.setPassword("admin");
        identityService.saveUser(admin);
 
      }
    };
  }
}

使用基本HTTP访问身份验证,因此我们始终在请求URL中包含授权用户名和密码。

有关Activiti服务的更多信息,请参见:Activiti简介 - 一个Java BPM引擎

2.4运行并检查结果

  • Config maven build:
clean install
  • 使用Spring Boot App模式运行项目
  • 检查结果:

部署清单:

curl -u admin:admin http://localhost:8080/repository/deployments
{
   "data": [
      {
         "id": "1",
         "name": "SpringAutoDeployment",
         "deploymentTime": "2017-05-15T20:08:26.859+07:00",
         "category": null,
         "url": "http://localhost:8080/repository/deployments/1",
         "tenantId": ""
      }
   ],
   "total": 1,
   "start": 0,
   "sort": "id",
   "order": "asc",
   "size": 1
}

列出部署中的资源:

curl -u admin:admin http://localhost:8080/repository/deployments/1/resources
[
   {
      "id": "E:\\STS\\WorkPlace\\SpringRestActiviti\\target\\classes\\processes\\simple-process.bpmn20.xml",
      "url": "http://localhost:8080/repository/deployments/1/resources/E:\\STS\\WorkPlace\\SpringRestActiviti\\target\\classes\\processes\\simple-process.bpmn20.xml",
      "contentUrl": "http://localhost:8080/repository/deployments/1/resourcedata/E:\\STS\\WorkPlace\\SpringRestActiviti\\target\\classes\\processes\\simple-process.bpmn20.xml",
      "mediaType": "text/xml",
      "type": "processDefinition"
   }
]

流程定义列表:

curl -u admin:admin http://localhost:8080/repository/process-definitions
{
   "data": [
      {
         "id": "simpleProcess:1:3",
         "url": "http://localhost:8080/repository/process-definitions/simpleProcess:1:3",
         "key": "simpleProcess",
         "version": 1,
         "name": "Simple Process",
         "description": null,
         "tenantId": "",
         "deploymentId": "1",
         "deploymentUrl": "http://localhost:8080/repository/deployments/1",
         "resource": "http://localhost:8080/repository/deployments/1/resources/E:\\STS\\WorkPlace\\SpringRestActiviti\\target\\classes\\processes\\simple-process.bpmn20.xml",
         "diagramResource": null,
         "category": "Examples",
         "graphicalNotationDefined": false,
         "suspended": false,
         "startFormDefined": false
      }
   ],
   "total": 1,
   "start": 0,
   "sort": "name",
   "order": "asc",
   "size": 1
}

获取BPMN模型(通过processId):

curl -u admin:admin http://localhost:8080/repository/process-definitions/simpleProcess:1:3/model
{
   "definitionsAttributes": {},
   "processes": [
      {
         "id": "simpleProcess",
         "xmlRowNumber": 5,
         "xmlColumnNumber": 52,
         "extensionElements": {},
         "attributes": {},
         "name": "Simple Process",
         "executable": true,
         "documentation": null,
         "ioSpecification": null,
         "executionListeners": [],
         "lanes": [],
         "dataObjects": [],
         "candidateStarterUsers": [],
         "candidateStarterGroups": [],
         "eventListeners": [],
         "flowElements": [
            {
               "id": "theStart",
               "xmlRowNumber": 6,
               "xmlColumnNumber": 31,
               ...
               "outgoingFlows": [
                  {
                     "id": null,
                     "xmlRowNumber": 7,
                     "xmlColumnNumber": 60,
                     ...
                     "sourceRef": "theStart",
                     "targetRef": "theTask",
                  }
               ],
               "eventDefinitions": [],
               "initiator": null,
               "formKey": null,
               "formProperties": []
            },
            {
               "id": null,
               "xmlRowNumber": 7,
               "xmlColumnNumber": 60,
               ...
               "sourceRef": "theStart",
               "targetRef": "theTask",
            },
            {
               "id": "theTask",
               "xmlRowNumber": 9,
               "xmlColumnNumber": 68,
               ...
               "name": "Task",
               "documentation": "Do the task.",
               "incomingFlows": [
                  {
                     "id": null,
                     "xmlRowNumber": 7,
                     "xmlColumnNumber": 60,
                     ...
                     "sourceRef": "theStart",
                     "targetRef": "theTask",
                  }
               ],
               "outgoingFlows": [
                  {
                     "id": null,
                     "xmlRowNumber": 15,
                     "xmlColumnNumber": 58,
                     ...
                     "sourceRef": "theTask",
                     "targetRef": "theEnd",
                  }
               ],
               ...
               "assignee": "${person}",
            },
            {
               "id": null,
               "xmlRowNumber": 15,
               "xmlColumnNumber": 58,
               ...
               "sourceRef": "theTask",
               "targetRef": "theEnd",
            },
            {
               "id": "theEnd",
               "xmlRowNumber": 16,
               "xmlColumnNumber": 27,
               ...
               "incomingFlows": [
                  {
                     "id": null,
                     "xmlRowNumber": 15,
                     "xmlColumnNumber": 58,
                     ...
                     "sourceRef": "theTask",
                     "targetRef": "theEnd",
                  }
               ],
               "outgoingFlows": [],
               "eventDefinitions": []
            }
         ],
         "artifacts": []
      }
   ],
   ...
   "resources": [],
   "targetNamespace": "Examples",
   "mainProcess": {
      ...
      ],
      "artifacts": []
   },
   "itemDefinitions": {},
   "namespaces": {
      "activiti": "http://activiti.org/bpmn"
   }
}

开始流程:

curl -u admin:admin -H "Content-Type: application/json" -d '{"processDefinitionKey":"simpleProcess", "variables": [ {"name":"person", "value":"John"}]}' http://localhost:8080/runtime/process-instances

我们还发送了变量信息{“person”:“John”}。此请求返回流程实例:

{
   "id": "4",
   "url": "http://localhost:8080/runtime/process-instances/4",
   "businessKey": null,
   "suspended": false,
   "ended": false,
   "processDefinitionId": "simpleProcess:1:3",
   "processDefinitionUrl": "http://localhost:8080/repository/process-definitions/simpleProcess:1:3",
   "activityId": "theTask",
   "variables": [],
   "tenantId": "",
   "completed": false
}

按流程实例ID列出的变量

curl -u admin:admin http://localhost:8080/runtime/process-instances/4/variables
[
   {
      "name": "person",
      "type": "string",
      "value": "John",
      "scope": "local"
   }
]

任务清单:

curl -u admin:admin http://localhost:8080/runtime/tasks
{
   "data": [
      {
         "id": "9",
         "url": "http://localhost:8080/runtime/tasks/9",
         "owner": null,
         "assignee": "John",
         "delegationState": null,
         "name": "Task",
         "description": "Do the task.",
         "createTime": "2017-05-15T20:28:22.667+07:00",
         "dueDate": null,
         "priority": 50,
         "suspended": false,
         "taskDefinitionKey": "theTask",
         "tenantId": "",
         "category": null,
         "formKey": null,
         "parentTaskId": null,
         "parentTaskUrl": null,
         "executionId": "4",
         "executionUrl": "http://localhost:8080/runtime/executions/4",
         "processInstanceId": "4",
         "processInstanceUrl": "http://localhost:8080/runtime/process-instances/4",
         "processDefinitionId": "simpleProcess:1:3",
         "processDefinitionUrl": "http://localhost:8080/repository/process-definitions/simpleProcess:1:3",
         "variables": []
      }
   ],
   "total": 1,
   "start": 0,
   "sort": "id",
   "order": "asc",
   "size": 1
}

将变量添加到任务(通过Id):

curl -u admin:admin -H "Content-Type: application/json" -d '[{"name" : "newTaskVariable", "scope" : "local", "type" : "string", "value" : "This is variable Value"}]' http://localhost:8080/runtime/tasks/9/variables
[
   {
      "name": "newTaskVariable",
      "type": "string",
      "value": "This is variable Value",
      "scope": "local"
   }
]

身份链接(由Id):

curl -u admin:admin http://localhost:8080/runtime/tasks/9/identitylinks
[
   {
      "url": "http://localhost:8080/runtime/tasks/9/identitylinks/users/John/assignee",
      "user": "John",
      "group": null,
      "type": "assignee"
   }
]

完成任务(由Id):

curl -u admin:admin -H "Content-Type: application/json" -d '{"action" : "complete"}' http://localhost:8080/runtime/tasks/9

历史流程实例:

curl -u admin:admin http://localhost:8080/history/historic-process-instances/4
{
   "id": "4",
   "url": "http://localhost:8080/history/historic-process-instances/4",
   "businessKey": null,
   "processDefinitionId": "simpleProcess:1:3",
   "processDefinitionUrl": "http://localhost:8080/repository/process-definitions/simpleProcess:1:3",
   "startTime": "2017-05-15T20:40:34.504+07:00",
   "endTime": "2017-05-15T20:44:51.036+07:00",
   "durationInMillis": 256532,
   "startUserId": "admin",
   "startActivityId": "theStart",
   "endActivityId": "theEnd",
   "deleteReason": null,
   "superProcessInstanceId": null,
   "variables": [],
   "tenantId": ""
}

III。源代码

SpringRestActiviti.zip



添加新评论