很久没玩 activiti 了再摸起来都有点陌生了,梳理了一下要点如下:

1. d2js 作为业务端发起流程。

d2js.exports.vocationRequest =
d2js.vocationRequest = function(params){
try{
$V(this, params, {
reason : T.string,
duration : T.int
}); this.startProcess('请假', params); this.session.message = 'vocation request success'
} catch(e){
logger.error('error', Error.toJava(e));
this.session.message = e + '';
}
this.response.sendRedirect(this.request.getHeader('referer'));
}

流程一般都是由业务系统发起的,这里假定为 d2js。

startProcess 封装了 activiti.runtimeService.startProcessInstanceByKey,其中第一个参数是已部署流程的流程名,第二个参数是变量。这些变量在流程的表达式里可以访问。

2. 流程引擎在 startProcess 或任务完成后自动进入下一个任务。

2.1 任务在设计器里可以指定 assignee,如果没有指定,应由 d2js 代码认领。

d2js.exports.listCandidateTasks =
d2js.listCandidateTasks = function(users, groups){
sql{.
select t.id_, t.name_, t.description_, t.task_def_key_, t.execution_id_,t.proc_inst_id_, t.create_time_, t.task_def_key_
from activiti.act_ru_task t , activiti.act_ru_identitylink l
where t.assignee_ is null and (l.user_id_ = any(:users) or l.group_id_ = any(:groups)) and t.id_ = l.task_id_
order by t.id_
.} return this.query(sql, {users: $ARRAY('varchar', users || []), groups: $ARRAY('varchar', groups || [])});
}

d2js.exports.setAssignee =
d2js.setAssignee = function(taskId){
activiti.taskService.setAssignee(taskId, this.session.user.id);
}
d2js.exports.claim =
d2js.claim = function(params){
try{
application.activiti.taskService.claim(params.task, this.session.user.id); this.session.message = 'claim success'
} catch(e){
this.session.message = e + '';
}
this.response.sendRedirect(this.request.getHeader('referer'));
}

setAssignee 和 claim 是等效的,claim 看起来更偏业务。(claim 可能不支持重入,这里不考证了)

2.2 Assignee 可以查看自己的任务。

d2js.exports.listAssignedTasks =
d2js.listAssignedTasks = function(params){
sql{.
select t.id_, t.name_, t.description_, t.task_def_key_, t.execution_id_,t.proc_inst_id_, t.create_time_, t.task_def_key_
from activiti.act_ru_task t where t.assignee_ = ?
.} return this.query(sql, [this.session.user.id + '']);
}

3. 当 assignee 在现实世界处理完任务后,将处理结果提交并结束任务。结束任务在业务系统触发,而不是在规则引擎。

d2js.exports.handleRequest =
d2js.handleRequest = function(params){
try{
var result = {approved: params.result == 'approved',
managerMotivation: params.managerMotivation};
application.activiti.taskService.complete(params.task, result.toJava()); this.session.message = 'handle success'
} catch(e){
this.session.message = e + '';
}
this.response.sendRedirect(this.request.getHeader('referer'));
}

4. 当规则引擎收到处理结果后,对处理结果进行判验,根据判验结果进入下一个分支。

如图,d2js 通过completeTask 发来的变量可在连线的条件表达式中直接使用。

要之,在 d2js 和 activiti 配合时,业务系统不负责流向,规则引擎不负责业务,通常一个 bpmn 和一个 d2js 配合,前者如同指挥,后者如同乐队,配合完成演出。业务系统的 user id 权限等不需要暴露给规则引擎,二者没有太深耦合。

d2js + activiti 备忘的更多相关文章

  1. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  2. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  3. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  4. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

  5. [备忘] Automatically reset Windows Update components

    这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...

  6. ECMAScript 5(ES5)中bind方法简介备忘

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  7. MFC通过txt查找文件并进行复制-备忘

    MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...

  8. php 相关模块备忘

    在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

  9. 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因

    近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...

  10. Javascript备忘模式

    使用备忘模式,利用了函数的自定义属性,先看一个例子 var test = function (){} test.myAttr = "attr"; 这样,就给test加上了一个自定义 ...

随机推荐

  1. 诸葛测字在线测算免费api接口_json格式数据返回

    ‌诸葛测字是一种古老的占卜术,相传是由三国时代的诸葛亮所创.‌ 诸葛测字通过选取三个汉字,计算其笔画数,然后根据这些数字对照特定的歌诀或表格来预测吉凶.解答疑惑.这种方法强调心诚手净,焚香祷告,通过三 ...

  2. docker安装过程 - 下载mysql

    1. 下载必要的包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2. 指定虚拟机去哪里安装 docker sudo ...

  3. manim边做边学--有向图

    有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表示的是顶点之间的单向或依赖关系. 有向图G一般表示为:G=<V,E>.和无向图一样,V是顶点集合,E是边的集合. ...

  4. Curve 分布式存储在 KubeSphere 中的实践

    Curve 介绍 Curve 是网易开发的现代存储系统,目前支持文件存储 (CurveFS) 和块存储 (CurveBS).现在它作为一个沙盒项目托管在 CNCF. Curve 是一个高性能.轻量级操 ...

  5. 宝塔linux 搭建

    前言 2020年的时候,用宝塔搭了个WordPress,一个人的博客不算是博客,没有社区氛围.就转到博客园了. 21年跟着教程,写了一个PHP的个人博客项目. 又有一台阿里云的服务器,就把代码部署上去 ...

  6. Docker和k8s核心概念(理解友好版)

    背景 这是在HWL负责网校云业务线测试时,给同事分享的基础概念文档. 目录: 一. Docker核心概念 二. Kubernetes是什么及架构 三. Kubernetes核心概念 四. Deploy ...

  7. 0基础读顶会论文—Kappa:一种用于无服务器计算的编程框架

    原文链接 代码:快速使用kappa 首先的首先,可以先去了解一下lambda架构 Abstract 在本文中提出了Kappa,一个简化无服务器开发的框架.它使用检查点来处理lambda函数超时,并提供 ...

  8. docker REPOSITORY 改名

    创建新的名称: docker tag oldname:tag newname:tag 删除旧的名称: docker rmi oldname:tag

  9. 用 300 行代码手写提炼 Spring 核心原理 [2]

    系列文章 用 300 行代码手写提炼 Spring 核心原理 [1] 用 300 行代码手写提炼 Spring 核心原理 [2] 用 300 行代码手写提炼 Spring 核心原理 [3] 上文 中我 ...

  10. ubuntu 使用tree打印树形结构

    ubuntu 使用 tree 命令能打印目录结构 sudo apt-get install tree 安装后使用tree就行了 . ├── index.php ├── phpQuery │   ├── ...