Insect Workflow

今天整理代码,发现一个去年写的简单的工作流引擎,基于petri网(参考这里的笔记),实现了顺序、并行、循环和选择四种路由,资源也实现了人工驱动和定时、延迟时间驱动;目前只实现了将工作流数据保存在内存的版本,然后就换工作,折腾着就忘了这个事儿,本来是计划加入数据库存储的。尽管只是个toy,可能对工作流感兴趣,或者想自己实现一个玩玩的朋友有参考价值,放到了google code上,svn地址:
 http://insectworkflow.googlecode.com/svn/trunk/

    源码中有在example包下给了个请假的例子,流程定义文件就是processes包下的leave.xml,实现大概是这么个流程:
填写假单-》提交假单-and-split节点-》项目经理审批-》and-join节点-》结束
                                                     -》部门经理审批-》

其中项目经理审批和部门经理审批是并行路由。xml配置大概这样:

<node type="and-split" name="and-split" id="2">
        <inputs>
            <place id="3" />
        </inputs>
        <outputs>
            <place id="4" />
            <place id="5" />
        </outputs>
    </node>
    <node name="dept_manager_confirm" id="3">
        <resource class="com.google.code.insect.workflow.impl.Group" id="2"
            name="dept_manager">
        </resource>
        <conditions type="and">
            <condition
                class="com.google.code.insect.workflow.impl.NullHandler" value="false"
                variable-name="LeaveInfo" />
        </conditions>
        <handler
            class="com.google.code.insect.workflow.example.leave.SendRemindHandler" />
        <inputs>
            <place id="4" />
        </inputs>
        <outputs>
            <place id="6" />
        </outputs>
    </node>
    <node name="project_manager_confirm" id="4">
        <resource class="com.google.code.insect.workflow.impl.Group" id="3"
            name="project_manager">
        </resource>
        <conditions type="and">
            <condition
                class="com.google.code.insect.workflow.impl.NullHandler" value="false"
                variable-name="LeaveInfo" />
        </conditions>
        <handler
            class="com.google.code.insect.workflow.example.leave.SendRemindHandler" />
        <inputs>
            <place id="5" />
        </inputs>
        <outputs>
            <place id="7" />
        </outputs>
    </node>
    <node type="and-join" name="and-join" id="5">
        <handler
            class="com.google.code.insect.workflow.example.leave.ResultHandler" />
        <inputs>
            <place id="6" />
            <place id="7"></place>
        </inputs>
        <outputs>
            <place id="8" />
        </outputs>
    </node>

    其中的place就是各个Transition的输入或者输出库所,所谓node其实就是变迁(transition),每个变迁对应一个handler,执行具体的业务操作,比如这里的com.google.code.insect.workflow.example.leave.SendRemindHandler 用于发送提醒消息给经理们。

    具体调用和工作项的人工触发:

//初始化工作流管理器
WorkFlowManager wm = new BasicWorkflowManager();
wm.setConfiguration(new DefaultConfiguration());

//启动一个案例
Token token = wm.startWorkFlow("leave");
token.setAttribute("LeaveInfo", leaveInfo);

//提交假单
wm.doAction(token.getId(), this.dennis, "给领导发送消息:"
                + leaveInfo.getStaff_name() + "申请请假,请批准!");
//将token的id传递给后续节点做处理。。token的id就是案例id

    processes包下面的流程定义文件和test包下的TestUnit,分别测试了四种路由和定时、延时触发,有兴趣的可以看一下。

文章转自庄周梦蝶  ,原文发布时间 2008-05-21

时间: 2024-10-27 16:17:10

Insect Workflow的相关文章

写一个简单的工作流(四)资源的处理

昨天晚上搞到深夜,终于将资源模块搞定.到今天已经完成的功能包括: 1.四种基本路由:顺序.选择.并行.循环 2.流程定义文件和系统配置文件的读取和解析 3.使用内存作为流程数据和案例数据存储的MemoryWorkFlowDAO的开发 4.资源模块的开发 5.并发情况下的正确性测试等     计划中的功能: 1.一个GUI的流程定义工具,这个不急,也还没想好用什么做,web还是桌面? 2.各个数据库版本的WorkFlowDAO的开发,将流程数据和案例数据保存在数据库中. 3.更多的测试和examp

写一个简单的工作流(二)

    hoho,今天完成了选择路由的实现,完成了配置文件的读写和解析,流程定义文件还是决定采用xml文件,不过与其他工作流引擎采用的xml完全不同,因为是基于petri网的,因此引入了place的概念,比如下面这个4个节点的顺序路由的流程: <workflow maxCases="100">     <node type="start" name="start" id="0">         <

写一个简单的工作流(三)

上午测试了下并发情况下的表现,测试场景:一个有20个节点,包括选择.顺序.并行路由的流程,所有节点都设置为自动执行,1000个线程并发启动案例,也就是这个流程同时有1000个案例在跑,全部跑完结果差强人意,比单线程慢了接近30倍.仔细调整了算法和加锁粒度,尽管整体性能有所提高,但是多线程和单线程间执行的差距仍然没有多大变化,性能瓶颈还是在核心的调度算法上,还需要分析下.测试程序如下: package net.rubyeye.insect.workflow.test; import java.ut

如何在Salesforce中添加Workflow Rule

在Salesforce中可以添加Workflow Rule来执行特定的动作,比如说:当Object的某个字段发生变化时,根据变化的值去修改其他field,和Trigger的功能很类似,不过Trigger需要编码完成需要的逻辑,而Workflow Rule所指定的Acton则更加偏重Out-Of-Box方式. 如果创建一个Workflow Rule呢?请看如下简单的操作步骤 1): 在Setup --> Build --> Create --> Workflow & Approva

Fire Workflow源码分析——(基本组成)(5)

最近一大堆乱七八糟的事情,今天把 org.fireflow.model.io这个包给介绍完,那么Fire Workflow的 Model项目算是完成了. 主要分两大块:序列化和解析. FPDLNames:这个类定义了FPDL的元素和规范.包括命名空间里面的基本元素,本类决定流程文件的格 式和规范,由于元素太多,这里不一一展示了.FPDL基本是对XPDL的扩展,详细内容可以参见 http://www.fireflow.org/viewthread.php?tid=68&extra=page%3D1

Fire Workflow源码分析——(基本组成)(4)

这次讲包org.fireflow.model.resource.首先看一下这个包的整体类图. 资源这块Fire Workflow主要定义了资源和资源管理两大块.其中对于资源的描述分为子流程.应用. 表单和参与者,这里本人对把子流程作为资源的定义不甚理解,而前面介绍的包org.fireflow.model中又 含有WorkflowProcess,个人觉得是不是应该统一比较好?资源管理方面只是简单的实现了一个解析资源 文件(XML格式)的类,这块还有进一步完善的空间.下面对每一部分进行介绍. IRe

Fire Workflow源码分析——(基本组成)(3)

好像分析的顺序错了,应该是先分析流程定义的基本元素好一些,今天就给大家展示一下Fire Workflow的org.fireflow.model.net包. 首先看一下整体类图: 由图很显而易见,Node分为两大类,Synchronizer和Activity,其中前者又可以分为EndNode和 StartNode.边Edge两端关联两个Node.Loop和Transition继承自Edge.由于Fire Workflow是基于Petri 网理论的,Transition也就是Petri net 中的

Fire Workflow源码分析——(基本组成)(1)

Fire Workflow是最近兴起的国内比较火的开源工作流引擎,本人从发现它.应用它到解读它,感觉很 有前途.本开源项目有个谦逊的leader--非也,有个稳定良好的团队,我相信只要坚持,它的发展是长 远和美好的. FireWorkflow的源代码主要 包含两个部分:FireflowEngine和FireflowModel,其中FireflowEngine 主要是一些工作流运行时的服务,如事件处理.条件判断.数据持久化.工作流委派等等服务和操作,另 外还预留了一些扩展接口.FireflowMo

WF从入门到精通(第五章):workflow跟踪

学习完本章,你将掌握: 1.workflow的可选服务 2.创建一个事件跟踪数据库 3.激活事件跟踪服务 4.创建一个自定义跟踪 5.查看你的workflow的跟踪信息 目前为止,我们看过workflow的一些基本对象.我们通过活动创建workflow任务,它们在执行时由WorkflowInstance对象进行管理.workflow实例由WorkflowRuntime编入队列并进行控制.但WF不只是为我们提供了这些对象,它也为我们提供了一些服务来和这些对象一起协同工作. 可插拔(可选)服务 工作