Compiere 工作流引擎

[转][url]http://blog.csdn.net/songgz/archive/2007/09/10/1778688.aspx[/url]
  Compiere 工作流引擎用于管理 Compiere 的核心事务处理。并且 Compiere 中所有的流程都自动启用了工作流,使流程易于扩展和修改。
  具体看一下引擎的类图。
[img]http://dl.iteye.com/upload/attachment/142339/7529b63c-89e5-30a4-8c27-f4e64396b5eb.gif[/img]
   MWorkflow类负责定义工作流;WMFProcess类负责定义工作流的流程;WMFNode类负责定义工作流的节点点;MWFActivity类负责定义工作流的活动,即工作项;MWFNextCondition类负责定义下一工作节点的触发条件;StateEngine类负责定义工作流的状态及状态转换;DocAction接口定义单据的处理标准,参与流程处理的文档Model需要实现此接口;其它的一些辅助类没有在图中给出如:WMFAccess类负责工作流的访问权限;WorkflowValidate类为负责工作流合法性验证;

  了解类的职能后,再来看一个典型的工作流程:
[img]http://dl.iteye.com/upload/attachment/142341/e3c4a9c5-17f0-3898-9726-a5ee585a50fb.gif[/img]  
  Compiere工作流由ProcessCtl类的startWorkflow()方法启动,这个方法需要参数AD_Workflow_ID。接下来startWorkflow()方法调用了MWorkflow类的start()方法,start()方法调用了MWFProcess类的startWork()方法,在个方法中得到工作流的节点,并通过这个节点ID调用MWFActivity类的run()方法。run()方法又调用了本类的performWork()方法来执行一个工作任务(工作项)。

  Compiere工作流引擎的核心机制(调度):
[img]http://dl.iteye.com/upload/attachment/142343/e93ee8d6-9c23-39f4-a26c-e88c5f9928c3.gif[/img]

  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()方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/songgz/archive/2007/09/10/1778688.aspx
Stepify(node-stepify) 是一个简单易扩展的Node.js流程控制引擎,采用方法链(methods chain)的方式定制异步任务,使得Node.js工作流易于理解和维护。 目标是将复杂的任务进行拆分成多步完成,使得每一步的执行过程更加透明,化繁为简。 stepify特点 最基本的API的就3个:step(),done(),run(),简单容易理解。 精细的粒度划分(同时支持单/多任务),执行顺序可定制化。 每一个异步操作都经过特殊的封装,内部只需要关心这个异步的执行过程。 链式(chain)调用,代码逻辑看起来比较清晰。 灵活的回调函数定制和参数传递。 统一处理单个异步操作的异常,也可根据需要单独处理某个任务的异常。 最简单的用法 简单实现基于oauth2授权获取用户基本资料的例子: // Authorizing based on oauth2 workflowStepify()     .step('getCode', function(appId, rUri) {         var root = this;         request.get('[authorize_uri]', function(err, res, body) {             root.done(err, JSON.parse(body).code);         });     }, [appId], [redirectUri])     .step('getToken', function(code) {         var root = this;         request.post('[token_uri]', function(err, res, body) {             root.done(err, JSON.parse(body).access_token);         });     })     .step('getInfo', function(token) {         request.get('[info_uri]?token='\u00a0 \u00a0token,\u00a0function(err,\u00a0res,\u00a0body)\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0//\u00a0got\u00a0user\u00a0info,\u00a0pass\u00a0it\u00a0to\u00a0client\u00a0via\u00a0http\u00a0response\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\u00a0\u00a0.run();\n\u591a\u4e2astep\u5171\u7528\u4e00\u4e2ahandle\u3001\u9759\u6001\u53c2\u6570\u3001\u52a8\u6001\u53c2\u6570\u4f20\u9012\u7684\u4f8b\u5b50\uff1a\nStepify()\n\u00a0\u00a0\u00a0\u00a0.step('read', __filename)     .step(function(buf) {         // buf is the buffer content of __filename         var root = this;         var writed = 'test.js';         // do more stuff with buf         // this demo just replace all spaces simply         buf = buf.toString().replace(/\s /g, '');         fs.writeFile(writed, buf, function(err) {             // writed is the name of target file,             // it will be passed into next step as the first argument             root.done(err, writed);         });     })     .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值