在使用activiti工作流之前,我们得先画一个工作流流程,它会生成两个文件,一个是bpmn文件,一个是png文件。流程定义的部署,完全是根据这两个流程文件来进行的。
以一个简单的流程为例:
部署流程定义一共有3个不同的方法,但是原理相同,都是读取刚刚画的两个流程文件。
第一种创建流程定义的方法就是用classpath的方法,也就是读取这两个文件来创建:
需要注意的是,一个流程定义之后不能修改,如果想启用新的流程定义,就得新创建一个新的,等旧的执行完之后再部署启用。
代码如下:
/**部署流程定义(从classpath)*/ @Test public void deploymentProcessDefinition_classpath(){ Deployment deployment =processEngine.getRepositoryService()//与流程定义和部署对象相关的service .createDeployment()//创建一个部署对象 .name("流程定义")//添加部署的名称 .addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载,一次只能加载一个文件 .addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载,一次只能加载一个文件 .deploy();//完成部署 System.out.println(deployment.getId()); System.out.println(deployment.getName()); } |
第二种方法是将两个流程文件压缩成zip,然后进行部署到的:
代码如下:
/**将bpmn文件和png文件压缩成zip文件之后,用zip文件部署流程定义*/ @Test public void deploymentProcessDefinition_zip(){ InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip"); ZipInputStream zipInputStream =new ZipInputStream(in); Deployment deployment =processEngine.getRepositoryService()//与流程定义和部署对象相关的service .createDeployment()//创建一个部署对象 .name("流程定义")//添加部署的名称 .addZipInputStream(zipInputStream)//指定zip格式的文件完成部署 .deploy();//完成部署 System.out.println(deployment.getId()); System.out.println(deployment.getName()); } |
第三种方法是使用输入流的方法读取流程文件:
首先要知道读取输入流的方法,一共有3种:
this.getClass().getClassLoader().getResourceAsStream("testVariables.bpmn");//从classpath根目录下加载指定名称的文件 this.getClass().getResourceAsStream("testVariables.bpmn");//从当前包下加载指定名称的文件 this.getClass().getResourceAsStream("/testVariables.bpmn");//从calsspath根目录下加载指定名称的文件 |
接下来就是部署流程定义的方法:
/**用Inputstream方法来部署流程定义*/ @Test public void deploymentProcessDefinition_inputStram(){ //因为这里我的测试类和pbmn在同一个目录下,所以不用getClassLoader InputStream inputStreambpmn =this.getClass().getResourceAsStream("/diagrams/processVariables.pbmn"); InputStream inputStreampng =this.getClass().getResourceAsStream("/diagrams/processVariables.png"); Deployment deployment =processEngine.getRepositoryService()//与流程定义和部署对象相关的service .createDeployment()//创建一个部署对象 .name("流程定义")//添加部署的名称 .addInputStream("processVariables.pbmn",inputStreambpmn)//使用资源文件的名称(要求:与资源文件名称一致),输入流完成部署 .addInputStream("processVariables.png",inputStreampng)//使用资源文件的名称(要求:与资源文件名称一致),输入流完成部署 .deploy();//完成部署 System.out.println(deployment.getId()); System.out.println(deployment.getName()); } |
部署流程定义之后,就可以启动一个流程实例,然后各个角色就可以执行各自的任务了。