复习步骤3-Activiti流程文件部署
项目结构如图
resource下的文件及lib copy query-test即可
执行完dbaddZipInputStream这个方法后,
//DeploymentBuilder的 addZipInputStream方法
public static void dbaddZipInputStream() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
DeploymentBuilder deploymentBuilder= re.createDeployment();//用RepositoryService获取部署创建对象
try {
//创建我们的压缩文件对象,压缩文件需为zip后缀的而不能事rar后缀
FileInputStream fis = new FileInputStream(new File("resource/datas.zip"));
ZipInputStream zis = new ZipInputStream(fis);
deploymentBuilder.addZipInputStream(zis);//将我们的ZIP文件ADD加载进来
/*
最终调用 deploy方法完成部署,调用此方法会返回一个Deployment对象--对应数据库act_re_deployment表的一条记录
------可以将我们的ZIP文件解压后,一对多的放入 一act_re_deployment表(部署文件):多
act_ge_bytearray 表(流程文件及资源对象-解压后的文件)*/
deploymentBuilder.deploy();
engine.close();
System.exit(0);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
执行完dbaddZipInputStream这个方法后,
会将压缩的文件-文件名及内容保存在act_ge_bytearray 表(流程文件及资源对象-解压后的文件)如下
act_re_deployment表(部署文件) 如下
执行完dbaddBpmnModel()方法后-动态生成一个'first_dm.bpnm' 保存在act_ge_bytearray 的BYTES_字段中
//DeploymentBuilder的 addBpmnModel方法 --- 动态生成我们的流程图,本来可以手画的
public static void dbaddBpmnModel(){
//步骤1
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
DeploymentBuilder deploymentBuilder= re.createDeployment();//用RepositoryService获取部署创建对象
//步骤2-- 创建流程图
/*参考first-act项目我们用activiti插件手画的流程图first.bpnm ,用代码生成*/
/*<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="worker"></userTask>
<userTask id="usertask2" name="leader"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
*/
/*
* 创建开始节点 -- 参考<startEvent id="startevent1" name="Start"></startEvent>
* */
StartEvent startEvent = new StartEvent();
startEvent.setId("startevent1_dm");
startEvent.setName("Start_dm");
/*
* 创建worker_dm提交申请任务节点 -- 参考<userTask id="usertask1" name="worker"></userTask>
* */
UserTask userTask1= new UserTask();
userTask1.setId("usertask1_dm");
userTask1.setName("worker_dm");
/*
* 创建leader_dm 审批任务节点 -- 参考<userTask id="usertask2" name="leader"></userTask>
* */
UserTask userTask2= new UserTask();
userTask2.setId("usertask2_dm");
userTask1.setName("leader_dm");
/*
* 创建结束节点 -- 参考
* */
EndEvent endEvent = new EndEvent();
endEvent.setId("endevent1_dm");
endEvent.setName("End_dm");
/*
* 创建连线 将节点串联起来 -- 参考
* <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
*
* */
SequenceFlow startToUserTask1 = new SequenceFlow();
startToUserTask1.setId("flow1_dm");
startToUserTask1.setSourceRef("startevent1_dm");//startEvent id
startToUserTask1.setTargetRef("usertask1_dm");//UserTask1 id
SequenceFlow userTask1ToUserTask2 = new SequenceFlow();
userTask1ToUserTask2.setId("flow2_dm");
userTask1ToUserTask2.setSourceRef("usertask1_dm");//UserTask1 id
userTask1ToUserTask2.setTargetRef("usertask2_dm");//UserTask2 id
SequenceFlow userTask2ToEnd = new SequenceFlow();
userTask2ToEnd.setId("flow3_dm");
userTask2ToEnd.setSourceRef("usertask2_dm");//UserTask2 id
userTask2ToEnd.setTargetRef("endevent1_dm");//endEvent id
/*
* 整合节点和连线成为一个 process
* 参考--
*<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="worker"></userTask>
<userTask id="usertask2" name="leader"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
* */
Process process = new Process();
process.setId("myProcess_dm");
process.setName("My process dm");
process.setExecutable(true);
// 将4个节点加进process
process.addFlowElement(startEvent);
process.addFlowElement(userTask1);
process.addFlowElement(userTask2);
process.addFlowElement(endEvent);
//将3条连线加进process
process.addFlowElement(startToUserTask1);
process.addFlowElement(userTask1ToUserTask2);
process.addFlowElement(userTask2ToEnd);
/*
* 创建一个bpmnmodel对象 添加process
* */
BpmnModel bpmnModel = new BpmnModel();
bpmnModel.addProcess(process);
//步骤三
deploymentBuilder.addBpmnModel("first_dm.bpnm", bpmnModel); //将我们的bpmnmodel对象ADD加载进来,并将这个流程的文件名命名为first_dm.bpnm
/*
最终调用 deploy方法完成部署,调用此方法会返回一个Deployment对象--对应数据库act_re_deployment表的一条记录
------可以将我们的bpmnModel文件,一对多的放入 一act_re_deployment表(部署文件):多
act_ge_bytearray 表(流程文件及资源对象)*/
deploymentBuilder.deploy();
engine.close();
System.exit(0);
}
执行完dbaddBpmnModel()方法后数据库如图
JAVA文件的全部内容
DeploymentAct.java
package com.xiangshuai.act.c7;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.interfaces.RSAKey;
import java.util.zip.ZipInputStream;
import org.activiti.bpmn.BpmnAutoLayout;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.DeploymentQuery;
import org.springframework.util.FileCopyUtils;
/**
* 文件在E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤3-Activiti流程文件部署
* 或 我的网盘\我的笔记学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤3-Activiti流程文件部署
* @author lqx
* DeploymentBuilder
有如下方法:
addClasspathResource
addInputStream
addString
addZipInputStream ------可以将我们的ZIP文件解压后,一对多的放入 一act_re_deployment表(部署文件):多
act_ge_bytearray 表(流程文件及资源对象-解压后的文件)
addBpmnModel --- 动态生成我们的流程图,本来可以手画的
addBytes
最终调用 deploy方法完成部署,调用此方法会返回一个Deployment对象--对应数据库act_re_deployment表的一条记录
*
*/
public class DeploymentAct {
public static void main(String[] args) {
//dbaddZipInputStream();
//dbaddBpmnModel();
//getResourceAsStream//获得字节流文件
//getProcessDiagram();//通过字节流访问已部署的流程图,例如PNG图像 -- 这里事获取流程图
getProcessModel();//通过字节流访问已部署的流程模型,例如BPMN 2.0 XML文件,即BPMN文件。
}
//DeploymentBuilder的 addZipInputStream方法
public static void dbaddZipInputStream() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
DeploymentBuilder deploymentBuilder= re.createDeployment();//用RepositoryService获取部署创建对象
try {
//创建我们的压缩文件对象,压缩文件需为zip后缀的而不能事rar后缀
FileInputStream fis = new FileInputStream(new File("resource/datas.zip"));
ZipInputStream zis = new ZipInputStream(fis);
deploymentBuilder.addZipInputStream(zis);//将我们的ZIP文件ADD加载进来
/*
最终调用 deploy方法完成部署,调用此方法会返回一个Deployment对象--对应数据库act_re_deployment表的一条记录
------可以将我们的ZIP文件解压后,一对多的放入 一act_re_deployment表(部署文件):多
act_ge_bytearray 表(流程文件及资源对象-解压后的文件)*/
deploymentBuilder.deploy();
engine.close();
System.exit(0);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//DeploymentBuilder的 addBpmnModel方法 --- 动态生成我们的流程图,本来可以手画的
public static void dbaddBpmnModel(){
//步骤1
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
DeploymentBuilder deploymentBuilder= re.createDeployment();//用RepositoryService获取部署创建对象
//步骤2-- 创建流程图
/*参考first-act项目我们用activiti插件手画的流程图first.bpnm ,用代码生成*/
/*<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="worker"></userTask>
<userTask id="usertask2" name="leader"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
*/
/*
* 创建开始节点 -- 参考<startEvent id="startevent1" name="Start"></startEvent>
* */
StartEvent startEvent = new StartEvent();
startEvent.setId("startevent1_dm");
startEvent.setName("Start_dm");
/*
* 创建worker_dm提交申请任务节点 -- 参考<userTask id="usertask1" name="worker"></userTask>
* */
UserTask userTask1= new UserTask();
userTask1.setId("usertask1_dm");
userTask1.setName("worker_dm");
/*
* 创建leader_dm 审批任务节点 -- 参考<userTask id="usertask2" name="leader"></userTask>
* */
UserTask userTask2= new UserTask();
userTask2.setId("usertask2_dm");
userTask1.setName("leader_dm");
/*
* 创建结束节点 -- 参考
* */
EndEvent endEvent = new EndEvent();
endEvent.setId("endevent1_dm");
endEvent.setName("End_dm");
/*
* 创建连线 将节点串联起来 -- 参考
* <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
*
* */
SequenceFlow startToUserTask1 = new SequenceFlow();
startToUserTask1.setId("flow1_dm");
startToUserTask1.setSourceRef("startevent1_dm");//startEvent id
startToUserTask1.setTargetRef("usertask1_dm");//UserTask1 id
SequenceFlow userTask1ToUserTask2 = new SequenceFlow();
userTask1ToUserTask2.setId("flow2_dm");
userTask1ToUserTask2.setSourceRef("usertask1_dm");//UserTask1 id
userTask1ToUserTask2.setTargetRef("usertask2_dm");//UserTask2 id
SequenceFlow userTask2ToEnd = new SequenceFlow();
userTask2ToEnd.setId("flow3_dm");
userTask2ToEnd.setSourceRef("usertask2_dm");//UserTask2 id
userTask2ToEnd.setTargetRef("endevent1_dm");//endEvent id
/*
* 整合节点和连线成为一个 process
* 参考--
*<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="worker"></userTask>
<userTask id="usertask2" name="leader"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
* */
Process process = new Process();
process.setId("myProcess_dm");
process.setName("My process dm");
process.setExecutable(true);
// 将4个节点加进process
process.addFlowElement(startEvent);
process.addFlowElement(userTask1);
process.addFlowElement(userTask2);
process.addFlowElement(endEvent);
//将3条连线加进process
process.addFlowElement(startToUserTask1);
process.addFlowElement(userTask1ToUserTask2);
process.addFlowElement(userTask2ToEnd);
/*
* 创建一个bpmnmodel对象 添加process
* */
BpmnModel bpmnModel = new BpmnModel();
bpmnModel.addProcess(process);
//步骤三
deploymentBuilder.addBpmnModel("first_dm.bpnm", bpmnModel); //将我们的bpmnmodel对象ADD加载进来,并将这个流程的文件名命名为first_dm.bpnm
/*
最终调用 deploy方法完成部署,调用此方法会返回一个Deployment对象--对应数据库act_re_deployment表的一条记录
------可以将我们的bpmnModel文件,一对多的放入 一act_re_deployment表(部署文件):多
act_ge_bytearray 表(流程文件及资源对象)*/
deploymentBuilder.deploy();
engine.close();
System.exit(0);
}
/*RepositoryService 的 getResourceAsStream(String deploymentId, String resourceName)方法 通过字节流提供对部署资源的访问。
* --参数1,act_ge_bytearray表的NAME_的值,参数2,act_ge_bytearray表的DEPLOYMENT_ID_的值
* 获取字节流,这里事获取addZipInputStreamTESTFile1.txt文件
* */
//百度 RepositoryService API
public static void getResourceAsStream(){
//步骤1
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
InputStream rs = re.getResourceAsStream("7501", "addZipInputStreamTESTFile1.txt");//参数1,act_ge_bytearray表的NAME_的值,参数2,act_ge_bytearray表的DEPLOYMENT_ID_的值
byte[] b=new byte[1024];
try {
rs.read(b);
String st = new String(b);
System.out.println(st);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
InputStream getProcessDiagram(String processDefinitionId)
-- String processDefinitionId 参数:act_re_procdef表 的 id值
通过字节流访问已部署的流程图,例如PNG图像 -- 这里事获取流程图
*/
//百度 RepositoryService API
public static void getProcessDiagram(){
//步骤1
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
InputStream is = re.getProcessDiagram("myProcess:1:4");//参数:act_re_procdef表 的 id值
try {
FileCopyUtils.copy(is, new FileOutputStream(new File("D:/temp.png")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
InputStream getProcessModel(String processDefinitionId)
-- String processDefinitionId 参数:act_re_procdef表 的 id值
通过字节流访问已部署的流程模型,例如BPMN 2.0 XML文件,即BPMN文件。
*/
//百度 RepositoryService API
public static void getProcessModel(){
//步骤1
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();//获得引擎对象
/*用引擎对象 获取管理流程定义--主要操作流程引擎中的静态资源,如流程资源的XML,
流程图片等的RepositoryService-- 此对象作用详见E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\linux\课程导学 \主要API的作用.doc */
RepositoryService re = engine.getRepositoryService();
InputStream is = re.getProcessModel("myProcess:1:4");//参数:act_re_procdef表 的 id值
try {
FileCopyUtils.copy(is, new FileOutputStream(new File("D:/temp.bpmn")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}