可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种:

Fatal  error  warn  info  debug  trace

一、部署流程定义

1,在工程项目下创建源码文件夹process

2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram)

3,在test1.bpmn文件定义请假流程或者是报销流程

4,测试代码

  1. public class ActivitiAPI {
  2. //首先获得默认的流程引擎,在创建时会自动加载classpath下得activiti.cfg.xml或者是activiti-context.xml
  3. ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
  4. /**
  5. * 1.部署流程定义
  6. * 会在三张表中产生数据:
  7. * act_ge_bytearray 产生两条数据
  8. *act_re_deployment 产生一条数据
  9. *act_re_procdef 产生一条数据
  10. * 方式一:读取单个的流程定义文件
  11. * 方式二:读取zip压缩文件
  12. */
  13. @Test
  14. public void deploy() {
  15. // 获取仓库服务并创建发布配置对象
  16. DeploymentBuilder deploymentBuilder = processEngine
  17. .getRepositoryService().createDeployment();
  18. // 方式一:设置发布信息
  19. deploymentBuilder.name("请假流程部署");//添加部署规则的名称
  20. // 读取单个的流程定义文件
  21. deploymentBuilder.addClasspathResource("test1.bpmn");
  22. // 添加规则图片  不添加会自动产生一个图片不推荐
  23. deploymentBuilder.addClasspathResource("test1.png");
  24. Deployment
  25. deployment =deploymentBuilder.deploy();
  26. // 方式二:读取zip压缩文件
  27. /*ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
  28. .getClassLoader().getResourceAsStream("process.zip"));
  29. deploymentBuilder.addZipInputStream(zipInputStream);
  30. Deployment deployment =deploymentBuilder.deploy();*/
  31. }
  32. }

部署流程定义步骤:

  1)     首先获得默认的流程引擎getDefaultProcessEngine(),在创建时会自动加载classpath下得activiti-context.xml或者是activiti.cfg.xml

  2)     通过流程引擎获取了一个RepositoryService对象也就是仓库服务对象

  3)     由仓库的服务对象创建一个部署对象配置对象,用来封装部署环境的相关配置。

  4)     这是一个链式编程,在部署配置对象中设置显示名,上传规则文件相对classpath的地址。

  5)     部署,也是往数据库中存储流程定义的过程。

  6)     这一步在数据库中将操作三张表:

    a)     act_re_deployment

     存放流程定义的显示名和部署时间,每部署一次增加一条记录

    b)     act_re_procdef

     存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。

    c)     act_ge_bytearray

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

二、查询流程定义

  1. /**
  2. * 查询流程定义列表
  3. */
  4. @Test
  5. public void queryProcessDefinition(){
  6. // 流程定义查询对象,用于查询表act_re_procdef,添加条件查询
  7. ProcessDefinitionQuery query = processEngine.getRepositoryService()
  8. .createProcessDefinitionQuery();
  9. // 添加过滤条件
  10. query.processDefinitionKey("bxlc");
  11. // 添加排序条件降序排序
  12. query.orderByProcessDefinitionVersion().desc();
  13. // 添加分页查询
  14. query.listPage(0, 10);
  15. List<ProcessDefinition> list =query.list();
  16. for(ProcessDefinition pd : list) {
  17. System.out.println(pd.getName()+ "" + pd.getId());
  18. }
  19. }

流程定义查询步骤:

 1)     因为流程定义的信息存放在仓库中,所以应该获取RepositoryService。

  2)     创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询过滤参数

  3)     调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表

  4)     由运行结果可以看出:

    a)     Key和Name的值为:bpmn文件process节点的id和name的属性值

    b)     key属性被用来区别不同的流程定义。

    c)     带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1

 d)     Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字

    e)     重复部署一次,deploymentId的值以一定的形式变化

三、删除流程定义

  1. /**
  2. * 删除流程定义(通过删除部署信息达到删除流程定义的目的)
  3. *删除act_re_procdef和act_re_deployment表中的一条记录
  4. */
  5. @Test
  6. public void delDeployment() throwsException {
  7. // 获取仓库服务对象
  8. RepositoryService repositoryService =processEngine.getRepositoryService();
  9. // 删除发布信息
  10. String deploymentId = "1";
  11. // 普通删除,如果当前规则下有正在执行的流程,则抛异常
  12. repositoryService.deleteDeployment(deploymentId);
  13. // 级联删除,会删除和当前规则相关的所有信息,包括历史
  14. repositoryService.deleteDeployment(deploymentId, true);
  15. }

四、启动流程实例

什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系),比如:已经定义了一个请假流程,张三同学走了一次该流程这就是启动一次流程实例

  1. /**根据流程定义的id启动一个流程实例,这个流程定义的Id来自act_re_procdef
  2. * 启动一次流程实例act_ru_execution表增加一条数据
  3. */
  4. @Test
  5. public void startProcessInstance() {
  6. //获取流程定义ID
  7. /*
  8. *String processDefinitionId = "qjlc:9:1204"; ProcessInstance
  9. *processInstance =
  10. *processEngine.getRuntimeService().startProcessInstanceById
  11. * (processDefinitionId );System.out.println(processInstance.getId());
  12. */
  13. //自动选择最新版本的流程定义启动流程实例建议使用key来启动
  14. String processDefinitionKey = "qjlc";
  15. ProcessInstance processInstance = processEngine.getRuntimeService()
  16. .startProcessInstanceByKey(processDefinitionKey);
  17. System.out.println(processInstance.getId());
  18. }

五、查询流程实例列表

  1. /**
  2. * 查询流程实例列表,查询act_ru_execution表
  3. */
  4. @Test
  5. public void queryProcessInstance(){
  6. //流程实例查询对象,查询act_ru_execution表
  7. ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
  8. query.processDefinitionKey("qjlc");
  9. query.orderByProcessInstanceId().desc();
  10. query.listPage(0, 2);
  11. List<ProcessInstance> list =query.list();
  12. for(ProcessInstance pi : list) {
  13. System.out.println(pi.getId()+ " " + pi.getActivityId());
  14. }
  15. }

六、结束流程实例

  1. /**
  2. * 结束流程实例,操作的表
  3. * 执行表:act_ru_execution(删除一条数据)
  4. * 任务表 act_ru_task(删除一条数据)
  5. */
  6. @Test
  7. public void deleteProcessInstance(){
  8. String processInstanceId = "1601";
  9. processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "我愿意");
  10. }

七、查询部署信息

  1. /**
  2. * 查询部署列表(同一个流程定义因为修改会进行多次的部署,版本号不一样version会增加,每次部署act_re_deployment表增加一条记录)
  3. */
  4. @Test
  5. public void queryDeployment() {
  6. // 部署查询对象,查询表act_re_deployment
  7. DeploymentQuery query = processEngine.getRepositoryService()
  8. .createDeploymentQuery();
  9. List<Deployment> list =query.list();
  10. for (Deploymentdeployment : list) {
  11. String id = deployment.getId();
  12. System.out.println(id);
  13. }
  14. }

八、删除部署信息

  1. /**
  2. * 删除部署信息,删除act_re_procdef和act_re_deployment表中的一条记录
  3. */
  4. @Test
  5. public void deleteDeployment() {
  6. String deploymentId = "101";
  7. // processEngine.getRepositoryService().deleteDeployment(deploymentId);
  8. //true代表删除级联关联表信息
  9. processEngine.getRepositoryService().deleteDeployment(deploymentId,
  10. true);
  11. }

九、查询一次流程部署对应的文件名称(bpmn,png)和输入流

  1. /**
  2. * 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn,png)
  3. * @throws Exception
  4. */
  5. @Test
  6. public void queryProcessFile() throws Exception {
  7. String deploymentId = "101";
  8. List<String> names = processEngine.getRepositoryService()
  9. .getDeploymentResourceNames(deploymentId);
  10. for (String name :names) {
  11. System.out.println(name);
  12. InputStream in = processEngine.getRepositoryService()
  13. .getResourceAsStream(deploymentId,name);
  14. // 将文件保存到本地磁盘
  15. /*
  16. * OutputStream out = new FileOutputStream(newFile("d:\\" + name));
  17. * byte[] b = new byte[1024]; int len= 0; while((len =
  18. * in.read(b))!=-1) { out.write(b, 0, len);} out.close();
  19. */
  20. //使用org.apache.commons.io.FileUtils的工具类
  21. FileUtils.copyInputStreamToFile(in,new File("d:\\" + name));
  22. in.close();
  23. }
  24. }

十、获取流程定义图标(png文件)

  1. /**
  2. * 获得png文件的输入流
  3. *
  4. * @throws Exception
  5. */
  6. @Test
  7. public void getPng() throws Exception {
  8. String processDefinitionId = "qjlc:9:1204";
  9. InputStream pngInputStream = processEngine.getRepositoryService()
  10. .getProcessDiagram(processDefinitionId);
  11. FileUtils.copyInputStreamToFile(pngInputStream,new File("d:\\my.png"));
  12. }

十一、      查询个人任务列表

  1. /**
  2. * 查询任务列表查询act_ru_task表
  3. */
  4. @Test
  5. public void queryTask() {
  6. TaskQuery query= processEngine.getTaskService().createTaskQuery();
  7. String assignee = "张三";
  8. query.taskAssignee(assignee);
  9. query.orderByTaskCreateTime().desc();
  10. List<Task> list = query.list();
  11. for (Task task :list) {
  12. System.out.println(task.getId()+ " " + task.getName());
  13. }
  14. }

十二、      办理任务

  1. /**
  2. * 办理任务
  3. */
  4. @Test
  5. public void completeTask(){
  6. String taskId= "404";
  7. processEngine.getTaskService().complete(taskId);
  8. }

十三、      直接将流程想下执行一步管理员用户拥有该权限

    1. /**
    2. * 直接将流程向下执行一步act_ru_task表增加一条数据,直接跳过一步
    3. */
    4. @Test
    5. public void signal(){
    6. String executionId = "2701";//流程实例id
    7. processEngine.getRuntimeService().signal(executionId);
    8. }

Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作的更多相关文章

  1. Activiti工作流框架学习笔记(二)之springboot2.0整合工作流Activiti6.0

    以前在工作当中做过不少与工作流Activiti有关的工作,当时都是spring集成activiti5.22的项目,现在回过头去看,其实版本已经稍微老了,因此,基于先前的工作经验,决定用较新版本的技术来 ...

  2. Activiti工作流框架学习(一)——环境的搭建和数据表的了解

    一.什么是工作流 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...

  3. Activiti工作流框架学习(一)之通用数据表详细介绍

    文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其 ...

  4. activiti工作流引擎学习(二)

    1.连线 如果bpmn文件和java文件放在同一目录下,需要配置buildPath: 使用流程变量,设置连线需要的流程变量的名称,并设置流程变量的值,流程会按照指定的连线完成任务. 1.1一个活动中可 ...

  5. activiti工作流入门学习

    工作流一般在OA系统用的比较多,当然,只要有流程审批的地方都会用到,activiti只是开源的工作流中比较流行的一个,还有其他的开源的工作流,这里学习activiti工作流:前面部分是关于activi ...

  6. 项目结合activiti工作流框架使用

    项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置 ...

  7. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  8. activiti工作流框架简介

    常见的工作流框架:activiti, JBPM, OSWorkflow activiti框架基于23张基础的表数据, 基于Mybatis操作数据库. JBPM框架基于18张基础的表数据, 基于hibe ...

  9. Activiti工作流框架——快速上手

        一.前言 最近在做公司的OA,里面有用到工作流,公司用的是 jbpm4,感觉比较老,资料有点少,就先学学 新一点的 activiti  ㄟ(▔▽▔)ㄏ 首先工作流的概念是:工作流(Workfl ...

随机推荐

  1. HDU 2222 Keywords Search(AC自己主动机模板题)

    题意:给出一个字符串和若干个模板,求出在文本串中出现的模板个数. 思路:由于有可能有反复的模板,trie树权值记录每一个模板出现的次数就可以. #include<cstdio> #incl ...

  2. mysql-增删改数据

    一.增加操作 INSERT用来插入或添加行到数据库表的.插入用以下几种方式: 1.插入完整的行 insert into customers values(null,'Pep E,LaPew','100 ...

  3. UE4 中的人工智能解析—ShooterGame为例

    在UE4编辑器中,打开内容浏览器,右击鼠标,创建传说中的行为树: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQTM2MzA2MjM=/font/5a6L ...

  4. Opencv(3.0.0beta)+Python(2.7.8 64bit) 简单具体,一遍成功

    看到非常多配置的文章,都没法正常走完流程 使用到的资源,都是今天为止最新的: python-2.7.8.amd64.msi opencv-3.0.0-beta.exe numpy-MKL-1.9.1. ...

  5. h5登录

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv="Con ...

  6. hdoj--1312--Red and Black(dfs)

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. uwsgi和wsgi

    一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给浏览器: 浏览器收到HTTP响应,从HTTP Bo ...

  8. Frame Stacking ZOJ 1083,poj 1128

    Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4034   Accepted: 1352 De ...

  9. Windows 相关

    Open the Windows Update troubleshooter If your computer is having problems finding and installing op ...

  10. button click event in jqxgrid jqwidgets

    button click event in jqxgrid jqwidgets http://www.jqwidgets.com/jquery-widgets-demo/demos/jqxgrid/p ...