activiti addcommentlasspathresource路径怎么写

工作流Activiti的学习总结(二)activiti中ProcessEngine的创建和数据库表命名规则 - topMan'blog - ITeye技术网站
博客分类:
数据库表命名规则:
Activiti工作流引擎的数据库表中的表名称都是以 ACT_.第二部分两个字母表示表的类型。使用模糊匹配的方式说明表的类型匹配activiti的服务API.
ACT_RE_*: RE代表仓储(Repository).这种表前缀以“static”表示流程定义信息或者流程资源信息(如流程的图表和规则等).
ACT_RU_*: RU标识为运行(Runtime)时表。包含流程实例,用户任务和变量任务等在运行时的数据信息。这些表只存储Activiti在流程实例运行执行的数据,在流程结束的时候从表中去除数据。从而保持运行时候数据的表的快速和小数据量.
ACT_ID_*:ID标识为唯一(Identity)的。包含一些唯一的信息如用户,用户做等信息。
ACT_HI_*:HI表示历史数据(History)表,包括过期的流程实例,过期的变量和过期的任务等。
ACT_GE_*:GE表示公用(General data)的数据库表类型。
ProcessEngine接口中暴露了在BPMN和工作流中中所有操作的服务接口。
: 用户获取流程实例相关的各种运行时信息.
: 暴露服务用于操作人工操作的任务例如代办( claiming, completing and assigning tasks).
: 这个服务用于管理用户和用户组已经用户和用户组关系等的。
: 暴露引擎飞管理和主要操作。
服务暴露过期流程实例等信息。
在工作流流程引擎中可以通过配置。
ProcessEngineConfiguration配置一个流程引擎,在用户应用中创建一个流程引擎的可以通过多种方式:
1.基于默认的配置文件创建一个流程引擎:
ProcessEngine processEngine = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault()
.buildProcessEngine();
2.在缺少配置文件创建一个流程引擎
ProcessEngine processEngine = ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration()
.buildProcessEngine();
3.获取一个默认的流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
在工作流activiti的classpath路径中activiti.cfg.xml文件位于activiti-5.6\setup\files\cfg.activiti\standalone中。
Spring的配置内容如下:
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"&
&bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"&
&property name="jdbcUrl" value="jdbc:h2:mem:DB_CLOSE_DELAY=1000" /&
&property name="jdbcDriver" value="org.h2.Driver" /&
&property name="jdbcUsername" value="sa" /&
&property name="jdbcPassword" value="" /&
&property name="databaseSchemaUpdate" value="true" /&
&property name="jobExecutorActivate" value="false" /&
&property name="mailServerHost" value="mail." /&
&property name="mailServerPort" value="5025" /&
备注:上面activiti.cfg.xml配置必须spring,但是activiti工作流对spring并不是必须的。
通过编程方式使用配置文件
ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);
2.无配置 文件创建方式
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration()
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.setJdbcUrl("jdbc:h2:mem:my-own-DB_CLOSE_DELAY=1000")
.setJobExecutorActivate(true)
.buildProcessEngine();
org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration: 在独立方式运行的流程引擎使用。 Activiti需要使用事务对象。默认的情况下,在引擎启动的时候检查数据库将检查activiti的是否有schema和schema的版本是否正确. org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:
this is a convience class for unit testing purposes. Activiti will take care of the transactions. An H2 in-memory database is used by default. The database will be created and dropped when the engine boots and shuts down. When using this, probably no additional configuration is needed (except when using for example the job executor or mail capabilities). ( 测试环境中使用)
org.activiti.spring.SpringProcessEngineConfiguration:
To be used when the process engine is used in a Spring environment. See
for more information. (Spring环境中使用)
org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:
() to be used when the engine runs in standalone mode, with JTA transactions.(JPA环境中使用)
浏览 16197
longgangbai
浏览: 4551570 次
来自: 上海
MQTT集合了轻量级、低能耗、Pub/Sub模式以及专门针对不 ...
看了很多有关锁的文章,读完您的这篇,算是大彻大悟了
少工具包import mons. ...WFMS(工作流管理系统):
&&&&WFMC(工作流管理联盟):
示例项目下载
环境搭建:
& & FBI WARNING&两个视频,屏幕录像专家录制,非病毒,本站愿意承担责任,下载完文件请先核对MD5。
&&&&<span style="color:#.Eclipse配置Tomcat和部署WEB应用.exe(MD5:81c1dfb994ff5b2094ce0dac244da598)
&&&&<span style="color:#.Activiti项目搭建与Spring集成配置.exe(MD5:3debeec0a00dc061c782ca0cdcc97f7d)
项目搭建:
&&&&Maven项目POM
&!--&Jar版本管理&--&&&&&&properties&&&&&&&&&&springframework&4.0.2.RELEASE&/springframework&&&&&&&&&&hibernate&4.3.4.Final&/hibernate&&&&&&&&&&mysql.connector&5.1.29&/mysql.connector&&&&&&&&&&c3p0&0.9.1.2&/c3p0&&&&&&&&&&log4j&1.2.17&/log4j&&&&&&&&&&activiti&5.15.1&/activiti&&&&&&&&&&jstl&1.2&/jstl&&&&&&/properties&&&&&&&&&&&&&&dependencies&&&&&&&&&&!--&Spring&web&mvc&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&org.springframework&/groupId&&&&&&&&&&&&&&artifactId&spring-webmvc&/artifactId&&&&&&&&&&&&&&version&${springframework}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&Spring&framework&4中的orm包已经单独拿出来了,所以要和hibernate集成,需要此包&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&org.springframework&/groupId&&&&&&&&&&&&&&artifactId&spring-orm&/artifactId&&&&&&&&&&&&&&version&${springframework}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&提供JMS,Freemarker,Quartz集成服务&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&org.springframework&/groupId&&&&&&&&&&&&&&artifactId&spring-context-support&/artifactId&&&&&&&&&&&&&&version&${springframework}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&Hibernate&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&org.hibernate&/groupId&&&&&&&&&&&&&&artifactId&hibernate-core&/artifactId&&&&&&&&&&&&&&version&${hibernate}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&MySQL驱动&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&mysql&/groupId&&&&&&&&&&&&&&artifactId&mysql-connector-java&/artifactId&&&&&&&&&&&&&&version&${mysql.connector}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&连接池&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&c3p0&/groupId&&&&&&&&&&&&&&artifactId&c3p0&/artifactId&&&&&&&&&&&&&&version&${c3p0}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&log4j&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&log4j&/groupId&&&&&&&&&&&&&&artifactId&log4j&/artifactId&&&&&&&&&&&&&&version&${log4j}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&jstl&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&jstl&/groupId&&&&&&&&&&&&&&artifactId&jstl&/artifactId&&&&&&&&&&&&&&version&${jstl}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&activiti依赖&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&org.activiti&/groupId&&&&&&&&&&&&&&artifactId&activiti-engine&/artifactId&&&&&&&&&&&&&&version&${activiti}&/version&&&&&&&&&&/dependency&&&&&&&&&&!--&activiti&与&Spring&集成&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&org.activiti&/groupId&&&&&&&&&&&&&&artifactId&activiti-spring&/artifactId&&&&&&&&&&&&&&version&${activiti}&/version&&&&&&&&&&/dependency&&&&&&&&&&&&&&!--&junit&--&&&&&&&&&&dependency&&&&&&&&&&&&&&groupId&junit&/groupId&&&&&&&&&&&&&&artifactId&junit&/artifactId&&&&&&&&&&&&&&version&3.8.1&/version&&&&&&&&&&&&&&scope&test&/scope&&&&&&&&&&/dependency&&&&&&/dependencies&&&
与Spring集成:
&&&&activiti.cfg.xml&&&
&beans&xmlns=&http://www.springframework.org/schema/beans&&&&&&&&&&&&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&&&&&&&&&&&xsi:schemaLocation=&http://www.springframework.org/schema/beans&&&http://www.springframework.org/schema/beans/spring-beans.xsd&&&&&&&!--&Activiti处理引擎的配置,交由Spring管理&--&&&&&&&&bean&id=&processEngineConfiguration&&class=&org.activiti.spring.SpringProcessEngineConfiguration&&&&&&&&&&&&&&&&&!--&配置数据源,和系统使用同一个数据源&--&&&&&&&&&&&&&&&&property&name=&dataSource&&ref=&dataSource&&/&&&&&&&&&&&&&&&&property&name=&databaseSchemaUpdate&&value=&true&&/&&&&&&&&&&&&&&&&property&name=&jobExecutorActivate&&value=&false&&/&&&&&&&&&&&&&&&&!--&统一的事务管理&--&&&&&&&&&&&&&&&&property&name=&transactionManager&&ref=&transactionManager&&/&&&&&&&&&&&&&&&&property&name=&activityFontName&&&value=&宋体&&/&&&&&&&&&&&&&&&&property&name=&labelFontName&&&value=&宋体&&/&&&&&&&&/bean&&&&&&&&bean&id=&processEngine&&class=&org.activiti.spring.ProcessEngineFactoryBean&&&&&&&&&&&&&property&name=&processEngineConfiguration&&ref=&processEngineConfiguration&&/&&&&&&&&/bean&&&&&&&&&&&/beans&&&
activiti的API中,最终要的一个接口就是ProcessEngine??,获取到ProcessEngine的实例,就获取了activiti体系中的所有api。重要的接口如下:
ProcessEngine&processEngine&=&ProcessEngines.getDefaultProcessEngine();&&&&&&&&&RuntimeService&runtimeService&=&processEngine.getRuntimeService();&&&&RepositoryService&repositoryService&=&processEngine.getRepositoryService();&&&&TaskService&taskService&=&processEngine.getTaskService();&&&&ManagementService&managementService&=&processEngine.getManagementService();&&&&IdentityService&identityService&=&processEngine.getIdentityService();&&&&HistoryService&historyService&=&processEngine.getHistoryService();&&&&FormService&formService&=&processEngine.getFormService();&&
& & Activiti的服务框架如下
&&&&ActivitiController代码
package&org.xdemo.example.activiti.&&&&&&&&&import&java.awt.image.BufferedI&&&&import&java.io.IOE&&&&import&java.io.InputS&&&&import&java.util.HashM&&&&import&java.util.L&&&&import&java.util.M&&&&&&&&&import&javax.annotation.R&&&&import&javax.imageio.ImageIO;&&&&import&javax.servlet.http.HttpServletR&&&&&&&&&import&org.activiti.engine.ProcessE&&&&import&org.activiti.engine.RepositoryS&&&&import&org.activiti.engine.RuntimeS&&&&import&org.activiti.engine.TaskS&&&&import&org.activiti.engine.impl.cmd.GetDeploymentProcessDiagramC&&&&import&org.activiti.engine.&&&&import&org.activiti.engine.repository.ProcessD&&&&import&org.activiti.engine.runtime.ProcessI&&&&import&org.activiti.engine.task.T&&&&import&org.springframework.stereotype.C&&&&import&org.springframework.web.bind.annotation.RequestM&&&&import&org.springframework.web.bind.annotation.RequestM&&&&import&org.springframework.web.servlet.ModelAndV&&&&&&&&&@Controller&&&&@RequestMapping(&/process&)&&&&public&class&ActivitiController&{&&&&&&&&&&&&&@Resource&&&&&&&&ProcessEngine&&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(method&=&RequestMethod.GET)&&&&&&&&public&ModelAndView&list(ModelAndView&mav)&{&&&&&&&&&&&&mav.addObject(&list&,&Util.list());&&&&&&&&&&&&mav.setViewName(&process/template&);&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(&deploy&)&&&&&&&&public&ModelAndView&deploy(String&processName,&ModelAndView&mav)&{&&&&&&&&&&&&&&&&&RepositoryService&service&=&engine.getRepositoryService();&&&&&&&&&&&&&&&&&if&(null&!=&processName)&&&&&&&&&&&&&&&&service.createDeployment()&&&&&&&&&&&&&&&&&&&&&&&&.addClasspathResource(&diagrams/&&&#43;&processName).deploy();&&&&&&&&&&&&&&&&&List&ProcessDefinition&&list&=&service.createProcessDefinitionQuery()&&&&&&&&&&&&&&&&&&&&.list();&&&&&&&&&&&&&&&&&mav.addObject(&list&,&list);&&&&&&&&&&&&mav.setViewName(&process/deployed&);&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(&deployed&)&&&&&&&&public&ModelAndView&deployed(ModelAndView&mav)&{&&&&&&&&&&&&&&&&&RepositoryService&service&=&engine.getRepositoryService();&&&&&&&&&&&&&&&&&List&ProcessDefinition&&list&=&service.createProcessDefinitionQuery()&&&&&&&&&&&&&&&&&&&&.list();&&&&&&&&&&&&&&&&&mav.addObject(&list&,&list);&&&&&&&&&&&&mav.setViewName(&process/deployed&);&&&&&&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&@SuppressWarnings(&unchecked&)&&&&&&&&@RequestMapping(&start&)&&&&&&&&public&ModelAndView&start(String&id,&ModelAndView&mav)&{&&&&&&&&&&&&&&&&&RuntimeService&service&=&engine.getRuntimeService();&&&&&&&&&&&&&&&&&service.startProcessInstanceById(id);&&&&&&&&&&&&&&&&&List&ProcessInstance&&list&=&service.createProcessInstanceQuery()&&&&&&&&&&&&&&&&&&&&.list();&&&&&&&&&&&&&&&&&mav.addObject(&list&,&list);&&&&&&&&&&&&mav.setViewName(&process/started&);&&&&&&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(&started&)&&&&&&&&public&ModelAndView&started(ModelAndView&mav)&{&&&&&&&&&&&&&&&&&RuntimeService&service&=&engine.getRuntimeService();&&&&&&&&&&&&&&&&&List&ProcessInstance&&list&=&service.createProcessInstanceQuery()&&&&&&&&&&&&&&&&&&&&.list();&&&&&&&&&&&&&&&&&mav.addObject(&list&,&list);&&&&&&&&&&&&mav.setViewName(&process/started&);&&&&&&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(&task&)&&&&&&&&public&ModelAndView&task(ModelAndView&mav){&&&&&&&&&&&&TaskService&service=engine.getTaskService();&&&&&&&&&&&&List&Task&&list=service.createTaskQuery().list();&&&&&&&&&&&&mav.addObject(&list&,&list);&&&&&&&&&&&&mav.setViewName(&process/task&);&&&&&&&&&&&&return&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(&complete&)&&&&&&&&public&ModelAndView&complete(ModelAndView&mav,String&id){&&&&&&&&&&&&&&&&&&&&&&&&&TaskService&service=engine.getTaskService();&&&&&&&&&&&&&&&&&&&&&&&&&plete(id);&&&&&&&&&&&&&&&&&&&&&&&&&return&new&ModelAndView(&redirect:task&);&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@RequestMapping(&graphics&)&&&&&&&&public&void&graphics(String&definitionId,&String&instanceId,&&&&&&&&&&&&&&&&String&taskId,&ModelAndView&mav,&HttpServletResponse&response)&&&&&&&&&&&&&&&&throws&IOException&{&&&&&&&&&&&&&&&&&&&&&&&&&response.setContentType(&image/png&);&&&&&&&&&&&&Command&InputStream&&cmd&=&null;&&&&&&&&&&&&&&&&&if&(definitionId&!=&null)&{&&&&&&&&&&&&&&&&cmd&=&new&GetDeploymentProcessDiagramCmd(definitionId);&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&if&(instanceId&!=&null)&{&&&&&&&&&&&&&&&&cmd&=&new&ProcessInstanceDiagramCmd(instanceId);&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&if&(taskId&!=&null)&{&&&&&&&&&&&&&&&&Task&task&=&engine.getTaskService().createTaskQuery().taskId(taskId).singleResult();&&&&&&&&&&&&&&&&cmd&=&new&ProcessInstanceDiagramCmd(&&&&&&&&&&&&&&&&&&&&&&&&task.getProcessInstanceId());&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&if&(cmd&!=&null)&{&&&&&&&&&&&&&&&&InputStream&is&=&engine.getManagementService().executeCommand(cmd);&&&&&&&&&&&&&&&&int&len&=&0;&&&&&&&&&&&&&&&&byte[]&b&=&new&byte[1024];&&&&&&&&&&&&&&&&while&((len&=&is.read(b,&0,&1024))&!=&-1)&{&&&&&&&&&&&&&&&&&&&&response.getOutputStream().write(b,&0,&len);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}&&
&转载请注明来源:&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:373139次
积分:2008
积分:2008
排名:第16247名
原创:28篇
转载:36篇
评论:56条
(1)(2)(1)(1)(3)(2)(1)(2)(2)(4)(2)(3)(1)(4)(2)(6)(7)(5)(3)(3)(3)(9)博客频道 - CSDN.NET
什么是类型对象:创造一个类A来允许灵活的创造新的类,而类A的每个实例都代表了不同类型的对象。通俗地讲就是定义一个类型对象类和一个有类型的对象类。每个类型对象实例代表一种不同的逻辑类型。每种有...
24分钟前44
Java中参数传递是传值还是传引用呢?很多人遇到这个问题都会马上给你抛出这个例子:
class Entry{
public Entry(Integer ...
1小时前108
项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的。
简单描述下项目中用到的地方,比如说在web页需要用到登录的地方点击登录跳转到APP原生登录界面去登录,点击web页的拨打...
第8条:覆盖equals时请遵守通用的约定设计Object类的目的就是用来覆盖的,它所有的非final方法都是用来被覆盖的(equals、hashcode、clone、finalize)都有通用约定。...
1.内存的分配策略概述
程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、堆区和栈区。
静态存储区(方法区)...
想必大家都知道Java的基础数据类型有:char、byte、short、int、long、float、double、boolean 这几种,与C/C++等语言不同的是,Java的基础数...
1小时前146
播放器音视频同步及网络抖动解决方案
直接上代码看注释吧可能理解的更深刻一点:
音视频同步有三种,视频同步音频,音频同步视频,音视频同步到其他时钟,本文介绍视频同步音频,其他方式不适用。项目采用open...
1小时前215
List 包括 List接口以及List接口的所有实现类。因为 List 接口实现了 Collection 接口,所以 List 接口拥有 Collection 接口提供的所有方法,同时又因为 Lis...
3小时前281
国内唯一一篇全流程讲述生产环境中的JBOSS DROOLS是如何使用的教程,该教程弥补了官方教程灵碎、版本过于陈旧、API函数部分已经被废弃的一系列问题。因此这也是对JBOSS官方QUICK STAR...
3小时前353
GAN之父在NIPS 2016上做的报告:两个竞争网络的对抗(含译文全文PDF下载)作者:Ian Goodfellow翻译:七月在线DL翻译组译者:范诗剑 汪识瀚 李亚楠审校:管博士 寒小阳 加号责编...
3小时前546
Freeline简介在Android Studio还没推出Instant Run功能之前,每次修改Android 工程项目时都要将整个项目重新编译一次,然后再将资源和代码文件打包成APK文件传输到手机...
6小时前311
iOS基础——通过案例学知识之UITableView(上)对于UITableView的知识点特别多,因为它是iOS用得最多控件之一,我会尽我最大努力和语言的组织,将所有知识点介绍到位,今天要实现的效果...
6小时前224
6小时前396
自定义View是Android开发者必须了解的基础;而Path类的使用在自定义View绘制中发挥着非常重要的作用
网上有大量关于自定义View中Path类的文章,但存在一些问题:内容不全、思路不...
6小时前267
作为 Google 官方出版并维护的 IDE,被全球数以百万计的 Android 开发者钟爱并使用的开发工具,Android Studio,在前几天的三月二号,正式迎来了 2.3 稳定版的更新。身为 ...
6小时前257
从前有个山 山里有个庙 庙里有个和尚 。。。。。一年过去了。老和尚跟小和尚说,孩子时候下去见母老虎了,山下的女人是老虎,师傅有一个要求您要学会aidl,当时小和尚一听懵逼了,what this?这时老...
7小时前511
在 深入了解Android蓝牙Bluetooth——《基础篇》一篇中我们对蓝牙的各个版本的有了一个认识,蓝牙版本的历程及其优劣式介绍。那么接下来咱们就深入一点继续开车进入BLE的进及篇章。蓝牙BLE4...
7小时前379
近期参与到公司的一个华为项目中,从此项目中,学到不少。不过在项目中,发现项目经理在负责项目过程中还是有些缺陷。遂总结下,期望自己在以后的项目管理中可以避免这些情况
1.了解团队中各人的技能特长...
7小时前335
什么是蓝牙?
也可以说是蓝牙技术。所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的。利用“蓝牙”技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动...
8小时前524
TransactionTooLargeException 分析与解决
8小时前600
加载更多...
Programmer
Unity游戏开发程序员, 开源游戏引擎Cyclone2D作者。
大公司的高薪 OR 创业公司的期权,你更看重哪个?
大公司的高薪89%
创业公司的期权11%
专家公开课
讲师:曾亮
专家图书推荐
从事数据库研发、数据库架构、数据库技术管理等工作10余年;
历任人北京大金仓研发中...
Unity游戏开发程序员,
开源游戏引擎Cyclone2D作者。
项目地址:https...
熟悉Android应用开发,在手机、平板、电视终端有多年的开发经验。
职业关注Androi...
推荐知识库
热文排行榜
联系客服:
CSDN博客QQ群号:Activiti工作流(9)
相关代码参考gihub:
一、部署流程定义
&&& 前面的话,我们使用的是classpath加载资源文件方式来部署流程定义的,但是这种方式有局限性,只能适合小项目,固定写死的流程;
&&& 实际项目的话,需要来动态导入流程定义文件,通过把bpmn和png文件打包成zip压缩包,然后用户界面直接导入到系统,然后解析,部署流程定义;Activiti是支持这种方式的。今天我们来实现下这种方式;
首先第一步,把bpmn和png文件打成zip压缩包,放到diagrams文件夹下;
前面我们使用的是classpath加载流程定义文件;我们新建一个测试类 ProcessDefinition
package com.java1234.activiti.
import org.activiti.engine.ProcessE
import org.activiti.engine.ProcessE
import org.activiti.engine.repository.D
import org.junit.T
public class ProcessDefinition {
* 获取默认的流程引擎实例 会自动读取activiti.cfg.xml文件
private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
* 部署流程定义使用classpath方式
public void deployWithClassPath(){
// 获取部署对象
Deployment deployment=processEngine.getRepositoryService() // 部署Service
.createDeployment()
// 创建部署
.addClasspathResource(&diagrams/helloWorld.bpmn&)
// 加载资源文件
.addClasspathResource(&diagrams/helloWorld.png&)
// 加载资源文件
.name(&HelloWorld流程&)
// 流程名称
.deploy(); // 部署
System.out.println(&流程部署ID:&+deployment.getId());
System.out.println(&流程部署Name:&+deployment.getName());
这一步在数据库中将操作三张表:
& a).act_re_deployment(部署对象表)
&&& 存放流程定义的显示名和部署时间,每部署一次增加一条记录
& b).act_re_procdef(流程定义表)
&&& 存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
&&& 注意:当流程定义的key相同的情况下,使用的是版本升级
& c).act_ge_bytearray(资源文件表)
&&& 存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
下面我们用zip方式来实现,新建一个deployWithZip方法:
* 部署流程定义使用zip方式
public void deployWithZip(){
InputStream inputStream=this.getClass()
// 获取当前class对象
.getClassLoader()
// 获取类加载器
.getResourceAsStream(&diagrams/helloWorld.zip&); // 获取指定文件资源流
ZipInputStream zipInputStream=new ZipInputStream(inputStream); // 实例化zip输入流对象
// 获取部署对象
Deployment deployment=processEngine.getRepositoryService() // 部署Service
.createDeployment()
// 创建部署
.name(&HelloWorld流程2&)
// 流程名称
.addZipInputStream(zipInputStream)
// 添加zip是输入流
.deploy(); // 部署
System.out.println(&流程部署ID:&+deployment.getId());
System.out.println(&流程部署Name:&+deployment.getName());
}我们运行这个测试类:
SLF4J:&Failed&to&load&class&&org.slf4j.impl.StaticLoggerBinder&.
SLF4J:&Defaulting&to&no-operation&(NOP)&logger&implementation
SLF4J:&See&http://www.slf4j.org/codes.html#StaticLoggerBinder&for&further&details.
流程部署ID:7501
流程部署Name:HelloWorld流程2
说明已经部署成功了;
&&& 我们来看下相关表:这里我们再来把几个关键表拎出来,好好熟悉下:
act_re_deployment 流程定义部署表:
我们会发现,这里多了一条记录;
act_re_procdef 流程定义表
流程定义表里,我们发现VERSION_字段 版本升级了,KEY依然是一样的;
act_ge_bytearry 资源文件表
资源表里相应的多里两条记录;
这里再提一个表&act_ge_property 属性表
这里的next_dbid是主键策略,就是规定好了下一次生成的id就是10001;
2、查看 流程定义
/**查询流程定义*/
public void findProcessDefinition(){
List&ProcessDefinition& list = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
.createProcessDefinitionQuery()//创建一个流程定义的查询
/**指定查询条件,where条件*/
.deploymentId(deploymentId)//使用部署对象ID查询
.processDefinitionId(processDefinitionId)//使用流程定义ID查询
.processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
.processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询
.orderByProcessDefinitionVersion().asc()//按照版本的升序排列
.orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列
/**返回的结果集*/
.list();//返回一个集合列表,封装流程定义
.singleResult();//返回惟一结果集
.count();//返回结果集数量
.listPage(firstResult, maxResults);//分页查询
if(list!=null && list.size()&0){
for(ProcessDefinition pd:list){
System.out.println(&流程定义ID:&+pd.getId());//流程定义的key+版本+随机生成数
System.out.println(&流程定义的名称:&+pd.getName());//对应helloworld.bpmn文件中的name属性值
System.out.println(&流程定义的key:&+pd.getKey());//对应helloworld.bpmn文件中的id属性值
System.out.println(&流程定义的版本:&+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
System.out.println(&资源名称bpmn文件:&+pd.getResourceName());
System.out.println(&资源名称png文件:&+pd.getDiagramResourceName());
System.out.println(&部署对象ID:&+pd.getDeploymentId());
System.out.println(&#########################################################&);
流程定义ID:helloworld:1:4
流程定义的名称:helloworldProcess
流程定义的key:helloworld
流程定义的版本:1
资源名称bpmn文件:diagrams/helloWorld.bpmn
资源名称png文件:diagrams/helloWorld.png
部署对象ID:1
#########################################################
流程定义ID:helloworld:2:304
流程定义的名称:helloworldProcess
流程定义的key:helloworld
流程定义的版本:2
资源名称bpmn文件:diagrams/helloWorld.bpmn
资源名称png文件:diagrams/helloWorld.png
部署对象ID:301
#########################################################
流程定义ID:helloworld:3:404
流程定义的名称:helloworldProcess
流程定义的key:helloworld
流程定义的版本:3
资源名称bpmn文件:helloworld.bpmn
资源名称png文件:helloworld.png
部署对象ID:401
#########################################################
流程定义的查询,本质的话就是通过Activiti框架提供的API对act_re_procdef进行查询操作;
可以看到流程定义的key&#20540;相同的情况下,版本是从1开始逐次升级的
流程定义的Id是【key:版本:生成ID】
& 1).流程定义和部署对象相关的Service都是RepositoryService。
& 2).创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询的相关参数
& 3).调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表
& 4).由运行结果可以看出:Key和Name的&#20540;为:bpmn文件process节点的id和name的属性&#20540;
& 5).key属性被用来区别不同的流程定义。
& 6).带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1
& 7).Id的&#20540;的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id}, 这里的generated-id是一个自动生成的唯一的数字
& 8).重复部署一次,deploymentId的&#20540;以一定的形式变化
/***附加功能:查询最新版本的流程定义*/
public void findLastVersionProcessDefinition(){
List&ProcessDefinition& list = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.orderByProcessDefinitionVersion().asc()//使用流程定义的版本升序排列(可能存在多个集合)
* 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());//流程定义的key+版本+随机生成数
System.out.println(&流程定义的名称:&+pd.getName());//对应helloworld.bpmn文件中的name属性值
System.out.println(&流程定义的key:&+pd.getKey());//对应helloworld.bpmn文件中的id属性值
System.out.println(&流程定义的版本:&+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
System.out.println(&资源名称bpmn文件:&+pd.getResourceName());
System.out.println(&资源名称png文件:&+pd.getDiagramResourceName());
System.out.println(&部署对象ID:&+pd.getDeploymentId());
System.out.println(&#########################################################&);
3、删除流程定义
/**删除流程定义*/
public void deleteProcessDefinition(){
//使用部署ID,完成删除
String deploymentId = &601&;
* 不带级联的删除
只能删除没有启动的流程,如果流程启动,就会抛出异常
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId);
* 级联删除
不管流程是否启动,都能可以删除
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
System.out.println(&删除成功!&);
& 1).因为删除的是流程定义,而流程定义的部署是属于仓库服务的,所以应该先得到RepositoryService
& 2).如果该流程定义下没有正在运行的流程,则可以用普通删除。如果是有关联的信息,用级联删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。
/**附加功能:删除流程定义(删除key相同的所有不同版本的流程定义)*/
public void deleteProcessDefinitionByKey(){
//流程定义的key
String processDefinitionKey = &helloworld&;
//先使用流程定义的key查询流程定义,查询出所有的版本
List&ProcessDefinition& list = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
//遍历,获取每个流程定义的部署ID
if(list!=null && list.size()&0){
for(ProcessDefinition pd:list){
//获取部署ID
String deploymentId = pd.getDeploymentId();
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
4、查看流程图附件
& 查询出流程定义文档。主要查的是图片,用于显示流程用。
* 通过流程部署ID获取流程图图片
public void getImageById()throws Exception{
InputStream inputStream=processEngine.getRepositoryService()
.getResourceAsStream(&10001&, &helloWorld.png&); // 根据流程部署ID和资源名称获取输入流
FileUtils.copyInputStreamToFile(inputStream, new File(&D:/helloWorld.png&));
/**查看流程图
* @throws IOException */
public void viewPic() throws IOException{
/**将生成图片放到文件夹下*/
String deploymentId = &301&;
//获取图片资源名称
List&String& list = processEngine.getRepositoryService()//
.getDeploymentResourceNames(deploymentId);
//定义图片资源的名称
String resourceName = &&;
if(list!=null && list.size()&0){
for(String name:list){
if(name.indexOf(&.png&)&=0){
resourceName =
//获取图片的输入流
InputStream in = processEngine.getRepositoryService()//
.getResourceAsStream(deploymentId, resourceName);
//将图片生成到D盘的目录下
File file = new File(&D:/&+resourceName);
//将输入流的图片写到D盘下
FileUtils.copyInputStreamToFile(in, file);
& 1).deploymentId为流程部署ID
& 2).resourceName为act_ge_bytearray表中NAME_列的&#20540;
& 3).使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下得所有文件的名称
& 4).使用repositoryService的getResourceAsStream方法传入部署ID和资源图片名称可以获取部署下指定名称文件的输入流
& 5).最后的有关IO流的操作,使用FileUtils工具的copyInputStreamToFile方法完成流程流程到文件的拷贝,将资源文件以流的形式输出到指定文件夹下
&&& 首先说下结论,流程定义是不能修改的;这里举例子,假如一个流程定义的流程实例在活动运行中。假如可以修改,本来要流转到A这个节点,因为流程定义修改了,流转到B这个节点。就不符合当时这个流程实例的初衷了;所以一般开发的话,不能修改流程定义,我们是通过增加版本号的方式。来实现“修改”的;
Deployment&& 部署对象
1、一次部署的多个文件的信息。对于不需要的流程可以删除和修改。
2、对应的表:
& act_re_deployment:部署对象表
& act_re_procdef:流程定义表
& act_ge_bytearray:资源文件表
& act_ge_property:主键生成策略表
ProcessDefinition 流程定义
1、解析.bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:207702次
积分:4555
积分:4555
排名:第5332名
原创:245篇
评论:35条
(6)(8)(9)(17)(20)(25)(13)(36)(5)(72)(17)(1)(17)(10)(5)(3)

我要回帖

更多关于 crsctl add resource 的文章

 

随机推荐