在JBPM中定义了一个简单的?Role-〉User的用户模型。但是在实际项目中,我们的用户模型可能远比这个模型复杂,或者有很大的差异。所以也就有了这篇文章的主题。
这篇文章是受一名QQ昵称为“老结赖”的朋友的托付写的,希望可以帮到他。
言归正传,在JBPM中是通过Actor和PooledActor来对任务进行授权的。其中也牵涉到了Swimlane的概念(具体概念会在另一片文章中说明)。由于在JBPM中并没有把Task的授权强行跟Actor和PooledActor进行关联,这也就让我们嵌入自己的用户模型成为了可能。
废话少说,先给出一个示例流程:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">
<start-state name="启动">
<transition name="" to="制单"></transition>
</start-state>
<task-node name="制单">
<task name="制单">
<assignment actor-id="#{processStarter}"></assignment>
</task>
<transition name="送复核" to="复核"></transition>
</task-node>
<task-node name="复核">
<task name="复核">
<assignment class="com.sky.plugin.jbpm.def.ActorsHandel">
</assignment>
</task>
<transition name="拒绝复核" to="制单"></transition>
<transition name="提交审批" to="审批"></transition>
</task-node>
<task-node name="审批">
<task name="审批">
<assignment class="com.sky.plugin.jbpm.def.ActorsHandel">
</assignment>
</task>
<transition name="同意" to="结束">
<transition name="拒绝到复核人" to="复核"></transition>
</task-node>
<end-state name="结束"></end-state>
</process-definition>
其中有几点地方是我们要注意到的,也就是我们实现自定义用户模型需要做到的地方。在这里先提一下,然后再一一解释。
1. <assignment actor-id="#{processStarter}"></assignment> 确定流程的发起者
2. <assignment class="com.sky.plugin.jbpm.def.ActorsHandel"> 通过AssignHandler动态的对流程实例定义Actor
流程中,通过一个变量#{processStarter}来对整个流程的第一个Task进行授权,那么这个授权是在启动流程的时候一起进行的。也就是说这个#{processStarter}的值应该是系统中启动流程的当前用户。
启动流程代码如下:
public Long startProcess(final Long processDefinitionId,
final String username) {
return (Long)jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext jbpmContext)
throws JbpmException {
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession
.loadProcessDefinition(processDefinitionId);
ProcessInstance processInstance = new ProcessInstance(
processDefinition);
//设置流程发起人
processInstance.getContextInstance().setVariable("processStarter",username);
processInstance.signal();
TaskInstance taskInstance = (TaskInstance) processInstance
.getTaskMgmtInstance().getTaskInstances().iterator()
.next();
taskInstance.setActorId(username);
taskInstance.setVariable("processStarter",username);
// taskInstance.end();
// Save the process instance along with the task instance
jbpmContext.save(processInstance);
return processInstance.getId();
}
});
}
注:其中processInstance.getContextInstance().setVariable("processStarter",username);则是把系统当前用户设置到流程中。
这里有一点跟别的地方不一样的地方,那就是这个流程没有<startTask></startTask>,而是用一个TaskNode作为startTask,这里是由于我的系统中有特殊的要求。如果你不需要的话,你可以用startTask代替,都是一样的处理。
接着,进入最关键的部分,也就是真正实现Task的用户可配置,这样的话,需要额外的维护一张Task和自定义用户模型中user的映射表。
映射表结构如下:
id---processDefinitionId---taskId---taskName---actors
1----------1--------------------------1--------制单--------1001
2----------1--------------------------2--------复核--------1002,1003
3----------1--------------------------3--------审批--------1004,1005,1006
其它字段的意思就不用说了,其中actors字段就是你用户模型中的用户名或者userId。[b
当然这里是很灵活的,如果你要和你系统中的Role绑定,也同样可以这样实现,只要变通一点就OK了,这里就不罗嗦了。
下面进入最重要的部分,也就是通过AssignHandler进行动态授权。代码如下:
package com.sky.plugin.jbpm.def;
public class ActorsHandel implements AssignmentHandler {
private static final long serialVersionUID = 1L;
public void assign(Assignable assignable, ExecutionContext context)
throws Exception {
ProcessDefinition processDefinition = context.getProcessDefinition();
TaskInstance taskInstance = context.getTaskInstance();
Task task = taskInstance.getTask();
Long processDefinitionId = processDefinition.getId();
Long taskId = task.getId();
//读取数据库该任务的授权,分配给该任务Task,也就是前面那张表中的记录
//ps.loadTaskActors(processDefinitionId, taskId)是自定义方法用来读取
//授权信息
ServiceFactory serviceFactory = ServiceFactory.getInstance();
ProcessService ps = serviceFactory.getProcessService();
String[] actors = ps.loadTaskActors(processDefinitionId, taskId);
assignable.setPooledActors(actors);
}
}
这样就完成了Jbpm同自定义用户模型的绑定,以后就是处理Task了,但是这里只是简单的实现,还有很多的东西需要注意。比如:流程被打回(审批不通过),只能回到前一个提交的人那里,而不是第一次流程定义的所有的actors等等问题。这个问题我将在“
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(2)”中进行说明。
“老结赖”,这篇我冒生命危险,花了1个小时的上班时间写的东东希望可以帮到你。
分享到:
- 2006-11-14 10:38
- 浏览 16678
- 评论(12)
- 论坛回复 / 浏览 (12 / 28355)
- 查看更多
相关推荐
为了解决这个问题,JBPM提供了灵活性,允许开发人员通过AssignmentHandler绑定自定义用户模型,从而实现更复杂的用户授权逻辑。 首先,我们需要理解JBPM中的核心概念:Actor和PooledActor。Actor代表一个可以执行...
基于STM32的卫星GPS路径记录仪(附完整源代码),含有完整的源码和报告文档
基于Matlab的天线阵列综合设计与微波计算成像技术——探究相控阵和波束赋形在阵列天线中的应用,基于Matlab的天线阵列综合 微波与电磁场 计算成像 波束赋形 相控阵 阵列天线设计 ,核心关键词:Matlab; 天线阵列综合; 微波与电磁场; 计算成像; 波束赋形; 相控阵; 阵列天线设计; 阵列天线的应用。,"Matlab驱动的阵列天线综合设计:波束赋形与相控阵计算成像技术"
基于双层优化架构的电动汽车时空调度策略:实现充电负荷时空域分配与风电协同调度优化,关键词:电动汽车 时空调度 最优潮流 双层优化 18 编程语言:MATLAB平台 主题:基于双层优化的大型电动汽车时空调度(lunwen复现) 内容简介: 提出了一种双层结构的电动汽车充放电优化方案。 优化了充电负荷在时间域和空间域的分配。 同时考虑输电系统层面和配电系统层面。 利用情景考虑风电的不确定性和波动性。 阐述并论证了评估方案性能的方法 提出了一种新颖的输配电系统双层优化方法,从时间和空间两个方面解决了风电条件下电动汽车充放电负荷的调度问题。 输电网上层优化是在考虑风电的情况下,将电动汽车与火电机组、基本负荷相协调,在时域内对电动汽车的负荷周期进行优化。 然后对下一层的配电网进行负荷优化。 以10单元输电网和ieee33节点配电网为例,对所提出的双层优化策略的性能进行了评估。 分析了电价模式、电动汽车普及率和电动汽车负荷位置对其的影响。 仿真结果表明,所提出的双层优化策略,通过对电动汽车充放电时间和空间的调度,既能适应风力发电,又能提高电网运行的经济性和电动汽车用户的效益。 结果表明,电动汽
数据可视化分析与实现 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于深度强化学习的热电联产系统智能经济调度:高效近端优化算法降低计算复杂度,热电联产系统智能经济调度:一种深度强化学习方法 关键词:热电联产,经济调度,深度强化学习,近端优化 一种热电组合(CHP)系统经济调度的深度强化学习(DRL)方法,该方法具有对不同操作场景的适应性,显著地在不影响精度的情况下降低了计算复杂度。 在问题描述方面,大量的热与功率组合(CHP)经济调度问题被建模为一个高维和非光滑的目标函数,具有大量的非线性约束,需要强大的优化算法和相当长的时间来解决它。 为了减少解决方案的时间,大多数工程应用程序选择线性化优化目标和设备模型。 为了避免复杂的线性化过程,本文将CHP经济调度问题建模为马尔可夫决策过程(MDP),使模型被高度封装,以保存各种设备的输入和输出特性。 此外改进了一种先进的深度强化学习算法:分布式近端策略优化(DPPO),使其适用于CHP经济调度问题。 此外,我们还改进了一种先进的深度强化学习算法:分布式近端策略优化(DPPO),使其适用于CHP经济调度问题。 在此算法的基础上,将对代理进行训练,以探索不同操作场景的最优调度策略,并有效地响应系统紧急情况。 在
基于Monte Carlo仿真的高速公路可再生充电站优化布局与能量存储策略,规划高速公路上完全可再生动力充电站:数据驱动的鲁棒优化方法 本文提出了一种全面的两级方法,用于在公路网络上采用和大化独立电动电动机充电站。 在第一阶段,从提供交通需求和电池数据的Monte Carlo仿真获得单个车辆需要充电服务的位置;提出了一种整数编程模型,以确定来自潜在候选者的充电站的最佳站点,确保每个车辆都能够在不耗尽电池的情况下访问至少一个充电站;之后,可以模拟各个选定地点的充电需求的空间和时间分布。 在第二阶段,开发了一种DATADRIVE的分布稳健优化模型,以优化每个充电站中可再生几代的能量和能量存储单元。 在经验分布周围的一个不适的分布家庭描述了不确定的生成和需求,并且它们在克拉尔莱克勒发散感的距离由可调标量控制。 基于风险理论,建议了两种鲁棒模型的重新建议。 第一个依赖于价值 - 风险(VAR),并产生混合整数线性程序(MILP),其更准确;第二个提供基于条件VAR的保守近似,并归结为线性程序,该程序更具易行。 测试系统的数值研究表明了所提出的方法的有效性。 ,核心关键词: 1. 高速公路上完
基于STC单片机的小型直流电机变频调速控制器系统设计.pdf
基于Matlab的汽车出入库计时计费系统全面设计方案:一键下载使用压缩包实现高效停车管理,基于matlab的汽车出入库计时计费系统的设计 压缩包,直接可用 ,基于Matlab;汽车出入库;计时计费系统;设计;压缩包;直接可用,基于Matlab的汽车出入库计时计费系统设计压缩包,直接可用
基于STM32 人群定位、调速智能风扇设计(程序、设计报告、视频演示),含有完整的源码和报告文档
2025版《杭州市学军中学校本册》高中数学.pdf
基于自回归整合滑动平均模型(ARIMA)的高效时间序列预测方法,基于自回归整合滑动平均模型(ARIMA)的时间序列预测 ,核心关键词:基于自回归整合滑动平均模型(ARIMA); 时间序列预测; 预测分析; 统计模型。,基于ARIMA模型的自回归时间序列预测技术
春节淘宝一键连福活动工具 春节淘宝一键连福Python源码及封装好工具
LabView实现压力、温度、液位等多参数模拟量信号的采集与数据处理,图表展示及Excel存储功能,labview 数据采集和处理~ 包括压力,温度,液位,转速,扭矩等模拟量信号的采集,和数据处理~图表显示和EXCEL存储~ ,LabView; 数据采集; 处理; 模拟量信号; 图表显示; EXCEL存储; 压力; 温度; 液位; 转速; 扭矩,LabView综合监控:模拟信号采集与处理,数据图表化与EXCEL存储应用
基于C++与Qt框架的Windows串口调试助手:多线程运行,卓越性能与效率,保障数据传输零失误的实用工具,C++编写,qt框架,windows串口调试助手,多线程运行,性能好,效率高,不丢数据,保证代码质量。 ,核心关键词:C++编写; Qt框架; Windows串口调试助手; 多线程运行; 性能好; 效率高; 不丢数据; 代码质量。,C++高性能Qt框架串口调试助手:多线程运行,保障数据传输不丢失,高效稳定
内容概要:本文详细展示了由文本形式表示的一个具体的滤波电容配合二极管进行半波整流后的电路配置情况。从电路构成看,包含了对源电压(交流)、二极管方向控制元件以及作为负载并起到平滑电流变动的重要元器件—电容器的选择与参数设定进行了具体阐述,同时给出了部分关键电气组件的具体数值如频率(f)为60Hz,最大电压幅度(Vp)约为5V,还有电容量(C)为1毫法等情况说明。 适用人群:电子工程师或爱好无线电制作且具有一定模拟电路基础的技术人员或相关专业学生。 使用场景及目标:对于正在学习电力变换技术和从事电子产品设计工作的人员来说,在设计过程中可以借助此文更好地理解如何正确选择适当的元件参数来构建有效的直流供电路径,从而保障后续用电器的稳定运行。 其他说明:本段落中的电路描述采用了特定的语法格式记录各个电子部件的位置坐标及其属性值,这对于熟悉某些电路仿真软件(比如Fritzing或KiCad等工具)使用者可能会更容易解读这些内容。而实际操作时需要转换成更常见的图表形式。
基于协同过滤算法的体育商品推荐系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
该数据集是将沙漠专题地图的图形数据建立的我国沙漠空间数据库,重点反映我国沙漠的地理分布、面积大小、沙丘的流动性与固定程度。 按照系统设计要求及有关标准,将输入数据进行标准化,统一转换为各类数据输入的标准格式。建库以交付系统运行。 本资源以TM影像为信息源,在全国土地利用现状图的Coverage和TM数字影像信息,进行解译、提取、修编,利用遥感与地理信息系统技术结合以1:10万比例尺专题图成图要求,对我国的沙漠、沙地和砾质戈壁进行了专题制图。 全国沙漠分布图可以使用户在从事资源与环境的研究工作时节省大量的数据录入和编辑工作。 适用领域 生态环境研究:监测沙漠化动态变化,评估治理成效 土地利用规划:支持沙漠化防治与可持续发展政策制定 气候变化分析:研究沙漠扩展对区域气候的影响 遥感影像解译:结合光学、雷达数据进行沙漠分类与监测 科学研究与教育:高校、科研机构等开展生态研究、教学培训
西门子四轴联动控制:新能源自动排列机编程与实现,基于真实项目参考(附CAD电气图),西门子1200四轴程序 新能源自动排列机,真实项目 4个V90 走PN 口控制4轴4个FB284控制 RFID块采用FB承载用SCL编写 所有背景数据块采用绝对寻址取消块优化 FB及FC无锁,直接复制可用,作为初学有一定基础可以参考,另附CAD电气图 V14及以上可以打开 ,西门子1200; 四轴程序; 新能源自动排列机; V90控制器; FB284控制; RFID块; SCL编写; 绝对寻址; 背景数据块; CAD电气图; V14及以上版本。,"西门子四轴程序:新能源排列机自动化控制实战"
雷达信号处理中Radon-Fourier算法对运动目标的相参积累:距离与多普勒参数估计的Matlab实现,雷达信号处理:运动目标相参积累——Radon-Fourier算法,用于检测运动目标,实现距离和多普勒参数估计。 Matlab程序,包含函数文件和使用文件,代码简洁易懂,注释详细。 ,核心关键词:雷达信号处理; 运动目标相参积累; Radon-Fourier算法; 距离估计; 多普勒参数估计; Matlab程序; 函数文件; 使用文件; 代码简洁易懂; 注释详细。,"Radon-Fourier算法:雷达信号处理中的运动目标相参积累与参数估计"