Activiti Exploer工作流控制台使用指南!使用Activiti Explorer定义部署执行工作流
Activiti Explorer简介
- Activiti Explorer: Activiti控制台,是一个web应用程序
- 从Activiti的官方网站下载Activiti的压缩zip文件时,Activiti控制台在 ${Activiti_home}/wars文件夹下面
- 该控制台的目的并不是创建一个完善的web应用程序,仅仅是为客户端用户准备的应用程序.对于该控制台,使用了一个内存数据库,也可以换成自定义的数据库(查看WEB-INF文件夹下面的applicationContext.xml文件)
- 登录控制台,有四个主要功能模块:
- Tasks: 任务管理功能
- 如果是任务执行人,可以看见运行中流程实例的待办任务,也可以拾取组任务
- 控制台涉及的功能有子任务的工作,不同角色的人...
- 控制台允许创建一个独立的任务,该任务不需要关联任何流程实例
- Processes: 显示部署的流程定义列表,并且可以启动一个新的流程实例
- Reports: 生成报表和显示之前保存历史的结果数据
- Manage: 用于管理Activiti的流程引擎
- 管理用户和组
- 执行和查看停止的jobs
- 查看数据库和部署新的流程定义
- 登录的用户具有超级管理员权限才会显示
- Tasks: 任务管理功能
流程图
- 控制台包含的功能,使用RaphaëlJavascript框架自动生成一张流程图:
- 当流程定义XML包含的BPMN注入信息时,该流程图才能够生成
- 当流程定义XML中并没有BPMN注入信息,但是部署的时候包含一张流程图,那么该图片也将会被显示
- 如果不想使用Javascript生成流程图,可以在ui.properties文件禁用
activiti.ui.jsdiagram = false
- 控制台上显示流程图,也可以对流程图进行查看,根据流程定义的ID,显示流程定义图片:
http://localhost:8080/activiti-explorer/diagram-viewer/index.html?processDefinitionId=reviewSaledLead:1:36
- 通过processInstanceId的请求参数,可以显示当前流程实例的状态:
http://localhost:8080/activiti-explorer/diagram-viewer/index.html?processDefinitionId=reviewSaledLead:1:36&processInstanceId=41
Tasks
- 任务
- Inbox: 显示登录用户需要办理的所有任务列表
- My Tasks: 显示登录用户任务拥有者的任务列表:
- 当创建一个独立的任务时,可以自动化操作该任务
- Queued: 显示不用的组任务列表,并且登录用户在该组中:
- 这里的所有任务都必须先拾取,然后才能够完成
- Involved: 显示登录用户被参与的任务,即不是执行人和任务拥有者
- Archived: 归档,包含已经完成历史任务
Processes
Deployed process definitions(部署流程定义)
- 在流程定义选项卡中,允许查看Activiti流程引擎部署的所有流程定义
- 可以使用页面顶部右边的按钮启动一个新的流程实例
- 如果该流程定义有一个启动表单, 那么在启动流程实例之前就会先显示表单
My instances(我的流程实例)
- 显示当前登录用户未完成的用户任务的所有流程实例
- 直观地显示流程实例的当前活动和存储的流程变量
Manage
- 在管理功能中,只有当登录用户是权限组admin中的成员时,该功能才会显示
- 当点击Manage图标按钮:
Database
- Database: 数据库.显示Activiti有关内容.当开发流程或者排除故障等问题的时候是非常有用的
Deployments
- Deployments: 部署.显示当前部署的流程引擎,并且可以看到部署的内容:流程定义,流程图,业务规则,等等...
- 当点击部署按钮时,可以上传新的部署:
- 从自己的计算机中选择一个业务文档或者一个BPMN20.XML文件
- 简单的拖拽到指定的区域就可以部署一个新的业务流程
Jobs
- Jobs: 作业
- 在左边显示当前的作业(定时器等等)并且运行手动执行(例如在截止时间之前触发定时器)
- 如果作业执行失败(例如邮件服务器不能正常工作),那么就会显示所有的异常
Users
- Users: 管理用户
- 创建,修改和删除用户.关联用户
- 获取权限查看任务分配特定用户信息
Groups
- Groups: 管理组
- 创建,修改和删除组,关联组
- 获取权限查看任务分配特定组等信息
Reports
- 报表:
- 注意: 如果要让报表工作,控制台需要配置历史的级别不能为none.默认的配置是满足要求的
- 报表选项卡的子选项卡有2个:
- 生成报表:
- 显示系统中已知的报表列表
- 允许运行生成的报表
- 保存报表:
- 显示之前保存的所有报表列表
- 仅仅显示的是个人保存的报表,并且不能看见其他人保存的报表
- 生成报表:
- 流程的数据被用于生成报表中的列表和图标.使用流程生成报表数据的优势:
- 该流程能够直接访问Activiti流程引擎的内部:
- 直接可以使用流程引擎访问数据库
- 作业执行器能够用于任何其他的流程:
- 能够异步生成流程
- 仅仅异步执行某些步骤
- 可以使用定时器:在某些时间点上面生成报表数据
- 可以用已知的工具和已知的概念创建一个新的报表:
- 没有新的概念,服务或者应用被需要
- 部署或者上传一个新的报表与部署一个新的流程是一样的
- 可以使用BPMN2.0结构:
- 意味着所有的东西:比如并行网关,可以实现基于数据或用户请求输入生成分支
- 该流程能够直接访问Activiti流程引擎的内部:
- 生成报表数据的流程定义需要把activiti-report设置为分类,这样就能在Explorer的报表列表中显示出来。
- 能够看到报表的唯一要求是:
- 流程创建一个名为reportData的流程变量,这个变量必须是json对象的二进制数组
- 变量必须保存到Activiti的历史表中,所以要求引擎必须启用历史功能
- 因此可以在后面报表保存时获取
reportData
- 报表流程必须生成一个变量reportData, 作为展示给用户的JSON数据:
{
"title": "My Report",
"datasets": [
{
"type" : "lineChart",
"description" : "My first chart",
"xaxis" : "Year"
"yaxis" : "Total sales"
"data" :
{
"2010" : 50,
"2011" : 33,
"2012" : 17,
"2013" : 87,
}
}
]
}
json数据会在Explorer中获取,并用来生成图表或列表
- json的元素有:
- title: 报表的标题
- datasets: 数据集的数组,对应报表中不同的图表和列表
- type: 数据集的类型. 这个类型会用来决定如何渲染数据,支持的值:
- pieChart
- lineChart
- barChart
- list
- description: 每个图表在报表中显示一个描述,这个是可选的
- xaxis: 只对lineChart类型起作用,这个参数是可选的,用来修改图表坐标系x轴的名称
- yaxis: 只对lineChart类型起作用,这个参数是可选的,用来修改图表坐标系y轴的名称
- data: 实际的数据,数据是一个key:value格式的json对象
流程实例
- 流程实例总览报表:
- 只包含一个脚本任务:使用javascript生成json数据集
- 虽然所有Explorer中的例子都使用javascript, 也可以使用java服务任务
- 执行流程最后的结果就是reportData变量,保存数据
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="activiti-report">
<process id="process-instance-overview-report" name="Process Instance Overview" isExecutable="true">
<startEvent id="startevent1" name="Start" />
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="generateDataset" />
<scriptTask id="generateDataset" name="Execute script" scriptFormat="JavaScript" activiti:autoStoreVariables="false">
<script><![CDATA[
importPackage(java.sql);
importPackage(java.lang);
importPackage(org.activiti.explorer.reporting);
var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_");
var reportData = {};
reportData.datasets = [];
var dataset = {};
dataset.type = "pieChart";
dataset.description = "Process instance overview (" + new java.util.Date() + ")";
dataset.data = {};
while (result.next()) { // process results one row at a time
var name = result.getString(1);
var version = result.getLong(2)
var count = result.getLong(3);
dataset.data[name + " (v" + version + ")"] = count;
}
reportData.datasets.push(dataset);
execution.setVariable("reportData", new java.lang.String(JSON.stringify(reportData)).getBytes("UTF-8"));
]]></script>
</scriptTask>
<sequenceFlow id="flow3" sourceRef="generateDataset" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
- 除了流程xml顶部的标准xml,主要区别是targetNamespace设置为activiti-report, 把分类设置为与部署的流程定义一样的名称
- 脚本的第一行是进行一些导入,避免每次使用时,都要写包名
- 第一个有意义的代码是使用ReportingUtil读取activiti数据库.返回结果是一个JDBC 结果集
- 查询语句下面 ,javascript创建了使用的json.json是符合上面描述的需求的
- 最后一行脚本,首先需要把json对象转换成字符串,使用javascript函数JSON.stringify(). 字符串需要保存为二进制数组类型的变量
- 这是一个技术问题:
- 二进制数组的大小是无限的,但是字符串的长度有限制
- 这就是为什么javascript字符串必须转换成一个java字符串以获得转换成二进制的功能
- 这是一个技术问题:
- 原生json功能无法使用,这里提供了一些帮助类ReportData和Dataset:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="activiti-report">
<process id="process-instance-overview-report" name="Process Instance Overview" isExecutable="true">
<startEvent id="startevent1" name="Start" />
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="generateDataset" />
<scriptTask id="generateDataset" name="Execute script" scriptFormat="js" activiti:autoStoreVariables="false">
<script><![CDATA[
importPackage(java.sql);
importPackage(java.lang);
importPackage(org.activiti.explorer.reporting);
var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_");
var reportData = new ReportData;
var dataset = reportData.newDataset();
dataset.type = "pieChart";
dataset.description = "Process instance overview (" + new java.util.Date() + ")"
while (result.next()) { // process results one row at a time
var name = result.getString(1);
var version = result.getLong(2);
var count = result.getLong(3);
dataset.add(name + " (v" + version + ")", count);
}
execution.setVariable("reportData", reportData.toBytes());
]]></script>
</scriptTask>
<sequenceFlow id="flow3" sourceRef="generateDataset" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
报告开始表单
- 报表是使用普通流程来生成的,所以表单功能也可以使用
- 直接在开始事件里加一个开始表单 ,Explorer就会在生成报表之前展示给用户
<startEvent id="startevent1" name="Start">
<extensionElements>
<activiti:formProperty id="processDefinition" name="Select process definition" type="processDefinition" required="true" />
<activiti:formProperty id="chartType" name="Chart type" type="enum" required="true">
<activiti:value id="pieChart" name="Pie chart" />
<activiti:value id="barChart" name="Bar chart" />
</activiti:formProperty>
</extensionElements>
</startEvent>
- 为用户渲染一个普通的表单:
- 表单属性会在启动流程时提交,然后就可以像普通的流程变量一样使用.脚本中可以使用这些流程变量来生成数据:
var processDefinition = execution.getVariable("processDefinition");
流程示例
- 控制台中包含4个报表示例:
- Employee productivity(员工的工作效率):
- 报表演示使用折线图和开始表单
- 报表的脚本比其他例子要复杂,因为数据会在脚本中先进行解释,再保存到报表数据中
- Helpdesk(一线与升级):
- 使用饼图进行展示
- 结合两个不同的数据库查询结果
- Process instance overview(流程实例总览):
- 使用多个数据集的报表实例
- 报表包含使用相同数据的饼图和列表视图
- 展示多种数据集可以用来在一个页面中生成不同图表
- Task duration(任务持续时间):
- 另一个使用开始表单的例子
- 会使用对应的变量来动态生成SQL查询语句
- Employee productivity(员工的工作效率):
修改数据库
- 要修改控制台例子所用的数据库:
- 改变属性文件:apps/apache-tomcat-6.x/webapps/activiti-explorer/WEB-INF/classes/db.properties
- 在类路径下放上合适的数据库驱动:
- Tomcat共享类库
- 在apps/apache-tomcat-6.x/webapps/activiti-explorer/WEB-INF/lib/ 中
Activiti Exploer工作流控制台使用指南!使用Activiti Explorer定义部署执行工作流的更多相关文章
- Activiti工作流学习(三)Activiti工作流与spring集成
一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...
- Activiti工作流的定义部署和执行
工作流引擎 个人觉得直接理解工作流引擎概念有点难度,我们可以先通过了解工作流引擎的职责再反过来理解工作流引擎,工作流引擎一般都做两件事情: 1.定义流程,也就是给我们提供某种规范来定义规则,以 ...
- Activiti工作流(3):activiti核心API
ProcessEngine 说明: 1) 在Activiti中最核心的类,其他的类都是由他而来. 2) 产生方式:ProcessEngine defaultProcessEngine = Pr ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- Chrome 控制台实用指南【转】
转自伯乐在线. Chrome 控制台实用指南 前言 Chrome浏览器我想是每一个前端er必用工具之一吧,一部分原因是它速度快,体积不大,支持的新特性也比其它浏览器多,还有一部分我想就是因为它的控制台 ...
- (四)Activiti之流程定义部署之ZIP方式和流程定义查询
一.流程定义部署之ZIP方式 上一章节我们使用classpath的方式加载流程定义文件,这里我们使用ZIP的方式. 1.1 用activiti插件生成bpmn和png图片之后,压缩到一个zip格式的压 ...
- jBPM4工作流应用开发指南
首先十分感谢作者给我这个机会在他的作品即将问世之前做一些感想,也正好让我能在忙碌中抽空回顾一下这么多年在技术平台方面走过的路以及在Workflow方面的点点滴滴.因为本书是介绍jBPM的专业书籍,所以 ...
- WF4.0以上使用代码完整自定义动态生成执行工作流Xaml文件
给大家分享一下,如何完全使用代码自定义的创建生成工作流文件(用代码创建Xaml文件),并且动态加载运行所生成的工作流. 工作流生成后 在Xaml文件里的主要节点如下: 输入输出参数 <x:Mem ...
- 工作流性能优化(敢问activiti有扩展性?)(3)
2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配 ...
随机推荐
- 洛谷P1424 小鱼的航程(改进版)
题目背景 原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题. 题目描述 有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x&l ...
- 3.PHP条件语句及其字符串相关函数
PHP条件语句 <?php $number = rand(1,100); if($number % 2 == 0){ echo "%2"; } ...
- Windows核心编程 第六章 线程基础知识 (上)
第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...
- Docker安装和helloworld
0.基本简介(想直接实操,直接跳过去看1就好) Docker 在容器的基础上,进行了进一步的封装,从文件系统.网络互联到进程隔离等等,极大的简化了容器的创建和维护.使得 Docker 技术比虚拟机技术 ...
- 每天一道面试题LeetCode 26--删除排序数组中的重复项(python实现)
题目1:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- Day003 数据类型
数据类型 强类型语言 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用(java.c++.c#) 弱类型语言 与强类型语言定义相反(javaScript) Java的数据类型 基本 ...
- 批处理用WINRAR只压缩某类型的文件
1:新建文件夹sql back 和 back,在sql back 文件夹内新建test1.dbb和test2.bak文件 2:新建批处理文件rar.bat,编辑文件: @echo off for %% ...
- 【译】.NET 的新的动态检测分析
随着 Visual Studio 16.9 的发布,Visual Studio 中的检测分析变得更好用了.本文介绍我们新的动态分析工具.这个工具显示了函数被调用的确切次数,并且比我们以前的静态检测工具 ...
- 理解微信小程序的双线程模型
有过微信小程序开发经验的朋友应该都知道"双线程模型"这个概念,本文简单梳理一下双线程模型的一些科普知识,学识浅薄,若有错误欢迎指正. 我以前就职于「小程序·云开发」团队,在对外的一 ...
- Codeforces Round #697 (Div. 3)
A.Odd Divisor 题意:问一个数是不是含有奇数因子 思路:就直接给这个数循环除以2,看看最后剩下的数是不是0,如果不是就有奇数因子,如果是就没有 想不到:1)当时想着用log2来解决问题,后 ...