- 浏览: 56207 次
- 来自: ...
最新评论
-
rebellan:
太感谢楼主的分享精神了,搞了好久的会签 被楼主点通了,谢谢
使用JBPM实现动态会签 -
zhumaohua:
使用JBPM实现动态会签 -
pppppp:
没有,之前没有出现过这种情况,使用terracotta才出现的 ...
terracotta在hibernate应用上的严重问题 -
daquan198163:
是不是你让sessionfactory新建表了
terracotta在hibernate应用上的严重问题 -
llandyl:
问题已经解决。是测试程序测试方法不对造成的。
使用JBPM实现动态会签
目前有很多实现动态会签的文章,但是给人感觉不是很优雅,下面介绍一种实现方式。
1、流程定义文件:
xml 代码
- < process-definition
- xmlns = "urn:jbpm.org:jpdl-3.1" name = "foreach" >
- < start-state name = "start" >
- < task name = "one" >
- </ task >
- < transition name = "a" to = "foreachf" > </ transition >
- </ start-state >
- < node name = "foreachf" >
- < action class = "com.framework.workflow.jbpm.ForEachFork" >
- < foreach > #{bpm_assignees} </ foreach >
- < var > reviewer </ var >
- </ action >
- < transition name = "review" to = "review" > </ transition >
- </ node >
- < task-node name = "review" >
- < task name = "reviewTask" >
- < assignment class = "com.framework.workflow.jbpm.DefaultAssignment" >
- < actor > #{reviewer} </ actor >
- </ assignment >
- </ task >
- < transition name = "reject" to = "endreview" >
- < action class = "com.framework.workflow.jbpm.JoinEndForkedTokens" />
- </ transition >
- < transition name = "approve" to = "endreview" > </ transition >
- </ task-node >
- < join name = "endreview" >
- < transition name = "toend" to = "end1" > </ transition >
- </ join >
- < end-state name = "end1" > </ end-state >
- </ process-definition >
在这里我们从node节点动态生成任务节点,会签时当有一个是reject时便结束所有节点。
2、动态派生ForEachFork代码:
java 代码
- public class ForEachFork implements ActionHandler
- {
- private Element foreach;
- private String var;
- //测试数据
- private static Map map = new HashMap();
- static {
- List list = new ArrayList();
- list.add("1234" );
- list.add("2345" );
- list.add("3456" );
- map.put("bpm_assignees" , list);
- }
- /**
- *
- 为每个元素创建一个分支
- *
- * @param executionContext
- * @throws Exception
- */
- @SuppressWarnings ( "unchecked" )
- public void execute( final ExecutionContext executionContext)
- throws Exception
- {
- if (foreach == null )
- {
- throw new WorkflowException( "forEach has not been provided" );
- }
- List forEachColl = null ;
- String forEachCollStr = foreach.getTextTrim();
- if (forEachCollStr != null )
- {
- if (forEachCollStr.startsWith( "#{" ))
- {
- String expression = forEachCollStr.substring(2 , forEachCollStr.length() - 1 );
- forEachColl = (List)map.get(expression);
- }
- }
- if (var == null || var.length() == 0 )
- {
- throw new WorkflowException( "forEach variable name has not been provided" );
- }
- //
- // 创建分支
- //
- Token rootToken = executionContext.getToken();
- Node node = executionContext.getNode();
- List forkTransitions = new ArrayList();
- // 为每一个元素创建一个token
- for ( int i = 0 ; i < node.getLeavingTransitions().size(); i++)
- {
- Transition transition = (Transition) node.getLeavingTransitions().get(i);
- for ( int iVar = 0 ; iVar < forEachColl.size(); iVar++)
- {
- // 为每一个新token创建一个path
- String tokenName = getTokenName(rootToken, transition.getName(), iVar);
- Token loopToken = new Token(rootToken, tokenName);
- loopToken.setTerminationImplicit(true );
- executionContext.getJbpmContext().getSession().save(loopToken);
- //赋予一个新变量
- final ExecutionContext newExecutionContext = new ExecutionContext(loopToken);
- newExecutionContext.getContextInstance().createVariable(var, forEachColl.get(iVar), loopToken);
- // 记录下每一transition
- ForkedTransition forkTransition = new ForkedTransition();
- forkTransition.executionContext = newExecutionContext;
- forkTransition.transition = transition;
- forkTransitions.add(forkTransition);
- }
- }
- //
- // 转向下一个节点
- //
- for (ForkedTransition forkTransition : forkTransitions)
- {
- node.leave(forkTransition.executionContext, forkTransition.transition);
- }
- }
- /**
- *
- 获得分支token name
- *
- * @param parent
- * @param transitionName
- * @return
- */
- protected String getTokenName(Token parent, String transitionName, int loopIndex)
- {
- String tokenName = null ;
- if (transitionName != null )
- {
- if (!parent.hasChild(transitionName))
- {
- tokenName = transitionName;
- }
- else
- {
- int i = 2 ;
- tokenName = transitionName + Integer.toString(i);
- while (parent.hasChild(tokenName))
- {
- i++;
- tokenName = transitionName + Integer.toString(i);
- }
- }
- }
- else
- {
- // 没有转向
- int size = ( parent.getChildren()!= null ? parent.getChildren().size()+ 1 : 1 );
- tokenName = Integer.toString(size);
- }
- return tokenName + "." + loopIndex;
- }
- /**
- * Fork Transition
- */
- private class ForkedTransition
- {
- private ExecutionContext executionContext;
- private Transition transition;
- }
- }
在具体应用中需要灵活的根据业务逻辑需要派生所需要的分支。
3、DefaultAssignment
进行简单的权限操作,这里面主要是将#{reviewer}值作为actorId进行设置
4、JoinEndForkedTokens结束所有节点
java 代码
- public class JoinEndForkedTokens implements ActionHandler
- {
- public JoinEndForkedTokens()
- {
- }
- /* (non-Javadoc)
- * @see org.jbpm.graph.def.ActionHandler#execute(org.jbpm.graph.exe.ExecutionContext)
- */
- public void execute(ExecutionContext executionContext)
- {
- Token token = executionContext.getToken().getParent();
- Map childTokens = token.getActiveChildren();
- for (Object childToken : childTokens.values())
- {
- cancelToken(executionContext, (Token)childToken);
- }
- }
- /**
- *
- 取消 token
- *
- * @param executionContext
- * @param token
- */
- protected void cancelToken(ExecutionContext executionContext, Token token)
- {
- Map childTokens = token.getActiveChildren();
- for (Object childToken : childTokens.values())
- {
- cancelToken(executionContext, (Token)childToken);
- }
- if (!token.hasEnded())
- {
- token.end(true );
- }
- cancelTokenTasks(executionContext, token);
- }
- /**
- *
- 结束token关联的任务
- *
- * @param executionContext
- * @param token
- */
- protected void cancelTokenTasks(ExecutionContext executionContext, Token token)
- {
- TaskMgmtInstance tms = executionContext.getTaskMgmtInstance();
- Collection tasks = tms.getUnfinishedTasks(token);
- for (Object task : tasks)
- {
- TaskInstance taskInstance = (TaskInstance)task;
- if (taskInstance.isBlocking())
- {
- taskInstance.setBlocking(false );
- }
- if (taskInstance.isSignalling())
- {
- taskInstance.setSignalling(false );
- }
- if (!taskInstance.hasEnded())
- {
- taskInstance.end();
- }
- }
- }
- }
结束所有分支节点任务,流向结束节点。
评论
4 楼
rebellan
2008-07-18
太感谢楼主的分享精神了,搞了好久的会签 被楼主点通了,谢谢
3 楼
zhumaohua
2008-02-21
2 楼
llandyl
2007-12-04
问题已经解决。是测试程序测试方法不对造成的。
1 楼
llandyl
2007-12-03
如果将流程定义文件修改,变成两次调用生成<node name="foreachf">就会有错误,而不是直接结束。
错误出现在 executionContext.getJbpmContext().getSession().save(loopToken);
。通过跟踪发现,是executionContext.getJbpmContext()为空。即报Caused by: java.lang.NullPointerException的错误。
这个问题困扰我几天了。一致没有解决。
不知那位有过此情况下的情况,望告知。谢谢!
错误出现在 executionContext.getJbpmContext().getSession().save(loopToken);
。通过跟踪发现,是executionContext.getJbpmContext()为空。即报Caused by: java.lang.NullPointerException的错误。
这个问题困扰我几天了。一致没有解决。
不知那位有过此情况下的情况,望告知。谢谢!
发表评论
-
几个不错的基于erlang的项目,先标记一下,有时间研究一下
2008-11-27 13:39 1084Scalaris 、 couchDB 、 Rabbitmq -
dojo combobox的autocomplete不支持中文检索问题的解决办法
2008-04-24 19:48 2062只需要修改ComboBox.js文件, 将if(evt.ctr ... -
terracotta在hibernate应用上的严重问题
2008-01-15 15:10 1204在原有的一个hibernate应用上,使用terracotta ... -
Lighttpd轻量级的web server
2007-04-18 06:20 942lighttpd和apache一样是开源的,与apache相比 ... -
memcached高性能的分布式内存缓存
2007-04-18 06:58 1323当今对于网站的功能要求越来越高,生成静态文件的方式已经无法满足 ... -
memcached安装及使用
2007-04-18 07:58 20281、安装下载memcached 及libevent(memca ... -
构建在lucene之上搜索引擎框架
2007-04-19 05:23 2354Compass和Hibernate Search都是构建在lu ... -
MYsql查询缓存介绍
2007-04-24 01:38 1270看到一篇介绍 Mysql查询缓存的文章,标记一下。 -
困扰已久的链接参数带中文接收时变乱码的问题
2007-04-26 08:02 1540一直怀疑是jboss或者是seam框架自身的问题,却把tomc ... -
Hibernate shard介绍
2007-04-27 03:37 6804hibernate shards源自google的 ... -
Top10 J2EE性能问题
2007-05-02 08:44 112510、过多的日志开销9、不正确的应用服务器配置8、不恰当的使用 ... -
Memcached性能测试
2007-05-02 09:32 2715以1w个对象的get,set,delete三种操作进行测试当对 ... -
几个优秀的java测试套件
2007-06-01 01:55 1665三种单元测试套件:JUnit 、TestNG 、p-unitJ ... -
tapestry4.1.2怪异的问题
2007-07-03 06:52 1010环境tomcat6:如果应用名称和web.xml配置的serv ... -
RedHat Developer Studio初试
2007-08-27 02:15 1606试用了一下RedHat Developer Studio的be ...
相关推荐
内含jbpm4.4的会签实例,使用customactivity实现,并且内含有使用的丰富工具类,有兴趣的朋友下载学习~
会签源文件 博文链接:https://yy666.iteye.com/blog/660701
jBPM4.4 会签(带加签、减签功能),通过查找资料,个人摸索,利用custom节点实现了会签功能,加签、减签功能是我自己摸索出来的,是不是能满足大家的需求,仅供参考。
jbpm-3_2_2-Api jbpm 著名工作流引擎
jBPM4.4 会签(带加签、减签功能),通过查找资料,个人摸索,利用task节点实现了会签功能,加签、减签功能是我自己摸索出来的,是不是能满足大家的需求,仅供参考。
jbpm的流程部署 流程开始 任务提交 查询已办,待办
BPM4工作流应用开发指南 《jBPM4工作流应用开发指南》是2010...306 第20章 中国特色工作流的jBPM实现 307 20.1 退回 308 20.2 取回 313 20.3 会签 318 20.4 委派 326 20.5 自由流 331 20.6 小结 332 附录A jBPM术语 334
在开源工作流JBPM 的基础上,利用其特有的事件处理机制,提出了实现任务 回退,任务催办和会签任务等特殊工作流的方法,提高了开发效率并具有良好的灵活性,满 足了实际项目开发的需要。
21 会签 53 Xml: 53 code: 54 工作流相关资料 56 22.通过processID查询流程任务 56 23.通过ExecutionId得到 56 24 查询已经结束的流程的节点 56 25 并行任务特点 57 26 得到正在执行的节点 57 27 任务委派给指定人或...
1 章 helloworld..............................................2 1.1 下载开发套件.............................................2 1.2 安装流程设计器 .........................................7 1.3 jBPM版...
工作流开发会签两套方案(Java源代码实现)
1 章 helloworld..............................................2 1.1 下载开发套件.............................................2 1.2 安装流程设计器 .........................................7 1.3 jBPM版...
宏天BPM X3软件平台是一个易于部署和使用的新一代业务流程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务流程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM流程管 理架构。...
流程支持会签、并签、自由指派、自由回退、取回、代理等,并在每个审批节点都可以植入Java代码,实现任何业务需求,提供多种报表实时监控。 技术实现非常适合与研究GWT的人,有GWT的自定义控件、GWT与Spring集成、...