JBPM知識點------timer、Scheduler

 

JBPM知識點------timer、Scheduler

分類: JBPM 314人閱讀 評論 (1) 收藏 舉報

       定時器timer可以被用於decision fork join node process-state state super-state task-node,可以設置開始時間duedate和頻率repeat,定時器動作可以是所支持的任何動作元素,如action或script,會運行 我們設置的商務動作。定時器通過動作創建和取消,有兩個動作元素create-timer和cancel-timer。事實上,默認的定時器元素只是 create-timer動作依附於node-enter事件、cancel-timer動作依附於node-leave事件的一個簡略表示。

timer 還有一個很重要的屬性cancel-event,這個是timer和task結合時使用的,任務定時器的cancel-event可以被定製。默認情況 下,當任務被結束時(=完成)任務上的定時器將被取消,這是通過在定時器上使用cancel-event屬性,流程開發者可以定製諸如task- assign或task-start。cancel-event支持多個事件,通過在屬性中指定一個用逗號分割的列表,可以組合cancel-event 的類型。 這個屬性沒搞過呢。

調度這一塊其實分成2部分,一個就是定時器,還有一個是調度服務。從jbpm 的javadoc可以看到調度服務涉及了幾個類, 由於時間原因我還沒有深入的研究過。


下面舉一個簡單的例子,運行一個定時器reminder,這個定時器立刻就運行duedate='0 seconds',頻率是3seconds,執行的動作是輸出timer running。這個定時器會在12秒後被定時器reminderend終結。
(有一個問題,終結是終結了但是SchedulerThread還在那等着,要回頭再看看java的線程了。)
(還有一個問題,transition的用途還不是很明白?我以爲運行12秒後流程就會跳轉到end了。)

<? xml version="1.0" encoding="UTF-8" ?>
< process-definition  xmlns =""  name ="yytest" >
    
< start-state >
        
< transition  to ="a" />
    
</ start-state >
    
< state  name ='a'>
     
<timer name ='reminder' 
             
duedate ='0  seconds' 
             repeat
='3  seconds' >
        
< script > System.out.println("timer running"); </ script >
     
</ timer >
     
< timer  name ='reminderend' 
             
duedate ='12  seconds'
             transition
='end'
             
>
        
< cancel-timer  name ='reminder'/>
     
</timer >
    
</ state >
   
< end-state  name ="end" ></ end-state >
</ process-definition >


 

private   static   void  run() {
        Jbpm Context jbpm Context 
=  jbpm Configuration.createJbpm Context();
        
try   {
            
long  processInstanceId  = 1 ;
               processInstance 
=  jbpm Context.loadProcessInstance(processInstanceId);
               Token token 
=  processInstance.getRootToken();
               
// schedulerSession = jbpm Context.getSchedulerSession();
               System.out.println(token.getNode());
               token.signal();
               System.out.println(token.getNode());
               
// Timer timer = (Timer) schedulerSession.findTimersByDueDate().next();
               
// timer.execute();
               SchedulerThread st = new  SchedulerThread(jbpm Configuration);
               
// st.executeTimers();
               st.run();
               
// token.signal();
               
// System.out.println(token.getNode());
               
// jbpm Context.save(processInstance);
            }
finally   {
              jbpm Context.close();
            }

    }

運行結果如下:

StartState(159e154)
State(a)
timer running
timer running
timer running
timer running
(12秒後停止但是線程還在run)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章