﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-庄周梦蝶，孰蝶是我，我是孰蝶？一梦至今，蝶我已难分-随笔分类-工作流</title><link>http://www.blogjava.net/killme2008/category/19902.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 07:25:36 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 07:25:36 GMT</pubDate><ttl>60</ttl><item><title>Insect Workflow</title><link>http://www.blogjava.net/killme2008/archive/2008/05/21/201911.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 21 May 2008 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/05/21/201911.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/201911.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/05/21/201911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/201911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/201911.html</trackback:ping><description><![CDATA[<a target=""></a>
&nbsp;&nbsp;&nbsp; 今天整理代码，发现一个去年写的简单的工作流引擎，基于petri网（参考这里的<a href="http://www.blogjava.net/killme2008/category/19902.html">笔记</a>)，实现了顺序、并行、循环和选择四种路由，资源也实现了人工驱动和定时、延迟时间驱动；目前只实现了将工作流数据保存在内存的版本，然后就换工作，折腾着就忘了这个事儿，本来是计划加入数据库存储的。尽管只是个toy，可能对工作流感兴趣，或者想自己实现一个玩玩的朋友有参考价值，放到了google code上，svn地址：<br />
<tt><strong><em>&nbsp;http</em></strong>://insectworkflow.googlecode.com/svn/trunk/<br />
<br />
&nbsp;&nbsp;&nbsp; 源码中有在example包下给了个请假的例子，流程定义文件就是processes包下的leave.xml，实现大概是这么个流程：<br />
填写假单-》提交假单-and-split节点-》项目经理审批-》and-join节点-》结束<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -》部门经理审批-》<br />
<br />
其中项目经理审批和部门经理审批是并行路由。xml配置大概这样：<br />
</tt>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">node&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="and-split"</span><span style="color: #ff0000;">&nbsp;name</span><span style="color: #0000ff;">="and-split"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="2"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="3"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="4"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="5"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">node</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">node&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dept_manager_confirm"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="3"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">resource&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.impl.Group"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="2"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff;">="dept_manager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">resource</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">conditions&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="and"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">condition<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.impl.NullHandler"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variable-name</span><span style="color: #0000ff;">="LeaveInfo"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">conditions</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.example.leave.SendRemindHandler"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="4"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="6"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">node</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">node&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="project_manager_confirm"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="4"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">resource&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.impl.Group"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="3"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff;">="project_manager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">resource</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">conditions&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="and"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">condition<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.impl.NullHandler"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variable-name</span><span style="color: #0000ff;">="LeaveInfo"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">conditions</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.example.leave.SendRemindHandler"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="5"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="7"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">node</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">node&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="and-join"</span><span style="color: #ff0000;">&nbsp;name</span><span style="color: #0000ff;">="and-join"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="5"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.google.code.insect.workflow.example.leave.ResultHandler"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="6"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="7"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">place</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">inputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">place&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="8"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">outputs</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">node</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<tt>&nbsp;&nbsp;&nbsp; 其中的place就是各个Transition的输入或者输出库所，所谓node其实就是变迁（transition)，每个变迁对应一个handler，执行具体的业务操作，比如这里的com.google.code.insect.workflow.example.leave.SendRemindHandler 用于发送提醒消息给经理们。<br />
<br />
&nbsp;&nbsp;&nbsp; 具体调用和工作项的人工触发：<br />
<br />
</tt>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">初始化工作流管理器</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">WorkFlowManager&nbsp;wm&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BasicWorkflowManager();<br />
wm.setConfiguration(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DefaultConfiguration());<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">启动一个案例</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">Token&nbsp;token&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;wm.startWorkFlow(</span><span style="color: #000000;">"</span><span style="color: #000000;">leave</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
token.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">LeaveInfo</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;leaveInfo);<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">提交假单</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">wm.doAction(token.getId(),&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dennis,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">给领导发送消息：</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;leaveInfo.getStaff_name()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">申请请假，请批准!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">将token的id传递给后续节点做处理。。token的id就是案例id<br />
</span></div>
&nbsp;&nbsp;&nbsp; processes包下面的流程定义文件和test包下的TestUnit，分别测试了四种路由和定时、延时触发，有兴趣的可以看一下。<br />
<tt><br />
</tt><img src ="http://www.blogjava.net/killme2008/aggbug/201911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-05-21 15:09 <a href="http://www.blogjava.net/killme2008/archive/2008/05/21/201911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PIPE2——Petri网编辑工具</title><link>http://www.blogjava.net/killme2008/archive/2007/09/05/142936.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 05 Sep 2007 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/09/05/142936.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/142936.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/09/05/142936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/142936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/142936.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 最近重新拿起《工作流管理-模型、方法和系统》，需要一个Petri网画图、分析的工具，google一把，在sourceforge上找到PIPE2项目。按它的描述是：Platform Independent Petri Net Editor 2。看了下源码是用swing写的。已经基本满足我的要求了。<br />
项目地址：http://pipe2.sourceforge.net/<br />
<br />
下图是对书中习题七的过程定义<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/ex7.PNG" alt="" border="0" /><br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/142936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-09-05 16:51 <a href="http://www.blogjava.net/killme2008/archive/2007/09/05/142936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《工作流管理——模型、方法和系统》笔记2:Petri网对工作流建模</title><link>http://www.blogjava.net/killme2008/archive/2007/09/01/141929.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 01 Sep 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/09/01/141929.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/141929.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/09/01/141929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/141929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/141929.html</trackback:ping><description><![CDATA[一、工作流概念<br />
1.案例(case）：工作流系统的基本目的就是处理案例，保险索赔、绩效考核、抵押申请等等都是案例。每一个案例都有一个唯一的标识，案例在出现和消失之间总是处于某个特定状态，这个状态有三个元素组成：<br />
（1）案例相关的属性，指出特定条件下案例是否被执行或者忽略<br />
（2）已经满足的条件，说明案例的进展。<br />
（3）案例的内容，可能是文档、文件、档案或者数据库<br />
2.任务（task），泛指一般的工作单元，而非具体案例活动的一次具体执行（这一般称为活动），为了区分这一点，引入了工作项(work item）和活动的概念(activity）。工作项是指将要被执行的实际工作块，而活动就是指工作项的执行。<br />
<br />
3.过程(process）：过程指出了哪些任务需要被执行，以什么顺序执行。可以将过程理解为具体案例的蓝图。过程定义了案例的生命周期，每个生命周期都有start和end。<br />
<br />
4.路由(route）：决定了那些任务被执行和以何种方式执行，包括顺序、并行、选择和循环四种形式的路由<br />
<br />
5.启动（start）：触发，工作项是有一个resource来启动的，触发的形式包括：<br />
（1）资源驱动，比如某个员工<br />
（2）外部事件，一个JMS消息<br />
（3）时间信号，比如凌晨2点触发某任务等等。<br />
显然，触发是由环境而非工作流系统负责的。<br />
二。Petri网<br />
<br />
&nbsp;&nbsp;&nbsp; Petri网是一种过程建模和分析工具，是1962年由Carl Adam Petri提出的，它有着坚实的数学基础，完全形式化的，可以将Petri网应用于工作流的建模和分析过程。<br />
<br />
1.传统的Petri网：<br />
&nbsp;Petri网有place（库所）和transition（变迁）组成<br />
place用于容纳token，token用以表示具体的案例，通过transition的firing（实施）来表现过程的状态转变。理解几个概念：<br />
（1）transition enabled（变迁的就绪）：当且进当transition的每一个输入place都至少有一个token的时候，变迁就绪，可以实施。<br />
（2）transition firing（变迁的实施）：变迁的从每个输入place取走一个token，并往它的每个输出place增加一个token。<br />
看一个Petri网进行过程建模的例子：<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/200671212824330.gif" alt="" border="0" /><br />
<br />
圆圈表示place；矩形表示transition；用黑点表示token，存在于place中，这里没有表示出来，我在网上随便找的一张图，不过这里也展示了And-split、And-join、Or-split和Or-join的四种任务以及四种形式路由（从上到下依次是：顺序、并行、选择和循环）的Petri网建模。<br />
<br />
2.高级Petri网<br />
&nbsp;&nbsp;&nbsp; 传统Petri网有一些缺点，比如无法对某些活动进行有效的建模，容易变的庞大而难以理解，因此通过扩展，就可以对复杂情况用结构化、容易理解的方式建模。关注三种扩展：颜色扩展、时间扩展和层次扩展。<br />
1.颜色扩展，为token引入颜色，用以区分同一place中的不同token，颜色其实代表了token（具体到某个案例）的属性，通过颜色扩展，我们可以为将要被消耗的token值设置了前置条件，那么变迁就绪的前提变化为：每个输入place都至少有一个token，并且满足前置条件。颜色扩展，也将产生的token与消耗的token进行了关联，产生token的值和数目将依赖于被消耗的token的值。<br />
<br />
2.时间扩展，当需要对一个过程的预期性能进行判断时，引入了时间扩展，为token加入时间戳，只有当被消耗的token的时间戳早于当前时间，就绪的transition才可以firing，而产生的token的时间戳就等于firing的时间加上延时。通过引入时间扩展，我们将可以对类似十字路口红绿灯时间敏感的复杂过程进行建模。<br />
<br />
3.层次扩展，过程是由一系列的place、transition、弧线和子过程组成的，为了反映这样的层次结构，适应复杂过程的建模，引入了层次扩展。<br />
<br />
三、工作流概念到Petri网的映射<br />
<br />
1.过程：过程是由条件和任务组成，映射到Petri网，place就是条件，而transition就是任务。条件和place都是被动元素，而任务和变迁都是主动元素。案例就是token，案例的属性通过颜色扩展来映射，token的值包含了案例的属性值。比如保险索赔案例的属性：赔额、索赔人、时间等等。<br />
<br />
2.路由：四种路由的Petri网建模，上面的图片已经给出。简单分析下：<br />
（1）顺序路由，对应图1，任务A和B是顺序执行的，任务B的输入是任务A的结果。通过在两个任务之间引入一个place来解决，中间的圆圈对应的place是任务B执行前的必须满足的条件，同时是任务A执行的结果。<br />
<br />
（2）并行路由：对应图2，为了并行地执行任务B和C，引入了任务A，称为And-split，在A和B、C之间引入两个place，当A任务实施后，为两个输出place产生token，任务B和C就处于就绪状态可以实施。当B和C都实施之后，类似的实行And-join任务（任务D）合并两个任务。<br />
<br />
（3）选择路由：图3对选择路由的建模并不正确，选择执行B或者C，那么在B和C之前引入两个新任务t11、t12和两个place(合并称为Or-split），在前一个place的token，要么实施t11，要么实施t12,假设实施t11,那么任务B将就绪，反之则任务C就绪。同样的可以建模Or-join。选择路由还根据选择的时刻划分为两类，具体不再展开。<br />
<br />
（4）循环路由，图四的建模也不是很精确，循环也跟编程语言中的循环分为：repeate ...until...和while ...do...两种，前者至少执行一次，而后者可能不执行，<br />
<br />
3.启动的映射：我们知道工作项是案例和准备执行的任务的组合，而活动是指一个工作项的实际执行，一旦工作项被实际执行，它就转换成活动。映射到Petri网，工作项就是就绪的变迁（enabled transition），而活动对应一个transition的firing。Petri网中的transition是&#8220;饥饿&#8221;的，一旦它们就绪，就会立刻执行，这样的变迁成为自动的。而工作流中的触发并非是自动的，它可能是资源驱动、外部信号驱动以及时间驱动的。为了建模触发，我们在变迁的上面添加符号来区分：向下的箭头表示资源驱动，信封表示外部信号驱动，而时钟表示时间驱动。<br />
<br />
&nbsp;&nbsp;&nbsp; 初步了解了Petri网，确实是对工作流甚至业务过程建模的良好工具，对于利用Petri网进行过程分析，还待进一步学习。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/141929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-09-01 14:55 <a href="http://www.blogjava.net/killme2008/archive/2007/09/01/141929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用osworkflow写一个请假例子</title><link>http://www.blogjava.net/killme2008/archive/2007/03/02/101488.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 02 Mar 2007 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/02/101488.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; osworkflow扩展非常容易，跟我们的应用结合起来使用也很容易。假设一个请假流程：员工请假，需要经过部门经理和人力资源部经理两人共同审批，只有当两人都许可时才通过，任一人驳回就失效，也就是一个and split和and Join流程，并且我们附加一个要求，当发送请假请求、许可和驳回这几个操作时都将发送一条消息给相应的用户。&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/03/02/101488.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/101488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-02 16:07 <a href="http://www.blogjava.net/killme2008/archive/2007/03/02/101488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《工作流管理——模型、方法和系统》笔记1</title><link>http://www.blogjava.net/killme2008/archive/2007/02/08/98849.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 08 Feb 2007 11:13:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/08/98849.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98849.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/08/98849.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98849.html</trackback:ping><description><![CDATA[一.几个概念：<br />1.我们把一件“事”称为案例（case），有时又叫做工作（work)，职业(job)，产品(Product)，服务(service),项目(item）。案例总处于某个特定状态，该状态由三个元素组成：<br />（1）案例相关的属性<br />（2）已经满足的条件<br />（3）案例的内容<br />2.本质上case都是离散的，它们有自己独立的开始和结束，都能彼此区分，每一个case都在一个过程中被执行。（其实这里的case就是我们一般工作流中的所谓工作流实例）<br /><br />3.过程：由许多要被执行的task(任务)和一系列决定任务执行次序的条件构成。过程定义了案例的生命周期<br /><br />4.任务(task)：是一个工作的逻辑单元，它能够作为一个整体被资源(resource)执行。任务可以被定义为不能再细分的过程，即原子过程，这里存在主观因素。在定义或者分派任务的人看来，任务是原子性的，但是对于执行它的人来说经常是非原子性。<br />5.资源(resource)：是指能够执行特定任务的一个人、一台机器或一群人。<br />6.过程结构的四种基本机制，或者说案例的生命周期（称为路由）：顺序(sequence),选择(selection），并行，循环。<br />7.活动（Activity)：任务的具体执行（由资源所执行）称为活动。<br />8.过程的分类：<br />基本过程：企业中那些生产产品或者服务的过程，也称作生产过程。<br />二级过程：支持基本过程的过程，因此也被称为支持过程，比如财务管理、人力管理等。<br />三级过程：指导与协调基本和二级过程的管理过程。<br /><br />9.工作流的启动（触发）有3类：<br />（1）资源驱动（人工，自动，半自动）<br />（2）外部事件，一个JMS消息？<br />（3）时间信号（定时事件）<br /><br />二.组织结构<br />1.组织结构确立了如何把组织所需要完成的工作分配给员工，最重要的三种组织形式：<br />（1）层次结构，常见的、通过树结构来描述的组织图<br />（2）矩阵结构，在以项目为中心的公司中较为常见，比如软件公司，一个员工同时属于电信事业部和XXX现场项目组<br />（3）网状结构<br />2.有关工作流权限系统的设计，更多请见银狐999的文档《<a href="http://javafox.vip.myrice.com/mywf/fox999_workflow_org_2004.pdf">工作流系统组织模型应用和解决方案</a>》<br /><br />三.过程管理<br />1.区分管理系统与被管理系统，管理系统将目标、前提和决策传达给被管理系统，被管理系统可以向管理系统回报，根据汇报，管理系统可以修正这些目标。<br />2.过程管理分为四个层次：<br />（1）Real-time，实时管理<br />（2）Operational 操作管理<br />（3）战术管理<br />（4）战略管理<br />从上往下影响的范围越广，持续时间越长。<br />3.业务过程信息系统的发展，历史表明，越来越多的通用任务已被从程序中分离出来并且放入分解的管理系统中：<br />（1）1965-1975年：分解应用。信息系统由分解的应用组成，每个应用都有自己的数据库和定义。<br />（2）1975-1985年：数据库管理——将数据管理从应用程序中抽离出来，不同的程序共享一个数据库，面向数据的开发方法产生<br />（3）1985-1995年：用户界面管理——将用户界面从应用程序中抽取出来。<br />（4）1995-2005：工作流管理——将业务过程从应用程序中抽取出来。工作流系统负责管理工作流并组织案例数据在不同的人员以及应用程序间进行流转。<br /><br /><br /><img src ="http://www.blogjava.net/killme2008/aggbug/98849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-08 19:13 <a href="http://www.blogjava.net/killme2008/archive/2007/02/08/98849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>