activiti工作流入门教程
- 工作流及activiti介绍
- activiti5 工作流开发环境搭建
- 在eclipse安装activiti-designer
- activiti工作流数据库表详细介绍(23张表)
- 初始化activiti数据库
- 使用配置文件初始化activiti数据库
- Activiti入门程序-画流程图
- Activiti入门程序-部署流程定义
- Activiti入门程序-启动流程实例
- Activiti入门程序-查看历史实例信息
- Activiti入门程序-查询正在执行人员的个人任务与完成任务
activiti进阶教程
知识点
相关文章
更多最近更新
更多深入了解Activiti工作流流程定义
2019-03-27 21:32|来源: 网路
部署流程定义
部署流程定义的流程:
1.
先获取流程引擎对象:在创建时会自动加载
classpath
下的
activiti.cfg.xml
2.
首先获得默认的流程引擎,通过流程引擎获取了一个
RepositoryService
对象(仓库对象)
3.
由仓库的服务对象产生一个部署对象配置对象,用来封装部署操作的相关配置。
4.
这是一个链式编程,在部署配置对象中设置显示名,上传流程定义规则文件
5.
向数据库表中存放流程定义的规则信息。
部署流程定义加载资源文件有两种方式
1、从
classpath
路径加载文件
deploymentBuilder.addClasspathResource("diagrams/hello.bpmn");
deploymentBuilder.addClasspathResource("diagrams/hello.png");
2、使用
zip
的输入流用作部署流程定义
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/hello.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
deploymentBuilder.addZipInputStream(zipInputStream);
注:打zip包的时候,不要有文件夹,直接对bpmn和png文件打包
示例:
@Test public void testDeploy() { /** * RepositoryService是Activiti的仓库服务类,流程定义和部署对象相关的Service * 所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片 */ RepositoryService repositoryService = processEngine.getRepositoryService(); // 创建一个部署对象DeploymentBuilder,用来定义流程部署的相关参数 DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); // 添加部署的名称 deploymentBuilder.name("流程定义"); // 第一种方式:添加hello.bpmn和hello.png // deploymentBuilder.addClasspathResource("diagrams/hello.bpmn"); // deploymentBuilder.addClasspathResource("diagrams/hello.png"); // // 第二种方式:通用zip文件 InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/hello.zip"); ZipInputStream zipInputStream = new ZipInputStream(in); deploymentBuilder.addZipInputStream(zipInputStream); // 部署流程定义 Deployment deployment = deploymentBuilder.deploy(); System.out.println("部署ID:" + deployment.getId());// 1 System.out.println("部署名称:" + deployment.getName());// activiti入门程序 }
部署流程定义操作的数据表
1、act_re_deployment
(部署对象表)
存放流程定义的显示名和部署时间,每部署一次增加一条记录
2、
act_re_procdef(流程定义表)
存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
注意:当流程定义的
key
相同的情况下,使用的是版本升级
3、
act_ge_bytearray(资源文件表)
存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于
bpmn
规则文件的,一条是图片的(如果部署时只指定了
bpmn
一个文件,
activiti
会在部署时解析
bpmn
文件内容自动生成流程图)。两个文件不是很大,都是以二进制形
式存储在数据库中。
4、act_ge_property(主键生成策略表)
查看流程定义
1.
流程定义和部署对象相关的
Service
都是
RepositoryService
。
2.
创建流程定义查询对象,可以在
ProcessDefinitionQuery
上设置查询的相关参数
3.
调用
ProcessDefinitionQuery
对象的
list
方法,执行查询,获得符合条件的流程定义列表
4.
由运行结果可以看出:
Key
和
Name
的值为:
bpmn
文件
process
节点的
id
和
name
的属性值
5.
key
属性被用来区别不同的流程定义。
6.
带有特定
key
的流程定义第一次部署时,
version
为
1
。之后每次部署都会在当前最高版本号上加
1
7.
Id
的值的生成规则为
:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},
这里的
generated-id
是一个自动生成的唯一的数字,由act_ge_property表生成的
next.dbid维护
8.
重复部署一次,
deploymentId
的值以一定的形式变化
示例:
/** 查询流程定义 */ @Test public void processDefinitionQueryTest() { RepositoryService service = processEngine.getRepositoryService(); /** * 创建一个流程定义的查询 * .list();返回一个集合 .singleResult();//返回惟一结果集 * .count();//返回结果集数量 * .listPage(firstResult, maxResults);//分页查询 */ ProcessDefinitionQuery pdq = service.createProcessDefinitionQuery(); // pdq.deploymentId(deploymentId)//使用部署对象ID查询 // pdq.processDefinitionId(processDefinitionId)//使用流程定义ID查询 // pdq.processDefinitionKey(processDefinitionKey)//使用流程定义的key查询 // pdq.processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询 pdq.orderByProcessDefinitionVersion().asc();// 按照版本的升序排列 // pdq.orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列 List<ProcessDefinition> list = pdq.list(); if (list != null && list.size() > 0) { for (ProcessDefinition pd : list) { // 流程定义的key+版本+随机生成数 System.out.println("流程定义ID:" + pd.getId()); // 对应hello.bpmn文件中的name属性值 System.out.println("流程定义的名称:" + pd.getName()); // 对应hello.bpmn文件中的id属性值 System.out.println("流程定义的key:" + pd.getKey()); // 当流程定义的key值相同的相同下,版本升级,默认1 System.out.println("流程定义的版本:" + pd.getVersion()); System.out.println("资源名称bpmn文件:" + pd.getResourceName()); System.out.println("资源名称png文件:" + pd.getDiagramResourceName()); System.out.println("部署对象ID:" + pd.getDeploymentId()); System.out.println("############################"); } } }
删除流程定义
因为删除的是流程定义,而流程定义的部署是属于仓库服务的,所以应该先得到
RepositoryService
如果该流程定义下没有正在运行的流程,则可以用普通删除。如果是有关联的信息,用级联删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。
示例:
/** 删除流程定义 */ @Test public void deleteProcessDefinition() { // 使用部署ID,完成删除 String deploymentId = "15001"; //不带级联的删除 只能删除没有启动的流程,如果流程启动,就会抛出异常 // processEngine.getRepositoryService().deleteDeployment(deploymentId); /** * 级联删除 不管流程是否启动,都能可以删除 */ processEngine.getRepositoryService().deleteDeployment(deploymentId, true); System.out.println("删除成功!"); }
获取流程定义文档的资源(查看流程图附件)
查询出流程定义文档。主要查的是图片,用于显示流程用。
1、deploymentId
为流程部署
ID
2、resourceName
为
act_ge_bytearray
表中
NAME_
列的值
3、使用
repositoryService
的
getDeploymentResourceNames
方法可以获取指定部署下得所有文件的名称
4、使用
repositoryService
的
getResourceAsStream
方法传入部署
ID
和资源图片名称可以获取部署下指定名称文件的输入流
5、最后的有关
IO
流的操作,使用
FileUtils
工具的
copyInputStreamToFile
方法完成流程流程到文件的拷贝,将资源文件以流的形式输出到指定文件夹下
示例:
/** 查看流程图 */ @Test public void viewPic() throws IOException { RepositoryService service = processEngine.getRepositoryService(); /** 将生成图片放到文件夹下 */ String deploymentId = "1"; // 获取图片资源名称 List<String> list = service.getDeploymentResourceNames(deploymentId); // 定义图片资源的名称 String resourceName = ""; if (list != null && list.size() > 0) { for (String name : list) { if (name.indexOf(".png") >= 0) { resourceName = name; } } } // 获取图片的输入流 InputStream in = service.getResourceAsStream(deploymentId, resourceName); // 将图片生成到D盘的目录下 File file = new File("D:/" + resourceName); // 将输入流的图片写到D盘下 FileUtils.copyInputStreamToFile(in, file); }
查询最新版本的流程定义
查询的思路:
1、使用流程定义的版本升序排列
2、创建LinkedHashMap<String, ProcessDefinition>,对相同key的进行覆盖
/***查询最新版本的流程定义*/ @Test public void findLastVersionProcessDefinition() { List<ProcessDefinition> list = processEngine.getRepositoryService() .createProcessDefinitionQuery()// .orderByProcessDefinitionVersion().asc()// 使用流程定义的版本升序排列 .list(); /** * Map<String,ProcessDefinition> * map集合的key:流程定义的key * map集合的value:流程定义的对象 * map集合的特点:当map集合key值相同的情况下,后一次的值将替换前一次的值 */ Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>(); if (list != null && list.size() > 0) { for (ProcessDefinition pd : list) { map.put(pd.getKey(), pd); } } List<ProcessDefinition> pdList = new ArrayList<ProcessDefinition>(map.values()); if (pdList != null && pdList.size() > 0) { for (ProcessDefinition pd : pdList) { System.out.println("流程定义ID:" + pd.getId()); System.out.println("流程定义的名称:" + pd.getName()); System.out.println("流程定义的key:" + pd.getKey()); System.out.println("流程定义的版本:" + pd.getVersion()); System.out.println("资源名称bpmn文件:" + pd.getResourceName()); System.out.println("资源名称png文件:" + pd.getDiagramResourceName()); System.out.println("部署对象ID:" + pd.getDeploymentId()); System.out.println("#########################################"); } } }
删除key相同的所有不同版本的流程定义
思路:把所有相同key的流程定义查出来,然后遍历删除
/**删除流程定义(删除key相同的所有不同版本的流程定义)*/ @Test public void deleteProcessDefinitionByKey() { // 流程定义的key String processDefinitionKey = "hello"; // 先使用流程定义的key查询流程定义,查询出所有的版本 List<ProcessDefinition> list = processEngine.getRepositoryService()// .createProcessDefinitionQuery()// .processDefinitionKey(processDefinitionKey)// 使用流程定义的key查询 .list(); // 遍历,获取每个流程定义的部署ID if (list != null && list.size() > 0) { for (ProcessDefinition pd : list) { // 获取部署ID String deploymentId = pd.getDeploymentId(); processEngine.getRepositoryService()// .deleteDeployment(deploymentId, true); } } }
本文部份内容参考网络
相关问答
更多-
java 的工作流框架 Activiti流程控制,一个流程走完了,如何触发最后的事件。[2022-09-08]
在pl/sql developer工具,也可以在其企业管理器中进去后中选sequence,然后新建,写上序列号名称seq,最小值写1,最大值不用管,开始于写1,增量是1,其它的默认就行了 sequence有两个用法,一个是得到后面一个值,一个是得到当前序列号的值 sequence.nextval得到是下一个序列号值 sequence.currval得到是当前序列号的值 你可以用select sequence.currval from seq 序列号建完后就入表里面插入 insert ... -
现在开发java工作流程序一般用什么框架?jbpm还是activiti?[2022-04-18]
一般是jbpm,请采纳 -
activiti工作流在tomcat重启后需要重新部署流程[2022-09-26]
试试 设置下processEngine 的asyncExecutorEnable -
activiti工作流删除流程定义时结果报错了 怎么解决[2024-02-28]
import java.io.InputStream; import java.util.List; import java.util.zip.ZipInputStream; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.Deployment; import org.activiti.engine.reposi ... -
activiti工作流 eclipse插件[2022-05-09]
1、先安装graphiti插件,地址:http://download.eclipse.org/graphiti/updates/0.9.0 2、再安装activiti插件,地址:http://activiti.org/designer/update/ -
寻求易协工作流程管理软件试用版下载地址?[2022-04-05]
下载页面: http://www.xdowns.com/soft/softdown.asp?softid=53673 下载地址: http://www.ecollab.com.cn/download/DemoCD.rar -
如何将Activiti流程定义作为子流程导入主流程?(How to import Activiti process definition as sub-process into master process?)[2022-05-14]
通过“导入”三个流程定义,您的意思是在执行父流程的过程中实例化它们? - >在这种情况下,在Activiti Designer Palette中查找“调用活动”并将其移动到父进程中。 选中后,在调用活动的“属性”选项卡中,您将找到一个属性“被调用元素”:这是您在父进程运行到调用活动时要调用的单独进程定义的ID。 在Activiti用户指南中,您将在此处找到,包括可视示例和基础XML表示的示例: http : //www.activiti.org/userguide/index.html#bpmnCallAc ... -
在Alfresco和Activiti之间选择工作流程解决方案?(Choose between Alfresco and Activiti for workflow solutions?)[2023-12-14]
Alfresco首先是一个存储库。 如果您需要存储文件的位置(存储文件的最终用户或存储文件的应用程序),您应该考虑使用Alfresco作为这些文件的存储库。 正如您所指出的,Alfresco已经嵌入了Activiti工作流引擎。 这包括一个包装引擎的抽象服务层,这样,对于许多操作,当使用Java或服务器端JavaScript时,您不需要了解很多关于Activiti的信息。 (显然,您需要知道如何定义BPMN 2.0流程定义以创建工作流)。 因此,如果您需要存储文件并且需要在业务流程中路由这些文件,那么Alf ... -
有没有什么好办法退回到activiti工作流程任务?(is there any nice way to step back in an activiti workflow task?)[2022-06-18]
在工作流程中没有“回头”的东西,它很好地反对...流程;)如果你不想给用户“退后一步”的可能性,你可以再次模拟额外的流程到同一个任务刚刚完成。 There is no such thing as 'going back' in workflow, it's well against.. the flow ;) If you wan't to give user the possibility to 'step back' you can model additional flows again to the ... -
从Activiti工作流程运行jboss-cli命令时出错(Error while running jboss-cli command from Activiti workflow)[2022-09-25]
通过在jboss-cli.sh中添加以下行解决了这个问题 JAVA_OPTS =“$ JAVA_OPTS -agentlib:jdwp = transport = dt_socket,address = 8790,server = y,suspend = n” 这里的地址可以是调试模式的任何端口。 Solved the issue by adding the below line in jboss-cli.sh JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=d ...