工作流引擎Activiti入门-01

工作流引擎

工作流

是指业务过程的部分或整体在计算机应用环境下的自动化。
工作流主要解决的主要问题是:
为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。

BPM

BPM(Business Process Management),即业务流程管理,
是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法。

BPMN

BPMN(Business Process Modeling Notation)即业务流程建模与标注,
BPMN是BPM的建模语言标准之一,
目的是提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。

Activiti

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。

集成Activiti

环境:
JDK版本:1.8。
MySQL版本:8.0.27。

新建数据库

Activiti需要数据库支持
在这里插入图片描述

新建项目

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.duohoob</groupId>
	<artifactId>activity</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>activity</name>
	<description>Demo project for Spring Boot and Activiti</description>
	<properties>
		<java.version>1.8</java.version>
	    <slf4j.version>1.6.6</slf4j.version>
	    <log4j.version>1.2.12</log4j.version>
	    <activiti.version>7.0.0.Beta1</activiti.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
	    <!--activiti核心包-->
	    <dependency>
	        <groupId>org.activiti</groupId>
	        <artifactId>activiti-engine</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--activiti与spring整合的包-->
	    <dependency>
	        <groupId>org.activiti</groupId>
	        <artifactId>activiti-spring</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--bpmn模型处理-->
	    <dependency>
	        <groupId>org.activiti</groupId>
	        <artifactId>activiti-bpmn-model</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--bpmn转换-->
	    <dependency>
	        <groupId>org.activiti</groupId>
	        <artifactId>activiti-bpmn-converter</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--bpmn json数据转换-->
	    <dependency>
	        <groupId>org.activiti</groupId>
	        <artifactId>activiti-json-converter</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--bpmn布局-->
	    <dependency>
	        <groupId>org.activiti</groupId>
	        <artifactId>activiti-bpmn-layout</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--bpmn云支持-->
	    <dependency>
	        <groupId>org.activiti.cloud</groupId>
	        <artifactId>activiti-cloud-services-api</artifactId>
	        <version>${activiti.version}</version>
	    </dependency>
	    <!--mysql驱动-->
	    <dependency>
	        <groupId>mysql</groupId>
	        <artifactId>mysql-connector-java</artifactId>
	    </dependency>
	    <!--mybatis-->
	    <dependency>
	        <groupId>org.mybatis</groupId>
	        <artifactId>mybatis</artifactId>
	        <version>3.4.5</version>
	    </dependency>
	    <!--连接池-->
	    <dependency>
	        <groupId>commons-dbcp</groupId>
	        <artifactId>commons-dbcp</artifactId>
	        <version>1.4</version>
	    </dependency>
	    <dependency>
	        <groupId>junit</groupId>
	        <artifactId>junit</artifactId>
	    </dependency>
	    <dependency>
	        <groupId>log4j</groupId>
	        <artifactId>log4j</artifactId>
	        <version>${log4j.version}</version>
	    </dependency>
	    <dependency>
	        <groupId>org.slf4j</groupId>
	        <artifactId>slf4j-api</artifactId>
	    </dependency>
	    <dependency>
	        <groupId>commons-io</groupId>
	        <artifactId>commons-io</artifactId>
	        <version>2.4</version>
	    </dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

log4j的配置

在resources新建log4j.properties:

log4j.rootCategory=debug,CONSOLE,LOGFILE

log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#\u65E5\u5FD7\u7684\u5B58\u653E\u8DEF\u5F84
log4j.appender.LOGFILE.File=D:\\work\\eclipse-workspace2\\activity\\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n

mysql的配置

按照Activiti的默认方式,在resources新建activiti.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
					http://www.springframework.org/schema/contex
					http://www.springframework.org/schema/context/spring-context.xsd
					http://www.springframework.org/schema/tx
					http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- processEngine Activiti的流程引擎 -->
    <!-- 默认id对应的值为processEngineConfiguration -->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="root123"/>
        <!-- activiti数据库表处理策略 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

生成mysql表

在test新建ActivityTest.java:

package com.duohoob.activity;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;

public class ActivityTest {

    /**
     * 使用activiti提供的默认方式来创建mysql的表
     */
    @Test
    public void createTable(){
        // 使用classpath下的activiti.cfg.xml中的配置创建processEngine
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(engine);
    }
	
}

运行Junit test,创建ProcessEngine时会自动创建表。
在这里插入图片描述

流程操作

Activiti bpmn designer

eclipse
help→install new software→add
http://activiti.org/designer/update/
在这里插入图片描述

流程定义

在resources新建bpmn目录,
假如是请假流程,
在bpmn新增Leave.bpmn:
在这里插入图片描述
提交请假申请节点的Assignee填worker,表示该节点由worker完成;
部门经理审批节点的Assignee填manager;
行政人事备案节点的Assignee填personnel。

bpmn文件其实是通过xml文件表示业务流程,open with xml editor就可以查看xml内容。

流程存储/部署

bpmn定义好后,通过Activiti提供的api,将我们的流程保存到数据库中。

testDeployProcess

	@Test
	public void testDeployProcess() {
		// 创建processEngine
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 得到RepositoryService实例
		RepositoryService repositoryService = processEngine.getRepositoryService();
		Deployment deploy = repositoryService.createDeployment()
				.addClasspathResource("bpmn/Leave.bpmn")
				.name("请假流程")
				.deploy();
		System.out.println(deploy.getId());
		System.out.println(deploy.getName());
	}

运行
在这里插入图片描述

流程启动

通过Activiti提供的api,开启一个流程实例。

testStartProcess

	@Test
	public void testStartProcess() {
		// 创建processEngine
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 获取runtimeService
		RuntimeService runtimeService = processEngine.getRuntimeService();
		// 启动流程
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
		
		System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
		System.out.println("流程实例id:" + processInstance.getId());
		System.out.println("当前活动id:" + processInstance.getActivityId());
	}

"myProcess"是bpmn流程定义时的ID,是流程定义key。
在这里插入图片描述
运行
在这里插入图片描述

任务查询

查询当前Assignee待执行的任务,比如说worker。

testFindPersonalTaskList

	@Test
	public void testFindPersonalTaskList() {
		// 负责人
		String assignee = "worker";
		// 创建processEngine
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 获取taskService
		TaskService taskService = processEngine.getTaskService();
		// 获取任务列表
		List<Task> list = taskService.createTaskQuery()
				.processInstanceId("17501")
				.taskAssignee(assignee)
				.list();
		for (Task task : list) {
			System.out.println("流程实例id:" + task.getProcessInstanceId());
			System.out.println("任务id:" + task.getId());
			System.out.println("任务负责人:" + task.getAssignee());
			System.out.println("任务名称:" + task.getName());
		}
	}

"17501"是上一步的流程实例ID。

运行
在这里插入图片描述
list不为空,说明有需要worker处理的任务,
任务ID是指当前节点的ID,我们需要worker来完成该节点,推动流程前进。

任务处理

testcompleteTask

	@Test
	public void testcompleteTask() {
		// 负责人
		String assignee = "worker";
		// 创建processEngine
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 获取taskService
		TaskService taskService = processEngine.getTaskService();
		// 获取任务
		Task task = taskService.createTaskQuery()
				.processInstanceId("17501")
				.taskAssignee(assignee)
				.singleResult();
		// 处理任务
		taskService.complete(task.getId());
	}

运行
worker的任务就完成了,现在流程走到了部门经理审批节点,需要由manager来完成。

下一篇:工作流引擎Activiti入门-02

参考文章:

小Y先生。Activiti工作流教程
Young丶工作流引擎Activiti万字详细入门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值