莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Insect Workflow

          Posted on 2008-05-21 15:09 dennis 閱讀(2150) 評論(0)  編輯  收藏 所屬分類: java工作流my open-source
              今天整理代碼,發(fā)現(xiàn)一個去年寫的簡單的工作流引擎,基于petri網(wǎng)(參考這里的筆記),實現(xiàn)了順序、并行、循環(huán)和選擇四種路由,資源也實現(xiàn)了人工驅(qū)動和定時、延遲時間驅(qū)動;目前只實現(xiàn)了將工作流數(shù)據(jù)保存在內(nèi)存的版本,然后就換工作,折騰著就忘了這個事兒,本來是計劃加入數(shù)據(jù)庫存儲的。盡管只是個toy,可能對工作流感興趣,或者想自己實現(xiàn)一個玩玩的朋友有參考價值,放到了google code上,svn地址:
           http://insectworkflow.googlecode.com/svn/trunk/

              源碼中有在example包下給了個請假的例子,流程定義文件就是processes包下的leave.xml,實現(xiàn)大概是這么個流程:
          填寫假單-》提交假單-and-split節(jié)點-》項目經(jīng)理審批-》and-join節(jié)點-》結(jié)束
                                                               -》部門經(jī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>

              其中的place就是各個Transition的輸入或者輸出庫所,所謂node其實就是變遷(transition),每個變遷對應一個handler,執(zhí)行具體的業(yè)務操作,比如這里的com.google.code.insect.workflow.example.leave.SendRemindHandler 用于發(fā)送提醒消息給經(jīng)理們。

              具體調(diào)用和工作項的人工觸發(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ā),有興趣的可以看一下。

          主站蜘蛛池模板: 布拖县| 保定市| 沙河市| 孟州市| 界首市| 冕宁县| 铁岭市| 南丰县| 方城县| 平江县| 济源市| 宁德市| 友谊县| 平遥县| 明星| 丘北县| 三门峡市| 睢宁县| 呼图壁县| 南丰县| 满洲里市| 油尖旺区| 苍梧县| 任丘市| 东安县| 长宁区| 内江市| 阿合奇县| 孟州市| 福海县| 宣武区| 新余市| 蕲春县| 大英县| 华宁县| 五台县| 朝阳区| 基隆市| 同德县| 大关县| 江门市|