- 浏览: 428919 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
man1900:
想部署及学习了解,可参考本人新的博客获得下载源代码。http: ...
JOffice 中的JBPM4在线流程设计器--初览(Applet版) -
atgoingguoat:
哎。假的。
JOffice 中的JBPM4在线流程设计器--初览(Applet版) -
电竞杀神张无忌:
这是主流程调用子流程报的错大神指导原因吗? ...
JBPM4的子流程与父流程的设计及开发 -
贝塔ZQ:
pageoffice也是office在线编辑的吧,J.Offi ...
J.Office另一种在线Office编辑器整合 -
Mybonnie1:
你好,想问下,串行的多实例任务能做到回退么
Activiti 多个并发子流程的应用
Jbpm4提供的IdentitySession接口并不是一种很好的处理方式,鉴于我们每个业务系统都有一套自己的用户及权限认证管理机制,需要与jbpm4.4集成的话,就比较周折了,我们经常需要查询的就是用户自己的任务。jbpm4的任务里有一个比较好的任务人员指派定义方式,就是使用AssignmentHandler接口,其定义如下所示:
<?xml version="1.0" encoding="UTF-8"?> <process name="TaskAssignmentHandler" xmlns="http://jbpm.org/4.4/jpdl"> <start g="20,20,48,48"> <transition to="review" /> </start> <task name="review" g="96,16,127,52"> <assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask"> <field name="assignee"> <string value="johndoe" /> </field> </assignment-handler> <transition to="wait" /> </task> <state name="wait" g="255,16,88,52" /> </process>
package org.jbpm.examples.task.assignmenthandler; import org.jbpm.api.model.OpenExecution; import org.jbpm.api.task.Assignable; import org.jbpm.api.task.AssignmentHandler; /** * @author Tom Baeyens */ public class AssignTask implements AssignmentHandler { private static final long serialVersionUID = 1L; String assignee; public void assign(Assignable assignable, OpenExecution execution) { assignable.setAssignee(assignee); } }
这要求我们在设计流程定义后,任务的处理人已经必须定下来了,但若我们在流程发布后,还需要手工改这里的任务执行人员(并且人员是我们系统的用户),甚至人员可能在流程运行过程中,由用户在任务表单或计算过程中动态指定,以上的方式并不能满足我们的要求。
基于这种想法,应该设计另一种允许用户修改流程定义中的人员,并且跟我们的系统用户角色结合起来。
jbpm4之后的版本,启动流程及运行流程时,都会去读取流程定义,因此,我们可以动态修改以上配置文件,让其生成类似如下的配置格式即可以满足我们的要求:
<?xml version="1.0" encoding="UTF-8"?> <process name="TaskAssignmentHandler" xmlns="http://jbpm.org/4.4/jpdl"> <start g="20,20,48,48"> <transition to="review" /> </start> <task name="review" g="96,16,127,52"> <assignment-handler class="com.htsoft.core.jbpm.AssignmentHandler"> <field name="userIds"> <string value="1" /> </field> <field name="roleIds"> <string value="1,2" /> </field> </assignment-handler> <transition to="wait" /> </task> <state name="wait" g="255,16,88,52" /> </process>
以上的userIds的1,以及roleIds的1,2则代表我们系统中的用户id与角色的id,其值由后台用户在后面通过界面来设置。
其设置后,就生成以上的代码写至jbpm4_lob表中的blobvalue字段中去则可,这是持久化的处理。
也可以临时调用类似以下的代码动态实现以上效果:
/** * 为流程定义加上任务的指派人员接口 * @param deployId */ public void addAssignHandler(ProUserAssign proUserAssign){ ProcessDefinitionImpl pd=(ProcessDefinitionImpl)repositoryService.createProcessDefinitionQuery().deploymentId(proUserAssign.getDeployId()).uniqueResult(); EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine; EnvironmentImpl env=null; try { env = environmentFactory.openEnvironment(); //找到任务的定义 TaskDefinitionImpl taskDef=pd.getTaskDefinition(proUserAssign.getActivityName()); UserCodeReference userCodeReference = new UserCodeReference(); ObjectDescriptor descriptor = new ObjectDescriptor(); //加上任务的人员动态指派 descriptor.setClassName("com.htsoft.core.jbpm.UserAssignHandler"); //动态加参数 FieldOperation userIdsFo = new FieldOperation(); userIdsFo.setFieldName("userIds"); userIdsFo.setDescriptor(new StringDescriptor(proUserAssign.getUserId())); FieldOperation groupIdsFo=new FieldOperation(); groupIdsFo.setFieldName("groupIds"); groupIdsFo.setDescriptor(new StringDescriptor(proUserAssign.getRoleId())); List<Operation> listOp=new ArrayList<Operation>(); listOp.add(userIdsFo); listOp.add(groupIdsFo); descriptor.setOperations(listOp); userCodeReference.setCached(false); userCodeReference.setDescriptor(descriptor); taskDef.setAssignmentHandlerReference(userCodeReference); }catch(Exception ex){ logger.error("ADD AssignHandler Error:" + ex.getMessage()); }finally{ if(env!=null){ env.close(); } } }
不过该方式没有持久久,重启系统后,保存的用户及角色设置并不会生效。
UserAssignHandler类代码如下:
package com.htsoft.core.jbpm; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jbpm.api.model.OpenExecution; import org.jbpm.api.task.Assignable; import org.jbpm.api.task.AssignmentHandler; import com.htsoft.core.Constants; /** * 尚未开始使用 * <B><P>Joffice -- http://www.jee-soft.cn</P></B> * <B><P>Copyright (C) 2008-2010 GuangZhou HongTian Software Company (广州宏天软件有限公司)</P></B> * <B><P>description:</P></B> * <P></P> * <P>product:joffice</P> * <P></P> * @see com.htsoft.core.jbpm.UserAssignHandler * <P></P> * @author * @version V1 * @create: 2010-11-23下午02:58:01 */ public class UserAssignHandler implements AssignmentHandler{ private Log logger=LogFactory.getLog(UserAssignHandler.class); //授予用户ID String userIds; //授权角色ID String groupIds; @Override public void assign(Assignable assignable, OpenExecution execution) throws Exception { String assignId=(String)execution.getVariable(Constants.FLOW_ASSIGN_ID); logger.info("assignId:===========>" + assignId); //在表单提交中指定了固定的执行人员 if(StringUtils.isNotEmpty(assignId)){ assignable.setAssignee(assignId); return; } //在表单中指定了执行的角色TODO //在表单中指定了会签人员 String signUserIds=(String)execution.getVariable(Constants.FLOW_SIGN_USERIDS); if(signUserIds!=null){ //TODO 取到该任务,进行会签设置 } logger.debug("Enter UserAssignHandler assign method~~~~"); if(userIds!=null){//若用户不为空 String[]uIds=userIds.split("[,]"); if(uIds!=null && uIds.length>1){//多于一个人的 for(String uId:uIds){ assignable.addCandidateUser(uId); } }else{ assignable.setAssignee(userIds); } } if(groupIds!=null){//若角色组不为空 String[]gIds=userIds.split("[,]"); if(gIds!=null&& gIds.length>1){//多于一个角色的 for(String gId:gIds){ assignable.addCandidateGroup(gId); } }else{ assignable.addCandidateGroup(groupIds); } } } }
评论
4 楼
jakey766
2011-10-31
我现在正碰到这样个问题,想请教下楼主:
String assignId=(String)execution.getVariable(Constants.FLOW_ASSIGN_ID);
logger.info("assignId:===========>" + assignId);
//在表单提交中指定了固定的执行人员
if(StringUtils.isNotEmpty(assignId)){
assignable.setAssignee(assignId);
return;
}
这样的话如果execution.getVariable(Constants.FLOW_ASSIGN_ID)获取到的值不为空,那该流程的后面每一步都能取到该值?
如果在流程的第一个表单选择指派一个人,然后之后的环节又不指派人,那不是后面的环节都只有这个指派的人有权限么?
String assignId=(String)execution.getVariable(Constants.FLOW_ASSIGN_ID);
logger.info("assignId:===========>" + assignId);
//在表单提交中指定了固定的执行人员
if(StringUtils.isNotEmpty(assignId)){
assignable.setAssignee(assignId);
return;
}
这样的话如果execution.getVariable(Constants.FLOW_ASSIGN_ID)获取到的值不为空,那该流程的后面每一步都能取到该值?
如果在流程的第一个表单选择指派一个人,然后之后的环节又不指派人,那不是后面的环节都只有这个指派的人有权限么?
3 楼
jakey766
2011-10-31
<assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask">
<field name="assignee">
<string value="johndoe" />
</field>
</assignment-handler>
你好,请问如果我在定义中这样写,又想在代码中也可以动态给org.jbpm.examples.task.assignmenthandler.AssignTask传递参数,该怎样做?
(如果在表单选了指派人,则只分派给所选的人,否则默认分派给johndoe)
<field name="assignee">
<string value="johndoe" />
</field>
</assignment-handler>
你好,请问如果我在定义中这样写,又想在代码中也可以动态给org.jbpm.examples.task.assignmenthandler.AssignTask传递参数,该怎样做?
(如果在表单选了指派人,则只分派给所选的人,否则默认分派给johndoe)
2 楼
xuanzd
2011-07-03
aizhimin 写道
我采用了类似的方式,只不过我不去修改流程定义的xml,而是将每个人工任务的参与者分配保存到数据库的一张表中,然后UserAssignHandler 中读取实现。
UserAssignHandler 中读取具体是怎么实现的呢,能分享一下吗?
1 楼
aizhimin
2011-01-06
我采用了类似的方式,只不过我不去修改流程定义的xml,而是将每个人工任务的参与者分配保存到数据库的一张表中,然后UserAssignHandler 中读取实现。
发表评论
-
Activiti 工作流会签开发设计思路
2012-07-26 12:12 28352Activiti 工作流会签开 ... -
基于开源流程引擎Activiti5的工作流开发平台
2012-05-17 11:28 7171http://www.redxun.cn:8 ... -
Jbpm4或Activiti5的流程任务分发与汇总
2012-03-20 18:28 6200应用场景:在企业或事业单位,经常需要把一个任务分派给多条线去 ... -
关于Activiti或JBPM流程的回退的讨论之一
2011-12-30 12:08 8841需求: ... -
Activiti 5 在线流程设计器开发
2011-11-30 08:56 23690jbpm4的开发成员to ... -
基于标签方式的工作流启动及任务执行开发说明
2011-09-25 21:21 2262基于现在的系统的整 ... -
JOffice2 发布了开源的开发者体验版本啦!
2011-08-09 23:42 7256JOffice的爱好者有福音了,经公司决定,现在发布 ... -
关于JOffice的业务表单与流程的整合问题
2011-07-26 23:55 3269关于 JOffice 的业务表 ... -
JBPM4的子流程与父流程的设计及开发
2011-07-14 11:23 5605【JBPM4的子流程 ... -
Jbpm4中的会签设计及实现
2011-05-05 15:20 7617会签任务是工作流里一个比较觉见的任务方式,意思是一 ... -
jbpm4.4在线设计分支跳转
2011-05-02 14:30 4351我们知道jbpm4.4提供了三种比较方便的分支跳转方式 ... -
J.Office 2 JBPM4.4 工作流增强版特性
2011-04-27 16:00 36302.0主要在工作流方面提供了很强的改进,jbpm升级至jbpm ... -
JOffice2的在线表单设计示例(JBPM4.4)
2011-03-16 13:52 5946JOffice2目前升级至jbpm ... -
JOffice2中的JBPM4的任务回退实现
2010-12-07 15:27 3519任务回退的工作可以有两种实现方式: 1. 完成当前 ... -
分享宏天免费的JBPM4流程设计器(Applet)
2010-07-07 11:56 312JBPM4一直没有一个很好的在线流程设计器,基于这种方式,跟大 ... -
JOffice中的自定义发文流程与运行模板设计
2010-07-05 22:59 3134开发与设计公文流程在所有的政府oa项目上都少不了此需求,而能灵 ... -
JBPM4中的任务回退、补签、自由流程实现
2010-04-22 16:12 10393最近在实施政府办公项 ... -
OA JBPM中的公文(发文、收文)流程
2010-03-25 00:10 11395公文管理主要包括两大模块,其一是发文管理,其二是收文管理,非常 ... -
JBPM在线流程设计器的分析与实现部分构想
2010-03-10 13:54 7307在发表文章之前,先 ... -
取得任务节点的对外所有跳转Transition对象
2010-03-09 11:32 2366在流程的任务里,我们需要把当前的任务节点的下一步的跳转选择显示 ...
相关推荐
JBPM4.4与SSH2之整合(附完整源码) 这些天,想着把jbpm4.4与ssh2整合一下,由于之前从来没用过jbpm,也不知道各版本之间会有什么差异(经过网上的收集对比,还真有些差异),整合起来,还真是有些步履艰难。收集了...
jbpm4.4与ssh框架的整合
JBPM4.4+spring+ext整合
jbpm4.4开发指南,jbpm4.4用户指南
jbpm4.4 ibatis-spring 整合
jbpm4.4 jar 包下载jbpm4.4 jar 包下载jbpm4.4 jar 包下载jbpm4.4 jar 包下载
jBPM 4.4 用户手册 中文版 PDF格式
jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd
jbpm4.4下载地址
jBPM4.4开发指南 开发手册 JBPM4.4 开发
jBPM4.4入门开发实例
jBPM 4.4用户手册 翻译官方文档 JBoss jBPM Teams 4.4 译者: Lingo 首页: http://www.family168.com/ 论坛: http://old.family168.com/bbs EMAIL: lingosurf168@gmail.com 2009年11月1日 1. 导言 1.1. 许可...
jBPM4.4课程文档
首先感谢原创,相关信息请查询原创。... 看到好多朋友找不到相应的jar包,致使jbpm4.4的学习遇到困难,现提供除jbpm4.4自身jar包外的所有包,以便大家更快的学习jbpm4.4,希望能帮朋友们少走弯路!
资源名称:JBPM4.4视频教程(22集附源码)资源目录:【】(01)jbpm4.4简介【】(02)JBPM4.4开发环境搭建【】(03)jbpm4.4环境搭建续【】(04)jbpm4.4配置文件和开发前准备【】(05)jbpm4.4部署流程发起流程实例【】(06)...
JBPM4.4之HelloWorld示例
JBPM4.4整合SSH2的完整jar包,绝对可用!(注:此为第一部分,需要下载第二部分一起解压才可用,下载地址:http://download.csdn.net/detail/zf723182723/4385173)
jbpm4.4整合s2sh 请假流程例子
JBPM4.4+SSH2完整整合jar包
JBPM4.4学习文档.ppt