本文以Intellij为例,将自己创建一个与上节相同的请假流程。观看本文,需细思与上一节的联系。
目录
1. 安装Intellij的Plugin actiBPM以支持图形化绘制流程图
3.2 自动将bpmn文件以blob二进制形式保存于ACT_GE_BYTEARRAY
1. 安装Intellij的Plugin actiBPM以支持图形化绘制流程图
2. 新建Maven项目
2.1 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>first-act</artifactId>
<version>1.0-SNAPSHOT</version>
<name>activiti</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<activiti.version>6.0.0</activiti.version>
<mysql.version>8.0.16</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- Maven Assembly Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<mainClass>com.study.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
其中maven-assembly-plugin的引入是为了在package周期时额外生成一个fat jar(包含了所有依赖的可独立运行jar)
2.2 bpmn流程图绘制
2.2.1 新建bpmn文件
2.2.2 拖拽元素绘制图形
2.2.3 修改Id为leave
2.3 自动生成Activiti所需table
2.3.1 配置activiti.cfg.xml文件
获取一个ProcessEngine对象最容易的方式是使用org.activiti.engine.ProcessEngines
class
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
这个方法会自动寻找在classpath路径下名为activiti.cfg.xml文件。之后基于这个文件构建流程引擎。
基于H2内存数据库的官方示例
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
<property name="databaseSchemaUpdate" value="true" />
<property name="asyncExecutorActivate" value="false" />
<property name="mailServerHost" value="mail.my-corp.com" />
<property name="mailServerPort" value="5025" />
</bean>
</beans>
H2数据库其实是可以保存在本地磁盘持久化的,欲知详情,自行百度
当然,你可以采用mysql数据库
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 流程引擎配置的bean -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ACT?characterEncoding=utf-8" />
<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
<property name="jdbcUsername" value="kevin" />
<property name="jdbcPassword" value="12345678" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
2.3.2 执行java生成table
package com.study;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
public class App
{
public static void main( String[] args )
{
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
engine.close();
}
}
2.3.3 生成的28张table
3. 部署流程定义Deployment
3.1 代码部分
package com.study;
import org.activiti.engine.*;
public class App
{
public static void main( String[] args )
{
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService rs = engine.getRepositoryService();
Deployment deployment = rs.createDeployment().addClasspathResource("first.bpmn").deploy();
engine.close();
}
}
3.2 自动将bpmn文件以blob二进制形式保存于ACT_GE_BYTEARRAY
4. 启动流程实例ProcessInstance
4.1 java code
package com.study;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class App
{
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
public static void main( String[] args )
{
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService rs = engine.getRepositoryService();
Deployment deployment = rs.createDeployment().addClasspathResource("first.bpmn").deploy();
RuntimeService runtimeService = engine.getRuntimeService();
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave");
TaskService taskService = engine.getTaskService();
// worker完成请假任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
LOGGER.info("当前流程节点:{}",task.getId());
taskService.complete(task.getId());
//boss审核完成
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
LOGGER.info("当前流程节点:{}",task.getId());
taskService.complete(task.getId());
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
LOGGER.info("当前流程节点:{}",task);
engine.close();
}
}
4.2 执行结果
10:12:25,903 [main] INFO org.activiti.engine.compatibility.DefaultActiviti5CompatibilityHandlerFactory - Activiti 5 compatibility handler implementation not found or error during instantiation : org.activiti.compatibility.DefaultActiviti5CompatibilityHandler. Activiti 5 backwards compatibility disabled.
10:12:25,955 [main] INFO org.activiti.engine.impl.ProcessEngineImpl - ProcessEngine default created
10:12:25,962 [main] INFO org.activiti.engine.ProcessEngines - initialised process engine default
10:12:27,668 [main] INFO com.study.App - 当前流程节点:5009
10:12:27,721 [main] INFO com.study.App - 当前流程节点:5011
10:12:27,801 [main] INFO com.study.App - 当前流程节点:null
4.3 分析
当执行结束后,流程实例便不再处于运行中的状态。此时流程实例中的所有task都已经结束了,所以最后是查询不到task对象的
5. 流程定义、流程实例与任务的关系
流程定义类似于Class,静态的
流程实例类似于Class new出来的对象,是动态的
任务是流程实例的组成部分