流程图:
环境配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 注册一个流程引擎配置对象 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///stu"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="123456"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
<!-- 使用工厂bean创建流程引擎对象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<!-- 注入上面的配置对象 -->
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
</beans>
流程部署:act_re_deployment(流程部署表) act_re_procedef(流程定义表) act_re_model(流程设计模型表)
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 获取仓库服务
// 部署流程定义读取单个文件的方式部署流程定义
@Test
public void demo1(){
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("demo1.bpmn");
deploymentBuilder.addClasspathResource("demo1.png");
Deployment deployment = deploymentBuilder.deploy();
System.out.println(deployment.getId());
}
// 通过zip的方式部署流程定义
@Test
public void demo2(){
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
.getClassLoader().getResourceAsStream("process.zip"));
deploymentBuilder.addZipInputStream(zipInputStream);
Deployment deployment = deploymentBuilder.deploy();
System.out.println(deployment.getId());
}
部署信息操作:
// 查询部署信息列表--查询部署表中的数据act_re_deployment
@Test
public void demo3(){
DeploymentQuery mq = processEngine.getRepositoryService().createDeploymentQuery();
List<Deployment> dyList = mq.list();
for(Deployment dy: dyList){
System.out.println(dy.getId());
}
}
// 查询流程定义表---查询流程定义act_re_procdef
@Test
public void demo4(){
ProcessDefinitionQuery pdq = processEngine.getRepositoryService().createProcessDefinitionQuery();
List<ProcessDefinition> pdfList = pdq.list();
for(ProcessDefinition pd : pdfList){
System.out.println(pd.getId());
}
}
//act_re_deployment
@Test
public void demo5(){
String deploymentId = "401";
boolean cascade = true;// 是否级联删除
processEngine.getRepositoryService().deleteDeployment(deploymentId,
cascade);
}
启动流程实例:
启动的同时会在:表 ACT_RE_TASK 和 ACT_RU_EXECUTION 中创建数据:
ACT_RE_TASK :
字段说明:execution_id_ 实例ID(外键), proc_inst_id_ 流程实例ID 分别关联表ACT_RE_EXECUTION 中的 ID(主键),和proc_inst_id(流程实例ID)。
ACT_RE_EXECUTION:
除了在流程中启动的子流程之外,流程启动之后在表ACT_RU_EXECUTION中的字段ID_和PROC_INST_ID_字段值是相同的.
2) 值不相等的情况:
不相等的情况目前只会出现在子流程中(包含:嵌套、引入),例如一个购物流程中除了下单、出库节点之外可能还有一个付款子流程,在实际企业应用中付款流程通常是作为公用的,所以使用子流程作为主流程(购物流程)的一部分。
当任务到达子流程时引擎会自动创建一个付款流程,但是这个流程有一个特殊的地方,在数据库可以直观体现,
两条数据,第二条数据(嵌入的子流程)的PARENT_ID_等于第一条数据的ID_和PROC_INST_ID_,并且两条数据的PROC_INST_ID_相同。
还有一点特殊的地方,字段IS_ACTIVE_的值分别是0和1,说明正在执行子流程主流程挂起
// 启动流程实例
@Test
public void demo6(){
// 根据 act_re_procdef(key) 关键字
/*String kye="splc";
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(kye);*/
// 根据act_re_procdef(Id) 关键字
String Id = "GZLC:1:1704";
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceById(Id);
System.out.println(pi.getId());
}
// 查询流程实例
@Test
public void demo7(){
ProcessInstanceQuery piq = processEngine.getRuntimeService()
.createProcessInstanceQuery();
List<ProcessInstance> list = piq.list();
for (ProcessInstance pi : list) {
System.out.println(pi.getId());
}
}