Insect Workflow
关键字: workflow java
今天整理代码,发现一个去年写的简单的工作流引擎,基于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,分别测试了四种路由和定时、延时触发,有兴趣的可以看一下。
发表评论
我的留言簿
-
你好,看过你关于自定义classloader的回帖,想问问几个问题:
  ...
-- by llp20_2000
最近加入圈子
最新评论
-
Ruby Tip——读文件
花花公子 写道IO.read("test.log")嗯,这个方法我是知道的,我前 ...
-- by dennis_zane -
Ruby Tip——读文件
IO.read("test.log")
-- by 花花公子 -
一封邮件
咋我没收到呢....
-- by yangzhihuan -
漂亮的代码
说得比较深.看的时候,觉得句句都正中心坎.看完之后,好像没啥收获.还是要自己试过 ...
-- by yangzhihuan -
广州opensource camp小记
貌似你那件open source camp的T-shirt背后很多广告滴说.
-- by yangzhihuan







评论排行榜