jBPM源码分析(1)

来源:互联网 发布:周公解梦是真的吗 知乎 编辑:程序博客网 时间:2024/04/30 19:46

jBPM中有三处我认为不妥的地方 : 

1. 在identity模块中,org.jbpm.identity.assignment.ExpressionAssignmentHandler.java的87行。如果表达式结果为Group时,应用pull分派模式,此时将Group中的每个成员加入到流程实例的pooledActors。但原来的代码将entity的name加入pooledActors显然不行,更正如下:
else if (entity instanceof Group)
                     {
                            // put the group in the pool
                            Set users = ((Group) entity).getUsers();
                            String[] actorIds = new String[users.size()];
                            int i = 0;
                            Iterator iter = users.iterator();
                            while (iter.hasNext())
                            {
                                   actorIds[i] = ((User) iter.next()).getName();
                                   i++;
                            }
                            assignable.setPooledActors(actorIds);
                     }
 
2. 子流程调用的问题。在org.jbpm.graph.def.node.ProcessState.java中,对流程定义进行解析时(read()函数中),若读取到已指定的子流程名和版本号,原来代码中在此处读取subProcessDefinition,进行保存。这就要求所有子流程定义必须在父流程定义之前进行部署,这样不太合理。删掉loadProcessDefinition()的相关代码,在ProcessState的execute()函数中创建流程实例之前读取流程定义。创建完流程实例后,要确保该子流程实例能启动并执行。
 
3. 删除某个流程实例时,若该流程有父流程实例或者子流程实例,此时如果只简单的删除该流程实例,则对其父(或子)流程实例进行数据库操作时会有问题。因为与该流程相关的一些保存在数据库中的对象已被删除。我的一种解决方法是:在父流程实例中保存所有子流程实例的ID,修改父流程实例引用子流程实例(或流程定义)的有关对象的地方(方法是不存对象,而是存其ID,需要对象时再从数据库加载);当删除流程实例时,首先删除所有属于该流程实例的子流程实例。 
原创粉丝点击