分析jBPM源码的方法

分析jBPM源码的方法

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,需要对象时再从数据库加载);当删除流程实例时,首先删除所有属于该流程实例的子流程实例。