一、发布资源
说明:从存储服务RepositoryService可以获取发布生成器DeploymentBuilder,该生成器中可以调用添加资源的方法,有不同资源的添加,然后调用deploy()方法进行发布。具体的添加方法如下:
DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);
DeploymentBuilder addClasspathResource(String resource);
DeploymentBuilder addString(String resourceName, String text);
DeploymentBuilder addBytes(String resourceName, byte[] bytes);
//zip压缩文件
DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);
//bpmn文件
DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);
此处只测试压缩文件和bpmn资源的发布与读取。 ① 发布压缩文件
- 添加压缩文件到resource目录下(该压缩文件只包含两个txt文件):
- 编码进行发布
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取存储服务
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取压缩文件流
FileInputStream fileInputStream = new FileInputStream(new File("resource/datas.zip"));
ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
//获取发布生成器
DeploymentBuilder deployment = repositoryService.createDeployment();
//添加压缩文件流
deployment.addZipInputStream(zipInputStream);
//发布
deployment.deploy();
//关闭
processEngine.close();
System.exit(0);
3.查看:
- 在act_re_deployment表中查看发布数据:
- 在act_ge_bytearray表查看具体的资源数据: ②发布bmpn(不使用文件,代码生成)
- 编码如下:
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder deployment = repositoryService.createDeployment();
deployment.addBpmnModel("myProcess", createBpmnModel());
deployment.deploy();
processEngine.close();
System.exit(0);
}
/**
* 获取BPMN模型对象,跟使用bpmn文件和xml文件是一样的
* @return
*/
private static BpmnModel createBpmnModel(){
//创建BPMN模型对象
BpmnModel bpmnModel = new BpmnModel();
//创建一个流程定义
Process process = new Process();
bpmnModel.addProcess(process);
process.setId("myProcess");
process.setName("My Process");
//开始事件
StartEvent startEvent = new StartEvent();
startEvent.setId("startEvent");
process.addFlowElement(startEvent);
//用户事件
UserTask userTask = new UserTask();
userTask.setId("userTask");
userTask.setName("User Task");
process.addFlowElement(userTask);
//结束事件
EndEvent endEvent = new EndEvent();
endEvent.setId("endEvent");
process.addFlowElement(endEvent);
//添加流程顺序
process.addFlowElement(new SequenceFlow("startEvent", "userTask"));
process.addFlowElement(new SequenceFlow("userTask", "endEvent"));
return bpmnModel;
}
- 查看
二、activiti对bpmn文件的验证
概述:在发布bpmn文件时,activiti会对文件的标签和逻辑进行验证,如果验证不通过则会抛出异常。
- 标签不正确的验证
- xml如下图;
- 报错
Exception in thread "main" org.activiti.bpmn.exceptions.XMLException: cvc-complex-type.2.4.a: 发现了以元素 'abc' 开头的无效内容。
- 取消验证标签属性
DeploymentBuilder deployment = repositoryService.createDeployment();
deployment.addClasspathResource("my_process.bpmn");
//去掉标签结构验证
deployment.disableSchemaValidation();
- 逻辑不正确的验证
- bpmn图如下:
- 报错如下:
- 关闭逻辑验证:
//关闭对bpmn逻辑的验证
deployment.disableBpmnValidation();
三、查询部署的资源
概述:当我们发布成功后,可以对发布的资源进行查询。
- 查询文本资源
//1.首先发布文本资源
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.addClasspathResource("my_text.txt");
Deployment deployment = deploymentBuilder.deploy();
//读取文本资源
InputStream resourceAsStream = repositoryService.getResourceAsStream(deployment.getId(), "my_text.txt");
int count = resourceAsStream.available();
byte[] bytes = new byte[count];
resourceAsStream.read(bytes);
String text = new String(bytes);
System.out.println(text);
//结果:this is xjf's text
- 查询bpmn的xml资源
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource("query.bpmn");
Deployment deployment = builder.deploy();
//读取xml文件
System.out.println("depoyment的id:" + deployment.getId());
//获取流程定义
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.deploymentId(deployment.getId())
.singleResult();
System.out.println("processDefinition的id:" + processDefinition.getId());
//获取资源的输入流
InputStream processModel = repositoryService.getProcessModel(processDefinition.getId());
int count = processModel.available();
byte[] bytes = new byte[count];
processModel.read(bytes);
String xml = new String(bytes);
System.out.println(xml);
结果:
3. 查询bpmn的图片资源:Deployment deployment = repositoryService.createDeployment().addClasspathResource("query.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//读取流程资源图片
InputStream inputStream = repositoryService.getProcessDiagram(processDefinition.getId());
BufferedImage image = ImageIO.read(inputStream);
System.out.println("图片:" + image);
//保存为图片文件
File file = new File("resource/image/result.png");
if (!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write(image,"png",fos);
fos.close();
inputStream.close();
查看图片:
四、删除部署文件
删除部署数据: 1. 不管是否指定级联,都会删除部署相关的身份数据、流程定义数据、流程资源与部署数据 2. 如果设置为级联删除,则会将运行的流程实例、流程任务以及流程实例的历史数据删除 3. 如果不级联删除,但是存在运行时数据,例如还有流程实例,就会删除失败
五、过滤重复部署
- 当进行第一次部署后,资源没有发生变化而再次进行部署的话,同样会将部署数据写入到数据库中。如果想避免这种情况,可以调用DeploymentBuilder的enableDuplicateFiltering方法。
- 在执行deploy方法时,如果发现该值为true,则根据部署对象的名称去查找最后一条部署记录,如果发现最后一条部署记录与当前需要部署的记录一致,则不会重复部署。(此处的记录一致,是指DeploymentEntity下的资源是否相同,包括==资源名称和资源内容==)