Posted on 2008-05-21 15:09
dennis 閱讀(2145)
評論(0) 編輯 收藏 所屬分類:
java 、
工作流 、
my open-source
今天整理代碼,發(fā)現(xiàn)一個去年寫的簡單的工作流引擎,基于petri網(參考這里的
筆記),實現(xiàn)了順序、并行、循環(huán)和選擇四種路由,資源也實現(xiàn)了人工驅動和定時、延遲時間驅動;目前只實現(xiàn)了將工作流數(shù)據(jù)保存在內存的版本,然后就換工作,折騰著就忘了這個事兒,本來是計劃加入數(shù)據(jù)庫存儲的。盡管只是個toy,可能對工作流感興趣,或者想自己實現(xiàn)一個玩玩的朋友有參考價值,放到了google code上,svn地址:
http://insectworkflow.googlecode.com/svn/trunk/
源碼中有在example包下給了個請假的例子,流程定義文件就是processes包下的leave.xml,實現(xiàn)大概是這么個流程:
填寫假單-》提交假單-and-split節(jié)點-》項目經理審批-》and-join節(jié)點-》結束
-》部門經理審批-》
其中項目經理審批和部門經理審批是并行路由。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,執(zhí)行具體的業(yè)務操作,比如這里的com.google.code.insect.workflow.example.leave.SendRemindHandler 用于發(fā)送提醒消息給經理們。
具體調用和工作項的人工觸發(fā):
//初始化工作流管理器
WorkFlowManager wm = new BasicWorkflowManager();
wm.setConfiguration(new DefaultConfiguration());
//啟動一個案例
Token token = wm.startWorkFlow("leave");
token.setAttribute("LeaveInfo", leaveInfo);
//提交假單
wm.doAction(token.getId(), this.dennis, "給領導發(fā)送消息:"
+ leaveInfo.getStaff_name() + "申請請假,請批準!");
//將token的id傳遞給后續(xù)節(jié)點做處理。。token的id就是案例id
processes包下面的流程定義文件和test包下的TestUnit,分別測試了四種路由和定時、延時觸發(fā),有興趣的可以看一下。