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