今天整理代码,发现一个去年写的简单的工作流引擎,基于petri网(参考这里的
笔记),实现了顺序、并行、循环和选择四种路由,资源也实现了人工驱动和定时、延迟时间驱动;目前只实现了将工作流数据保存在内存的版本,然后就换工作,折腾着就忘了这个事儿,本来是计划加入数据库存储的。尽管只是个toy,可能对工作流感兴趣,或者想自己实现一个玩玩的朋友有参考价值,放到了google code上,svn地址:
http://insectworkflow.googlecode.com/svn/trunk/
源码中有在example包下给了个请假的例子,流程定义文件就是processes包下的leave.xml,实现大概是这么个流程:
填写假单-》提交假单-and-split节点-》项目经理审批-》and-join节点-》结束
-》部门经理审批-》
其中项目经理审批和部门经理审批是并行路由。xml配置大概这样:
其中的place就是各个Transition的输入或者输出库所,所谓node其实就是变迁(transition),每个变迁对应一个handler,执行具体的业务操作,比如这里的com.google.code.insect.workflow.example.leave.SendRemindHandler 用于发送提醒消息给经理们。
具体调用和工作项的人工触发:
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 >
< 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
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