架构图:
名词解释:
通过加载xml文件得到configuration创建processEngine对象(可以调以下方法) repositoryService—存储,将流程发布到数据库。TaskService—发起或处理流程就会产生taskServiceidentityService—每一层用户角色间的关系runtimeService----运行时状态historyService—已经走过的流程managementService—怎么样让activiti知道我们的流程呢?
通过BPM(业务流程管理)来进行BPMN:业务流程建模与标注开始—流程—结束首先我们新建一个activiti工程(或者打开已有项目)
创建好后点击file-settings,进入设置后,搜索plugins,点击plugins,搜索actiBPM,点击install安装
安装完后会提示restart IDE。点击重启
在项目的resource包下创建一个文件夹(用来单独放activiti的内容)
new一个BpmnFile
拖入图形,开始。。。结束流程,创建视图流程
2020新版idea可能无法直接安装此插件,有需要可以看这篇博客 2020版idea如何安装工作流插件
举例:创建一个请假流程,编辑流程id等内容
点击图形,进行编辑,如:流程名称,审批人等
将.bpmn重命名为.xml文件(这一步主要为了后面代码将流程和流程图部署到数据库而做)
右击xml文件选择diagrams,生成流程图
点击箭头,将png保存到此项目中
此时看见项目中多了一个png文件
问题(这里可能会出现乱码的问题)
解决:
file–settings–editor–file encodings,将里面的选项都改成UTF-8help–edit Custom VM Options,点开此文件,在最后一行加入代码: -Dfile.encoding=UTF-8再次打开diagrams,乱码问题已解决
这个可以根据自己工具的版本来导入。 下面是我使用的工具包
<dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-converter</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-layout</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti.cloud</groupId> <artifactId>activiti-cloud-services-api</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <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> </dependencies>在resources下建立xml文件,如果文件建立在diagram文件下,运行时就会因为扫描不到而报错
<?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"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?serverTimezone=UTC&useSSL=true&useUnicode=true&characterEncoding=utf-8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value="root"></property> <!--配置创建表策略,没有表是自动创建--> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans>这里会遇到的坑:
1.版本引发的时区问题
2.mysql驱动问题
The new driver class is `com.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. 由于修改了mysql驱动的版本,将5.7改成了8.0,所以此时jdbcDriver的value值,由com.mysql.jdbc.Driver变成了com.mysql.cj.jdbc.Driver新建一个测试类:
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.junit.Test; public class ActivitiTest { @Test public void show(){ ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine(); System.out.println(processEngine); } }此时,数据库已经自动创建了25张表
在java包下新建一个demo类。将流程部署到数据库
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Before; import org.junit.Test; public class ActivitiDemo { private ProcessEngine processEngine; @Before public void pre(){ //创建processengine对象 processEngine = ProcessEngines.getDefaultProcessEngine(); } @Test public void deployment(){ RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("diagram/leave.xml") //在此之前,要将bpmn格式转换为xml .name("请假流程").deploy(); System.out.println(deployment.getName()); System.out.println(deployment.getId()); } }待定。。。未完