经过前面一段时间的思考,我发现在JWFDv0.96版本中用于流程引擎的自动运行控制器SAN算法存在着一些值得改进的地方,这种改进也许还无法实现我在前面的文章说描述的那种流程自适应控制的机制(http://comsci.iteye.com/blog/537131),但是至少可以让流程在自动运行过程中变得更加灵活和便于控制
下面是SAN自动运行控制器的一个伪代码描述,让我们来看看,到底是什么地方可以改进一下
FOR循环体(循环控制变量为存储节点的链表容量)
IF (当前节点尚未处理)
THEN 嵌入处理过程
递归前进
ELSE IF (当前节点处理完毕)
THEN 嵌入处理过程
递归前进
ELSE IF (当前节点正在处理)
THEN 嵌入处理过程
递归前进
FOR循环体结束
在上述代码-判断节点的状态值的IF语句中间,我们还可以嵌入更加复杂的IF判断语句,用于对流程的运行过程进行更加精细的控制,当然这种精细的控制将给工作流引擎带来更加复杂的调控模式和更加庞大的代码量,同时也增加了工作流引擎的设计难度,所以我要考虑一下,是否值得这样做。。。。有时候,控制的松一些反而更好,控制得过于细,反而不利于流程的整体运行。。。。
在流程的运行过程中,真正起决定性作用的是上述伪代码的蓝色字体表述的-递归前进的这一过程,无论前面做什么样的判断和处理,最终要靠递归来推动流程进入下一个节点中,所以我们真正要动手修改的地方就是这个地方,参考SAN函数具体的递归模块的代码(代码详见 org.jwfd.workflowEngines.Algorithm.TopologyAnalysis.java)
System.out.println("普通点的递归"+step_id);
java.util.ArrayList lln = new java.util.ArrayList();
lln = gcm.ConditionDfs(step_id, graphid);
ftcer.set_end_time(step_id, graphid);
gcm.SAN(lln, graphid,step_id);
在流程调试器处理流程前进的按钮的代码中,我嵌入了上面的一段代码,在我们调用方法gcm.SAN()开始递归之前,我们对当前流程节点进行一些设置,这并不是我们讨论的重点,仅仅说一下,ftcer.set_end_time()这个函数是用来对当前节点设置时间的一个函数,通常我们在调用递归函数让流程开始流转之前,一般要对前面处理的节点进行一下时间值和处理状态值之类的设置(当然,如果我们需要对流程进行更加精细的控制,那么这种设置所需要的代码量就更大了),在这之后,我们才让流程进入下一个待处理的节点。
注意一点,我们是通过传递参数lln(lln是一个数组类型的数据,里面保存着一个或者多个正在被处理的流程图中的节点) 来控制递归过程的方向的,如果在这里我们修改一下lln这个参数所传递的节点(节点群),那么流程运行的方向就将发生变化,我们可以让lln数组里面的节点发生变化,如果我们截取lln数组的值,并将其修改,比如说当前流程正要进入下一个节点,那么我们把这里的下一个节点(如何获得当前节点的下一个节点,请参考JWFD工作流引擎API函数简要说明)替换为另外一个我们想让流程处理的节点,比如说让流程立即跳转到我们指定的一个节点那里去处理,而不按照流程的顺序来依次处理,那么这种处理模式就被大家称为-自由流或者随意流的流程控制模式
今天就写到这里,大家有时间,有兴趣可以研究一下我前面说的东西。。。。。。。。