ActivitiDesigner流程设计器插件
第一个插件是bpmn插件
第二个插件是生成png文件插件
bpmn文件中文乱码问题:
idea的idea64.exe.vmoptions文件增加内容
-Dfile.encoding=UTF-8
Activiti表结构生成
pom.xml
<properties>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
</properties>
<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>5.1.40</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>
<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>
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
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
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.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
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">
<!--数据源配置dbcp-->
<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" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="maxActive" value="3" />
<property name="maxIdle" value="1" />
</bean>
<!--activiti单独运行processEngine配置,单独启动方式配置-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"></property>
<!--自动生成表结构-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
AcitivitiTest.java
public class AcitivitiTest {
@Test
public void test(){
//1.创建ProcessEngineConfiguration对象 第一个参数:配置文件名称 第二个参数是processEngineConfiguration的bean的id
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//在创建
ProcessEngine 时会自动创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
//使用ProcessEngines创建条件:1.activiti配置文件名称为activiti.cfg.xml 2.bean的id=processEngineConfiguration
//ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
}
}
创建25张表
- ACT_RE_*: 'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,
规则,等等)。 - ACT_RU_*: 'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,
等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删 除这些记录
。 这样运行时表可以一直很小速度很快。 - ACT_HI_*: 'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等
等。 - ACT_GE_*: GE 表示 general。通用数据, 用于不同场景下。
流程
-
流程定义:
bpmn文件 -
得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
流程定义部署
RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deploy = repositoryService.createDeployment() .addClasspathResource("diagram/holiday.bpmn") .addClasspathResource("diagram/holiday.png") .name("申请流程") .deploy();
这一步将保存:部署信息(act_re_deployment)、流程定义信息(act_re_procdef)、流程定义的bpmn和png文件(act_ge_bytearray)
-
启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService(); //根据流程定义信息(act_re_procdef)的key,启动流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);
这一步进入操作保存:已完成活动信息也就是通过的节点(act_hi_actinst)、参与者信息(act_hi_indentitylink、act_ru_indentitylink)、流程实例历史(act_hi_procinst)、任务实例(act_hi_taskinst、act_ru_task)、执行表(act_ru_execution)和参与者信息(act_ru_identitylink)
-
查询用户任务列表
TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey("key")//流程定义的key .taskAssignee("assignee")//任务节点执行者 .list();
-
查询个人任务
-
关联业务
//1. 得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); //3.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //4.查询个人任务 Task task = taskService.createTaskQuery() .processDefinitionKey("act_re_procdef_key") .taskAssignee("assignee") .singleResult(); //5.得到流程实例对象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(task.getParentTaskId()) .singleResult(); //6.得到businessKey,去查询业务相关信息 String businessKey = processInstance.getBusinessKey();
-
任务处理完成
TaskService taskService = processEngine.getTaskService(); taskService.complete("taskId");//任务id
-
删除流程
//直接删除,有流程未完成删除失败 repositoryService.deleteDeployment("deploymentId"); //级联删除 //repositoryService.deleteDeployment("deploymentId",true);
全部流程实例挂起与激活
全部流程挂起将不允许启动新的启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行
public void demo(){
//创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//查询流程定义的对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("key").singleResult();
//得到当前流程定义的实例是否为暂停状态
boolean suspended = processDefinition.isSuspended();
//判断是否是暂停状态
if (suspended){
//激活操作
repositoryService.activateProcessDefinitionById(processDefinition.getId(),true,null);
}else {
//挂起操作
repositoryService.suspendProcessDefinitionById(processDefinition.getId(),true,null);
}
}
单个流程实例挂起与激活
针对单个流程执行挂起操作,某个流程实例挂起,此流程不在继续执行
//创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//得到RuntimeService实例
RuntimeService runtimeService = processEngine.getRuntimeService();
//查询流程实例的对象
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId("key").singleResult();
//得到当前流程定义的实例是否为暂停状态
boolean suspended = processInstance.isSuspended();
//判断是否是暂停状态
if (suspended){
//激活操作
runtimeService.activateProcessInstanceById(processInstance.getId());
}else {
//挂起操作
runtimeService.suspendProcessInstanceById(processInstance.getId());
}
任务分配
个人任务
表达式分配
//1. 得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.部署流程
RepositoryService repositoryService = processEngine.getRepositoryService();
//部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("申请流程")
.deploy();
//4.设置assignee值
Map<String,Object> map = new HashMap<String, Object>();
map.put("assignee","zhangsan");
map.put("assignee1","lisi");
map.put("assignee2","wangwu");
//5.启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcessKey", map);
流程分支
pojo类实现序列化,启动流程实例时传入,会根据条件选择分支。
例如:在上边设置了pojo.num>3走右边,pojo.num<=3走节点3
Map<String ,Object> map = new HashMap<>();
Pojo pojo = new Pojo();
pojo.setNum(5)
//启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map);
到出现分支的节点完成后,因为num=5,会走右边节点,然后再走节点3
也可以在流程完成的时候传入map
taskService.complete(taskId,map);