博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Insect Workflow
阅读量:7052 次
发布时间:2019-06-28

本文共 2454 字,大约阅读时间需要 8 分钟。

今天整理代码,发现一个去年写的简单的工作流引擎,基于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

转载地址:http://pmvol.baihongyu.com/

你可能感兴趣的文章
感谢付费客户不覺流年似水(271558528) 对C#ASP.NET通用权限管理组件的改进意见,已修正...
查看>>
android 让 TextView 自带滚动条
查看>>
win2003远程桌面不自动注销,自动锁定时间
查看>>
Shell脚本
查看>>
RPM包管理
查看>>
mdadm--RAID 5
查看>>
服务器的几种时间同步
查看>>
我的友情链接
查看>>
解决mysql无法导入本地文件的问题
查看>>
iOS中block介绍(四)揭开神秘面纱(下)
查看>>
Tomcat启动权限
查看>>
一步一步學習partitions之hash partitions
查看>>
POJ 1061 青蛙的约会 扩展欧几里得
查看>>
java中堆(heap)和堆栈(stack)
查看>>
第五天:Before -- CMD
查看>>
Docker软件安装系列。
查看>>
我的友情链接
查看>>
LeetCode-330.Patching Array
查看>>
Linux下用Java获取本机IP
查看>>
Eclipse的Spring库导入
查看>>