使用Spring AOP和AspectJ编排工作流 - 编程入门网
册事实允许或不允许各个过滤器执行。
“校验物品数量”将注册物品数量充足的事实,该事实是“获得贷记授权”的前提。“获得贷记授权”也要注册贷记已授权这一事实,而这又是“配送”活动的前提。存在或缺少事实也将被用来决策何时不执行一个特定活动,这又把我们带回到了“手工贷记审核”场景,怎么才能从中间重新启动流程呢,或者问一个更好的问题: 我们怎样才能重新启动该流程,而不重复该流程上下文中已经执行过的活动? 记得吗,共享的数据token(上下文)也代表了流程的状态。这一状态包含了该流程登记的所有事实。这些事实被求值以做出转移决策。因此,在“手工贷记审核”场景中,如果我们从最开始重新提交整个流程,我们的转移管理机制,在遇到第一个活动“校验物品数量”之前,会马上意识到物品数数量充足事实(item available fact)已经注册过了,这个活动不应再次重复,因此,它将跳到下一个活动——“贷记审核”。因为贷记已授权事实也已经注册过了(通过某种手工录入方式),它将再次跳到下一个活动“配送”,只允许这一活动执行并完成该流程。 在我们进入实际例子之前,有一个更重要的话题还要讨论一下,那就是活动被定义的顺序。尽管从一开始好像活动的顺序在(这些活动所定义的)流程转移决策中并不起任何作用。 流程中活动的顺序只是代表了流程本身的平衡能力——该策略基于事实的可能性和概率,它们的存在将给下一个活动的执行或不执行创造一个理想的环境。改变活动的顺序永远不应影响整个流程。 实例: Legend: d - depends p - produces Process: ProcessContext = A(d-1, 2; p-3) -> B (d-1, 3; p-4, 5) -> C(d-4, 5); 按照上面的公式,当流程在给定的ProcessContext内开始时,第一个要考虑的活动是A,在它被调用之前依赖于事实1和2。假定事实1和2存在于 ProcessContext中,活动A将执行并产生事实3。在线上的下一个活动是B,它依赖于事实1和3。我们知道我们的流程在活动A执行之前事实3发生的可能性和概率非常小。可是在活动A被执行之后,事实3存在的可能性和概率则相当高,因此活动B的顺序是跟在A后面。 但是如果我们把活动B和A的顺序颠倒一下,会有什么变化? ProcessContext = B (d-1, 3; p-4, 5) -> A(d-1, 2; p-3) -> C(d-4, 5); 变化不大。当流程被调用时,维护着事实注册表的ProcessContext将很快断定已注册的事实不足以允许活动B被调用,因此它将跳到下一个活动A。假定事实1和2是存在的,对事实进行评估将确定已注册的事实足以允许调用活动A,等等。活动C也将被跳过,因为它缺少由B产生的先决条件。如果流程再次与同一个的ProcessContext一起被提交,活动B将被调用,因为活动A在流程前一次调用过程中已经注册了活动B所需的事实,满足了B执行的前提条件。活动A将被跳过,因为ProcesContext知道活动A已经做了它的工作。活动C也会被调用,因为活动B已经注册了足够的事实以满足活动C的先决条件。 因此,正如你所看到的,变换活动的顺序不会改变流程行为,但可影响流程的自动化特征。 使用Spring AOP和AspectJ编排工作流(5)时间:2011-03-14 infoq Oleg Zhurakousky 译:宋玮5.实例 该例子包含了如下制品: GenericProcess的实现,正如你所见,它包含的代码没什么意义,事实上它从未会包含任何有意义代码。这个类的唯一目的就是作为应用代表各个活动的拦截过滤器链的目标类。 它相应的Spring定义为: PurchaseItem(购买物品)流程的其他配置包括三部分: 第一部分(第14行)——流程装配AOP配置,包含把GenericProcessImpl.execute(..)方法 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |