Bootstrap

Activiti7工作流

前言

由于工作原因,最近一段时间都在研究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还有很多功能没有提及到,有兴趣的朋友可以共同交流。以后会继续更新有关工作流的博客,

;