前言
由于工作原因,最近一段时间都在研究activiti7。鉴于Activiti7的资料甚少,官网上的介绍又比较复杂,通过看Activiti的论坛以及参考了Activiti之前版本的api,项目大概有了模型。目前虽小有成果,但仍有许多不足之处,在此先拿出来跟大家分享。
工作流理论
工作流是针对工作中具有固定程序的常规活动而提出的一个概念。通过将工作活动分解成定义良好的任务、角色、规则和过程来进行执行和监控,达到提高生产组织水平和工作效率的目的。工作流其主要的工作原理是按照定义好的一个工作流程,按照这个流程进行工作流程的扭转;在流转的过程中实现数据的填充和处理。使用步骤主要是定义流程图、发布流程图、与定义的业务进行工作绑定、触发流程进行操作。
Activiti7与Activiti5和6的区别
Activiti7与Activiti5和Acticiti6有了很大的改变,宏观来说,Activiti7集成了docker、microservices、kubernetes、activiti cloud、activiti cloud、cloud native、spring boot 2.0。使用方面,它与之前两个版本少了IdentityService和FormService接口。(少的FormService接口的解决方案在下面文章会给出,而少了IdentityService接口仍未找到解决方案,有知道的话可在评论给出)
配置Activiti7
完整的pom文件
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>xxxxx</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>xxxx</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<!-- <version>6.0.0</version> -->
<version>7.1.8</version>
</dependency>
<!-- Activiti 在线设计 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>5.22.0</version>
<exclusions>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-tx</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-security-config</artifactId>
<groupId>org.springframework.security</groupId>
</exclusion>
<exclusion>
<artifactId>spring-security-core</artifactId>
<groupId>org.springframework.security</groupId>
</exclusion>
<exclusion>
<artifactId>spring-security-crypto</artifactId>
<groupId>org.springframework.security</groupId>
</exclusion>
<exclusion>
<artifactId>spring-security-web</artifactId>
<groupId>org.springframework.security</groupId>
</exclusion>
<exclusion>
<artifactId>spring-webmvc</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>activation</artifactId>
<groupId>javax.activation</groupId>
</exclusion>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>xmlgraphics-commons</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<!--<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering>
</resource> </resources> -->
<!-- 将resource中的文件打包进去 -->
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-xmls</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src/main/resource</directory>
<includes>
<include>**</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>alfresco</id>
<name>Activiti Releases</name>
<url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</project>
在这里解释一下上面的pom文件。
activiti-engine是Acticiti的核心包。
activiti-modeler是网页流程设计器的包,这里用的是5.22.0版本的(至于为什么不用Activiti7的,本人觉得Acticiti7目前没有自带的网页流程设计器,它是集成第三方的设计器,在页面设计上没有5.22.0美观)。
repositories这里引入了Acticiti的仓库,因为Maven是没有7.1.8的,它只有7-201802-EA版本。在使用期间,7-201802-EA版本出现了taskCandidateOrAssigned只要有流程,所有人都获取到该流程信息的bug,于是在这里建议使用7.1.8版本。
Activiti配置文件
package com.manong.smzypt.activiti.config;
import javax.sql.DataSource;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 使用Java类完成配置文件
*/
@Configuration
public class ActivitiConfig {
@Autowired
private DataSource dataSource;
/**
* 初始化配置,将创建28张表
* @return
*/
@Bean
public StandaloneProcessEngineConfiguration processEngineConfiguration() {
StandaloneProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
configuration.setDataSource(dataSource);
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
configuration.setAsyncExecutorActivate(false);
return configuration;
}
@Bean
public ProcessEngine processEngine() {
return processEngineConfiguration().buildProcessEngine();
}
@Bean
public RepositoryService repositoryService() {
return processEngine().getRepositoryService();
}
@Bean
public RuntimeService runtimeService() {
return processEngine().getRuntimeService();
}
@Bean
public TaskService taskService() {
return processEngine().getTaskService();
}
@Bean
public HistoryService historyService() throws Exception{
return processEngine().getHistoryService();
}
}
整合5.22.0网页流程设计器
网上有很多整合的资料,在这里简单提一下。
从网上下载5.22.0的包,将包中以下内容拖到项目相对应的位置
Activiti7结合动态表单
在Avtiviti5和6中,有核心接口之一的FormService,结合表单可以使用:
StartFormData startFormData = formService.getStartFormData(processDefinitionId);
List<FormProperty> formProperties = startFormData.getFormProperties();
但在Acticiti7中,由于没有了FormService接口,可用以下方法代替:
UserTask userTask =(UserTask)repositoryService.getBpmnModel(task.getProcessDefinitionId()).getFlowElement(task.getTaskDefinitionKey());
List<FormProperty> formProperties = userTask.getFormProperties();
结束语
Activiti7还有很多功能没有提及到,有兴趣的朋友可以共同交流。以后会继续更新有关工作流的博客,