activiti学习笔记(五) 流程部署

activiti流程部署

activit部署方法api

    activiti共有六种部署方式,最终实现都是DeploymentEntityImpl的addResource方法

public interface DeploymentBuilder {

  //根据流进行部署,获取bpmn文件的流进行部署,resourceName是资源名可以自定义
  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);

  //根据BpmnModel实例进行部署
  DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);
}

activiti部署前提

       预设某些情况有了bpmn文件,首先我们需要repositoryService这个实例,接下来进行部署使用的都是这个实例

@Before
	public void init() {
		processEngine = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource(
                        "com/activiti_study/ch10/activiti1.cfg.xml")
				.buildProcessEngine();

		repositoryService = processEngine.getRepositoryService();
	}

activiti部署过程

zip流部署

       这种方式是把其压缩成zip文件,然后进行部署

        @Test
	public void testAddZipInputStream() throws Exception {
		InputStream in = App.class.getClassLoader().getResourceAsStream(
                "com/activiti_study/ch10/common.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);
		DeploymentBuilder deployment = repositoryService.createDeployment();
		deployment.addZipInputStream(zipInputStream).deploy();

	}

普通流部署

    根据资源文件路径,获取其流,进行部署

        @Test
	public void testAddInputStream() throws Exception {
		DeploymentBuilder deployment = repositoryService.createDeployment();

		InputStream inputStream = App.class.getClassLoader()
				.getResource("com/activiti_study/ch10/common.bpmn")
				.openStream();
		deployment.addInputStream(resourceName, inputStream).deploy();
	}

根据资源文件路径进行部署

        @Test
	public void testAddClasspathResource() {
		DeploymentBuilder deployment = repositoryService.createDeployment();
		deployment.addClasspathResource(
                "com/activiti_study/ch10/common.bpmn").deploy();
	}

根据bpmnModel实例进行部署

        @Test
	public void testAddBpmnModel() {
		DeploymentBuilder deployment = repositoryService.createDeployment();
		BpmnModel bpmnModel = getBpmnModel();
		deployment.addBpmnModel(resourceName, bpmnModel).deploy();
	}
        private BpmnModel getBpmnModel() {
		BpmnModel bpmnModel = new BpmnModel();
		// 连线1
		SequenceFlow flow1 = new SequenceFlow();
		flow1.setId("flow1");
		flow1.setName("开始节点-->任务节点1");
		flow1.setSourceRef("start1");
		flow1.setTargetRef("userTask1");

		// 连线2
		SequenceFlow flow2 = new SequenceFlow();
		flow2.setId("flow2");
		flow2.setName("任务节点1-->任务节点2");
		flow2.setSourceRef("userTask1");
		flow2.setTargetRef("userTask2");

		// 连线3
		SequenceFlow flow3 = new SequenceFlow();
		flow3.setId("flow3");
		flow3.setName("任务节点2-->结束节点");
		flow3.setSourceRef("userTask2");
		flow3.setTargetRef("endEvent");
		// 开始节点
		StartEvent start = new StartEvent();
		start.setId("start1");
		start.setName("开始节点");
		start.setOutgoingFlows(Arrays.asList(flow1));
		// 任务节点1
		UserTask userTask1 = new UserTask();
		userTask1.setId("userTask1");
		userTask1.setName("任务节点1");
		userTask1.setIncomingFlows(Arrays.asList(flow1));
		userTask1.setOutgoingFlows(Arrays.asList(flow2));

		// 任务节点2
		UserTask userTask2 = new UserTask();
		userTask2.setId("userTask2");
		userTask2.setName("任务节点2");
		userTask2.setIncomingFlows(Arrays.asList(flow2));
		userTask2.setOutgoingFlows(Arrays.asList(flow3));
		//结束节点
		EndEvent endEvent = new org.activiti.bpmn.model.EndEvent();
		endEvent.setId("endEvent");
		endEvent.setName("结束节点");
		endEvent.setIncomingFlows(Arrays.asList(flow3));
		
		Process process=new Process();
		process.setId("process1");
		process.addFlowElement(start);
		process.addFlowElement(flow1);
		process.addFlowElement(flow2);
		process.addFlowElement(flow3);
		process.addFlowElement(userTask1);
		process.addFlowElement(userTask2);
		process.addFlowElement(endEvent);
		bpmnModel.addProcess(process);
		return bpmnModel;
	}








根据纯文本进行部署
        @Test
	public void testAddSrtring() {
		DeploymentBuilder deployment = repositoryService.createDeployment();
		String text = readTxtFile("E:/activitilearing/activiti-study/src/main/java/com/shareniu/activiti_study/ch10/common.bpmn");
		deployment.addString(resourceName, text).deploy();
	}


        public static String readTxtFile(String filePath) {
		StringBuffer stringBuffer = new StringBuffer();
		InputStreamReader read = null;
		try {
			String encoding = "UTF-8";// UTF-8编码
			File file = new File(filePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				read = new InputStreamReader(new FileInputStream(file),
						encoding);// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				while ((lineTxt = bufferedReader.readLine()) != null) {
					stringBuffer.append(lineTxt);
				}
				return stringBuffer.toString();
			} else {
				System.out.println("找不到指定的文件");
			}
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
		} finally {
			try {
				read.close();
			} catch (IOException e) {
			}
		}
		return "";
	}

 
activiti部署后表数据
       a)     act_re_deployment
      存放流程定义的显示名和部署时间,每部署一次增加一条记录
 
    b)    act_re_procdef
      存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
 
    c)    act_ge_bytearray
      存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

四、CLR执行程序集中代码和IL代码简介

三、加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及通过vs stdio设置源码编译的目...

2718
来自专栏敏捷开发&项目管理

Typemock揭示 安装其它三方软件可能引起冲突,那试试不安装直接引用它的DLL

这两天一直在搞typemock的问题,我的同事们都装的最新版7.3 没有问题,只有我老出现下面这个问题。 Exception rethrown at [0]:...

3266
来自专栏张善友的专栏

实现WCF和Unity 的集成

Artech 已经写过一篇[原创]WCF后续之旅(7):通过WCF Extension实现和Enterprise Library Unity Container...

1738
来自专栏大内老A

WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)

基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetadataBehavior需要做的更多额外的工作。原因很简单,由于在WS...

1669
来自专栏大内老A

WCF服务的批量寄宿

如果采用自我寄宿的方式,我们需要为每个寄宿的服务创建ServiceHost对象。但是一个应用往往具有很多服务需要被发布,基于单个服务的ServiceHost的创...

17810
来自专栏Java工程师日常干货

MyBatis+Spring MVC开发指南(二)前言高级映射延迟加载查询缓存MyBatis和Spring整合逆向工程

接《MyBatis+Spring MVC开发指南(一)》,本篇博客将涵盖MyBatis高级映射(一对一,一对多、多对多)、延迟加载、缓存原理分析(一级缓存、二级...

692
来自专栏WindCoder

Spring Boot REST API错误处理指南

本来是5号来的文章,无奈最近准备换工作,一直拖着没写,今天搜索偶然看见有人已经翻译完了,由于时间原因这次就直接转载下吧,现附上英文原文及相关信息,最后再附上译文...

262
来自专栏大内老A

ASP.NET Web API路由系统:Web Host下的URL路由

ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由...

2109
来自专栏大内老A

[WCF权限控制]WCF自定义授权体系详解[实例篇]

在《原理篇》中,我们谈到WCF自定义授权体系具有两个核心的组件:AuthorizationPolicy和ServiceAuthorizationManager,...

1847
来自专栏炸天帮5

win32进程概念之句柄表,以及内核对象.

我们知道.我们使用CreateProcess 的时候会返回一个进程句柄.以及线程句柄. 其实在调用CreateProcess的时候.内核中会新建一个EPROCE...

61

扫描关注云+社区