莊周夢(mèng)蝶

          生活、程序、未來(lái)
             :: 首頁(yè) ::  ::  :: 聚合  :: 管理

          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配置大概這樣:
          <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就是各個(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ā),有興趣的可以看一下。

          主站蜘蛛池模板: 天长市| 顺昌县| 禄劝| 周宁县| 海丰县| 崇阳县| 五华县| 涿州市| 安西县| 深水埗区| 峨眉山市| 晋江市| 恩施市| 即墨市| 资兴市| 曲靖市| 仁布县| 吉木萨尔县| 石狮市| 屯留县| 盘山县| 神木县| 阿拉尔市| 湘阴县| 三明市| 阿拉善左旗| 彭阳县| 临沧市| 岳池县| 定陶县| 视频| 神农架林区| 景宁| 明光市| 民乐县| 布尔津县| 正蓝旗| 咸宁市| 荔浦县| 兴和县| 井陉县|