閱讀227 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Insect Workflow

今天整理代碼,發現一個去年寫的簡單的工作流引擎,基於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

最後更新:2017-05-17 18:01:48

  上一篇:go  Logic Programming With Prolog學習筆記(一)
  下一篇:go  sicp3.5.2、3.5.3節部分習題嚐試解答