最近的一个项目需要用到Activiti工作流。正好跟大家分享一下我的采坑经验。由于我是用的是Idea,所以就以Idea举例了(pom.xml配置也在下面)关于数据库的安装和配置请看我上一篇!另外需要注意的是,这里我定义的库名是“activiti”那么我就需要提前建好这个库~
一、下载工作流插件
1.首先打开Idea,在菜单栏找到:
File->Setting->Plugins
2.在Marketplace中搜索actiBPM,下载安装即可跳到第四步;如果出现了下图所示,不要急,有VPN的同学可以打开VPN再试试,没有的同学接着看
a.如果你的File->Setting->System Setting->Updates中,有【user secure connection】这个选项,把勾取消再试试去Marketplace中下载
b.如果你的Updates中没有这个选项,那就进到下面的链接
https://plugins.jetbrains.com/plugin/7429-actibpm
稍等片刻,你会看到:点击下载即可
你会得到一个.jar文件,记住它的路径,或者干脆把它放到你Idea的安装目录之后回到Idea中,还是在Setting的Plugins中:
选择从磁盘导入,完成安装
4.大家一起确认一下
5.重启Idea,如果你可以在File->New中看到如下所示,就说明安装成功
二、新建一个自己的工作流项目
1.创建一个Java项目(这一步应该不需要详细步骤~)
2.重点来啦,在src/main/下创建一个resources资源目录,在resources目录下再来一个存放.BPMN文件和你的流程图的目录,我的叫diagram
3.真重点来啦!下面是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>org.example</groupId>
<artifactId>activiti</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>5.18.0</version>
</dependency>
<!--<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>5.18.0</version>
</dependency>-->
<!--JUnit测试-->
<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 -->
<!--activiti-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
<!--MySQL 驱动包,如果是其他库的话需要换驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
</project>
4.然后选中diagram,单击鼠标右键,创建一个BPMN格式的文件
5.惊不惊喜?
只需要用这三个键,就可以做出一个Demo啦,拖动按钮到画布上,双击可以改名,当光标放到图形中心,会变成一个小黑点,此时按住鼠标左键,即可拖动指向下一个流程节点。
ps:大家可以像我一样,先写一个简单的案例,把Activiti学会再说
6.将写好的.bpmn文件改后缀名为.xml文件
7.然后再右键这.xml文件,选择Diagrams->show BPMN 2.0 Designer就会出现咱们需要的流程图啦。没有这个选项的同学们重启一下试试看
8.导出这个图,我们可以选择导出到一个位置之后复制到我们的resoureces/diagram目录下,下可以直接导出到这个目录下
此处可能会有中文乱码,别慌!首先打开Idea的bin目录,然后找到idea64.exe.vmoptions
加入这样一行
-Dfile.encoding=UTF-8
重启Idea即可;当然,已经导出的图片里的乱码是不会因为这个配置的改变就消失的哦
9.activiti.cfg.xml文件的配置
这个文件名不建议各位修改,因为是Activiti默认的。(当然可以改!想知道的话,我放到最后啦)
这里是第一种配置方式:
<?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 id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!--activiti单独运行的ProcessEngine配置,使用单独启动方式
默认情况下 bean的id=processEngineConfiguration,其他的名字需要在JAVA代码中,在
createProcessEngineConfigurationFromResource(String resource, String beanName)第二个参数位置上填写自定义名称-->
<bean id="processEngineConfiguration" class=
"org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--代表数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--是否生成表结构-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
这里是第二种配置方式,推荐使用第一种,因人而异吧:
<?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 id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
//Activiti的24个表,不存在则自动创建
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
至此配置工作就完成了~如有遗漏请及时通知我!
下面是一些小Demo,帮助大家快速掌握
三、测试数据库中,表的创建
1.首先在test目录下创建一个测试类
@Test
public void testTable(){
//1.创建ProcessEngineConfiguration对象
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//2.创建ProcessEngine对象,这是第一种
ProcessEngine processEngine = configuration.buildProcessEngine();
//3.输出processEngine对象
System.out.println(processEngine);
//提供了操作_hi_表的方法
HistoryService historyService = processEngine.getHistoryService();
//提供了操作_ru_表的方法
RuntimeService runtimeService = processEngine.getRuntimeService();
}
运行之后去看看结果吧~这里给大家提供第二种创建表的方式:
@Test
public void testGenTable(){
//这个方法需要有两个条件‘
//条件1:activiti配置文件名称:activiti.cfg.xml
//条件2:bean的id="processEngineConfiguration"
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
注释中的注意事项要注意!并且记得要删库再建库~!关于24张表的分析留到以后吧
四、流程定义之后,我们需要部署
创建表只是一句话的事情,那么要操作这么多的表总不能一点一点写SQL,我们来看看Activiti是怎么操作的;这里我是在src/main/java/下写的,不是测试类哦
/**
* 流程定义的部署
* 运行之后,activiti的表有哪些?
* act_ge_bytearray 流程定义的bpmn文件和png文件
* act_ge_property 流程定义的一些信息
* act_re_deployment 部署信息
*/
public class Demo1 {
//测试流程定义的部署
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署,添加资源
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("请假申请流程")
.deploy();
//4.输出部署的一些信息
System.out.println("名称:"+deployment.getId());
System.out.println(deployment.getName());
}
}
各位如果是自己写的.bpmn文件,需要注意在资源路径中改成自己的正确的路径,name中同理
五、流程实例的启动
/**
* 流程实例的启动
* 启动流程实例的前提是已经完成流程定义的部署
* 影响的哪些表
* act_hi_actinst 已完成的活动信息
* act_hi_procinst 流程实例
* act_hi_identitylink 参与者信息
* act_hi_taskinst 任务实例
* act_ru_execution 执行表
* act_ru_identitylink 参与者信息
* act_ru_task 任务
*/
public class Demo2 {
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.创建流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday");
//4.输出实例的相关信息
System.out.println("流程部署的ID:"+processInstance.getDeploymentId());
System.out.println("流程实例ID:"+processInstance.getId());
System.out.println("活动ID:"+processInstance.getActivityId());
}
}
接着我们来看看控制台输出的和自己表中的对比
未完待续…
六、这里是最后
想个性的同学们,看过来,让我们打开Activiti的源码(什么,你不会?那你先别追求个性了,好好练习熟练掌握才是正途)
我们可以看到:只需要将这里的名称改成你想要的名称即可~但是一定要注意拼写
谢谢观看~