[开源]起步,这只是一个开始。开源Qoss Flow Engine项目pre-alpha版本

迈开的第一步,至少证明已然开始。

这还只是以个pre-alpha的版本,意味着,它目前就根本没有多少功能,它也许只还有那一点点尚未搭建完成的骨头架子,但它会慢慢成长。

…..

哈哈,废话真多。步入正题吧。

1. Qoss Flow Engine是什么?

         Qoss其实它的定位是一个开源的BPM(Business Process Management,业务流程管理) ,现在说它是个BPM,就说大了,其实,它现在就还只是个控制流程流转的类库而已。在一个BPM系统中需要很多完善的功能,而它目前根本没有实现。

对Qoss的期望是一个完整的BPM系统,它的alpha版应该包含的功能应该有:

表单引擎
流程引擎
流程设计引擎

而现在Qoss Flow Engine项目,将是BPM中流程引擎的pre-alpha版本。

2 、希望Qoss Flow Engine能做什么

总的来说,引擎主要关注四个方面的问题:

(1) 流程定义问题:不是说如何图形化的定义流程,而是如何用一套定义对象,来诠释所定义的流程。

(2) 流程调度问题:提供什么的机制,可以确保流程能够处理复杂的“流程图结构”,诸如串行、并行、分支、聚合等等,并在这复杂结构中确保流程从一个节点运行到另一个节点。

(3) 流程执行问题:当流程运行到某个节点的时候,需要一套机制来解决:是否执行此节点,并如何执行此节点的问题,并维持节点状态生命周期。

(4) 流程实例对象:需要一整套流程实例对象来描述流程实例运行的状态和结果。

clip_image002

3、Qoss Flow Engine 做了什么

1、 能够通过xml文件描述一个复杂的业务流程,是开发人员能够轻松快捷的配置复杂流程[在bpm系统中通过可视化的流程设计引擎设置生成xml文件]。

2、 提供了可扩展的Event-Action机制,来辅助扩展处理流程流转控制

3、 提供了灵活的条件表达式机制,来辅助条件解析、脚本计算的处理。

4、 节点的类型和扩展,可以通过定义自己的Node节点对象,来补充节点对象,满足流程对业务逻辑的控制需求

4、 Qoss Flow Engine 目前能做什么?

1、 流程的定义流转,支持普通节点(多任务单人处理),多任务并行

2、 灵活的条件判断,允许配置与表单数据相关的流转条件

 

<nextNode>
        <code>OPLeaderApproval</code>
        <condition>
          <key>MutilExecutor</key>
          <expression>{Monney}>99999 &amp;&amp; {opiniontype}=1</expression>
        </condition>
      </nextNode>
3、 流转事件的支持,如:节点开始,节点执行,流程开始,流程结束,都可以通过配置监听到事件,并执行自定义逻辑实现

<plugin>
        <key>Notice</key>
        <config>{Roles:"role1,role2",Users:"user1,user2"}</config>
 </plugin>

4、插件式任务适配器模式,允许自定义任务的实现

5、Qoss Flow Engine 怎么用

对于pre-alpha版本而言,如何用还不是重点,更何况它现在都还没有一个完整的运行环境(当然,我自己搭了一套集成环境,包括用户组织机构,授权等应用)。

在发布pre-alpha版本中,已经可以实现以下图表中的流程实现了,当然了只有流程引擎部分的实现。

image

由于目前测试程序的代码依托于商业项目的基础环境,因此暂时不能发布测试项目的代码给大家。

这里简单的给出项目中关于流程引擎的调用代码,在下一篇的博文中将详细介绍如何用pre-alpha版本实现上述流程的流转,同时也将整理出Qoss Flow Engine的源代码提供大家下载。

IFlowEngine flowEngine = FlowFactory.GetFlowEngine(); //new FlowEngine();
            var currentUser = new UserWrapper()
            {
                Account = "administrator",
                MainOrg = "Org",
                Name = "超级管理员",
                Orgs = new List<string>(){ "Org1","Org2" },
                Posts = new List<string>(){  "administrator", "admin"},
                Roles = new List<string>(){"administrator","admin"},
                UnitCode = "Qoss.BPM"
};
            FormDataDictionary formData = new FormDataDictionary();
            formData.Add("Title", "here is the title");
            var instance = flowEngine.CreateInstance("TestFlow", currentUser, formData);
        
            //启动流程并流转至下一个节点
            //这一系列操作均是在用户提交数据后处理
            instance.Start(currentUser, formData);
            //获取下个节点
            var nextNodeList = instance.GetNextNodes();
            var node = nextNodeList.FirstOrDefault();
            instance.ProcessNext(new ProcessInfo()
             {
                 NextNode = node,
                 Operator = new List<UserWrapper>()
              {
                 currentUser
              }
             });

            Assert.AreEqual(instance.Context.TransferInfo.CurrentNodeCode,node.Code);
            //由于web应用此步骤是分开的
            //context上下文是需要重新获取的
            //对于客户端能保持的数据有:
            //任务Id,flowCode,当前用户,实例id(instanceid)
            var taskId = "Node1";
            var newContext = flowEngine.GetInstance(taskId, currentUser, formData);
            nextNodeList = newContext.GetNextNodes();
            node = nextNodeList.FirstOrDefault();
            newContext.ProcessNext(new ProcessInfo()
            {
                NextNode = node,
                Operator = new List<UserWrapper>()
                {
                    currentUser
                }
            });

            Assert.AreEqual(newContext.Context.TransferInfo.CurrentNodeCode , "Node2");

posted @ 2014-06-21 01:16  FishNet  阅读(5146)  评论(0编辑  收藏  举报