Compiere 工作流引擎

时间:2022-04-29 13:38:32

  Compiere 工作流引擎用于管理 Compiere 的核心事务处理。并且 Compiere 中所有的流程都自动启用了工作流,使流程易于扩展和修改。
  具体看一下引擎的类图。

  Compiere 工作流引擎
  
 MWorkflow类负责定义工作流;WMFProcess类负责定义工作流的流程;WMFNode类负责定义工作流的节点点;MWFActivity类负责定义工作流的活动,即工作项;MWFNextCondition类负责定义下一工作节点的触发条件;StateEngine类负责定义工作流的状态及状态转换;DocAction接口定义单据的处理标准,参与流程处理的文档Model需要实现此接口;其它的一些辅助类没有在图中给出如:WMFAccess类负责工作流的访问权限;WorkflowValidate类为负责工作流合法性验证;

  了解类的职能后,再来看一个典型的工作流程:  Compiere 工作流引擎
  Compiere工作流由ProcessCtl类的startWorkflow()方法启动,这个方法需要参数AD_Workflow_ID。接下来startWorkflow()方法调用了MWorkflow类的start()方法,start()方法调用了MWFProcess类的startWork()方法,在个方法中得到工作流的节点,并通过这个节点ID调用MWFActivity类的run()方法。run()方法又调用了本类的performWork()方法来执行一个工作任务(工作项)。

  Compiere工作流引擎的核心机制(调度)。
Compiere 工作流引擎
  Compiere的调度机制并不复杂,从上图可以看出。当创建一个工作流(MWorkflow)实例的时候,在MWorkflow (Properties ctx, int AD_Workflow_ID, String trxName)构造方法中调用loadTrl()方法装载迁移,调用loadNodes()方法装载任务(工作项即MWFNode实例)。当创建MWFNode实例的时候,在MWFNode (Properties ctx, ResultSet rs, String trxName)构造方法中调用loadNext()和loadTrl()方法装载下一步要执行的任务和迁移。在创建下一任务(MWFNodeNext)实例后,要设置这个任务的分支类型(即OR、AND)。到此就装载了整个流程的所有可能执行的任务。而任务的执行是通过MWFActivity类中的performWork (Trx trx)方法来执行的,这个方法反回一个布尔值。在这个方法中首先判断工作项(任务)的执行类型(文档或报表),然后执行DocAction.processIt (String action)方法,到此才真执行一个任务。我想这个方法大家非常熟悉,当在Compiere中定制一个工作流时就要实现这个方法了。
  有人会问了,这是什么调度啊!下一节点(工作项)执行是怎么触发的呢?这个秘密就隐藏在MWFActivity.run()方法中,在这个方法中调用了设置活动状态的setWFState()方法,此方法中调用了MWFProcess实例的checkActivities()方法,这个方法用来检查活的状态。如果当前活动的状态为已完成,则在此开启下一个活动(任务或工作项),开启方法就是startNext()方法。