如何使用Spring Boot示例实现Activiti REST API
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": ""
}