??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品综合二区,九色精品美女在线,日本视频一区二区不卡http://www.aygfsteel.com/RongHao/category/4728.html勤学、勤?/description>zh-cnFri, 22 Jun 2007 10:42:35 GMTFri, 22 Jun 2007 10:42:35 GMT60JBPM旉服务的实?/title><link>http://www.aygfsteel.com/RongHao/archive/2007/06/22/125886.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 22 Jun 2007 09:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2007/06/22/125886.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/125886.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2007/06/22/125886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/125886.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/125886.html</trackback:ping><description><![CDATA[  整体来说实现的非常清晎ͼ<br>  <span style="font-weight: bold;">1</span>、引擎解析流E定义xmlӞl相应的事g挂接上create-timer ?cancel-timer动作<br>  <span style="font-weight: bold;">2</span>、流E实例实际运转时Qcreate-timer动作在相应事件触发时执行<br>  <span style="font-weight: bold;">3</span>、create-timer在job表里插入相应旉job记录Q给该job记录附上计算完毕的执行时?br>  <span style="font-weight: bold;">4</span>、JobExecutorServlet在后台启动一到多个JobExecutorThreadU程<br>  <span style="font-weight: bold;">5</span>、JobExecutorThreadU程不停的每隔一D|间对job表扫描一ơ,扑և需要执行的job记录Q执行之<br>  <span style="font-weight: bold;">6</span>、只执行一ơ的job记录Q执行完毕后删除之;重复执行的job记录Q写入新的执行时_更新?br>  <span style="font-weight: bold;">7</span>、相应事件触发cancel-timer动作Q将对应job记录从job表里删除<br>  下面具体用代码来说话Q挂接到node节点Q:<br>  <span style="font-weight: bold;">1</span>、引擎解析流E定义xml  <br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  JpdlXmlReader.java <br>  </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> readNodeTimer(Element timerElement, Node node) {<br>    String name </span><span style="color: #000000;">=</span><span style="color: #000000;"> timerElement.attributeValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">, node.getName());<br>   <br>    CreateTimerAction createTimerAction </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CreateTimerAction();<br>    createTimerAction.read(timerElement, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br>    createTimerAction.setTimerName(name);<br>    createTimerAction.setTimerAction(readSingleAction(timerElement));<br>    addAction(node, Event.EVENTTYPE_NODE_ENTER, createTimerAction);<br>   <br>    CancelTimerAction cancelTimerAction </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CancelTimerAction();<br>    cancelTimerAction.setTimerName(name);<br>    addAction(node, Event.EVENTTYPE_NODE_LEAVE, cancelTimerAction);<br>  }</span></div> <br>  可以看到Q引擎把xml中timer节点解析成了两个ACTIONQCreateTimerAction和CancelTimerAction<br>  CreateTimerAction会在q入该节Ҏ(gu)触发Q而CancelTimerAction会在令牌d该节Ҏ(gu)触发?br>  <span style="font-weight: bold;">2</span>、看看CreateTimerAction和CancelTimerActionI竟在做些什?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  CreateTimerAction.java<br>   </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> execute(ExecutionContext executionContext) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br>    Timer timer </span><span style="color: #000000;">=</span><span style="color: #000000;"> createTimer(executionContext);<br>    SchedulerService schedulerService </span><span style="color: #000000;">=</span><span style="color: #000000;"> (SchedulerService) Services.getCurrentService(Services.SERVICENAME_SCHEDULER);<br>    schedulerService.createTimer(timer);<br>  }</span></div> <br>  很明显,是通过一个职责集中的schedulerService向job表中插入了一条job记录Q注意到q个Ҏ(gu)Q?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> Timer createTimer(ExecutionContext executionContext) {<br>    Timer timer </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Timer(executionContext.getToken());<br>    <img src="http://www.aygfsteel.com/Images/dot.gif">.<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (dueDate</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br>      Duration duration </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Duration(dueDate);<br>      Date dueDateDate </span><span style="color: #000000;">=</span><span style="color: #000000;"> businessCalendar.add( </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date(), duration );<br>      timer.setDueDate(dueDateDate);<br>    }<br>    <img src="http://www.aygfsteel.com/Images/dot.gif">.<br>   <br>    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> timer;<br>  }</span></div> <br>  q里利用JBPM提供的工作时间计组件计了job的执行时间?br>  CancelTimerAction很单了Q删除相应的job记录?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  CancelTimerAction.java<br>  </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> execute(ExecutionContext executionContext) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br>    SchedulerService schedulerService </span><span style="color: #000000;">=</span><span style="color: #000000;"> (SchedulerService) Services.getCurrentService(Services.SERVICENAME_SCHEDULER);<br>    schedulerService.deleteTimersByName(timerName, executionContext.getToken());<br>  }</span></div> <br>  <span style="font-weight: bold;">3</span>、JobExecutorServlet是干什么的<br>  启动U程<br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> init() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> ServletException {<br>    <img src="http://www.aygfsteel.com/Images/dot.gif">.<br>    jbpmConfiguration.startJobExecutor();<br>  }</span></div> <br>  <span style="font-weight: bold;">4</span>、线E是如何工作<br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {<br>    </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br>      currentIdleInterval </span><span style="color: #000000;">=</span><span style="color: #000000;"> idleInterval;<br>      </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (isActive) {<br>        </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br>          Collection acquiredJobs </span><span style="color: #000000;">=</span><span style="color: #000000;"> acquireJobs();   </span><span style="color: #008000;">//</span><span style="color: #008000;">从job表里获得要执行的job记录</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>          </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;"> acquiredJobs.isEmpty()) {    </span><span style="color: #008000;">//</span><span style="color: #008000;">如果记录不ؓI,则开始执?/span><span style="color: #008000;"><br></span><span style="color: #000000;">            Iterator iter </span><span style="color: #000000;">=</span><span style="color: #000000;"> acquiredJobs.iterator();<br>            </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (iter.hasNext() </span><span style="color: #000000;">&&</span><span style="color: #000000;"> isActive) {<br>              Job job </span><span style="color: #000000;">=</span><span style="color: #000000;"> (Job) iter.next();<br>              executeJob(job);             </span><span style="color: #008000;">//</span><span style="color: #008000;">执行</span><span style="color: #008000;"><br></span><span style="color: #000000;">            }<br><br>          } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> { </span><span style="color: #008000;">//</span><span style="color: #008000;"> no jobs acquired     </span><span style="color: #008000;">//</span><span style="color: #008000;">如果没有可执行的jobQ则{待一D|?/span><span style="color: #008000;"><br></span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (isActive) {<br>              </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> waitPeriod </span><span style="color: #000000;">=</span><span style="color: #000000;"> getWaitPeriod();  </span><span style="color: #008000;">//</span><span style="color: #008000;">{待的时间是扑և卛_执行的jobȝ在最q的旉间隔</span><span style="color: #008000;"><br></span><span style="color: #000000;">              </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (waitPeriod</span><span style="color: #000000;">></span><span style="color: #000000;">0</span><span style="color: #000000;">) {<br>                </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">(jobExecutor) {<br>                  jobExecutor.wait(waitPeriod);<br>                }<br>              }<br>            }<br>          }<br>         <br>         <img src="http://www.aygfsteel.com/Images/dot.gif">.<br>    } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Throwable t) {<br>      t.printStackTrace();<br>    } </span><span style="color: #0000ff;">finally</span><span style="color: #000000;"> {<br>      log.info(getName()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;"> leaves cyberspace</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    }<br>  }</span></div> <br>  看看实际执行的方?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> executeJob(Job job) {<br>    JbpmContext jbpmContext </span><span style="color: #000000;">=</span><span style="color: #000000;"> jbpmConfiguration.createJbpmContext();<br>    </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br>      JobSession jobSession </span><span style="color: #000000;">=</span><span style="color: #000000;"> jbpmContext.getJobSession();<br>      job </span><span style="color: #000000;">=</span><span style="color: #000000;"> jobSession.loadJob(job.getId());<br><br>      </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br>        log.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">executing job </span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">job);<br>        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (job.execute(jbpmContext)) {    </span><span style="color: #008000;">//</span><span style="color: #008000;">交由Job对象本nd成执行的逻辑Qƈ军_是否删除job记录</span><span style="color: #008000;"><br></span><span style="color: #000000;">          jobSession.deleteJob(job);<br>        }<br>            <img src="http://www.aygfsteel.com/Images/dot.gif">.<br>  }</span></div> <br>  <span style="font-weight: bold;">5</span>、着重关注Time对象<br>  在上面我们看到实际执行的代码是job.execute(jbpmContext);<br>  Time 是Job的子c,看看它的实现Q?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> execute(JbpmContext jbpmContext) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br>    </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> deleteThisJob </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;       </span><span style="color: #008000;">//</span><span style="color: #008000;">执行完毕后是否删除job记录</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>    ExecutionContext executionContext </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ExecutionContext(token);<br>    executionContext.setTimer(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br><br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (taskInstance</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br>      executionContext.setTaskInstance(taskInstance);<br>    }<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 触发timer事g</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (graphElement</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br>      graphElement.fireAndPropagateEvent(Event.EVENTTYPE_TIMER, executionContext);<br>    }<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果timer节点上挂有action则执行之</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (action</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br>      </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br>        log.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">executing timer '</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>        action.execute(executionContext);<br>      } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception actionException) {<br>      <img src="http://www.aygfsteel.com/Images/dot.gif">.<br>        }<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果定义了transition属性,则流E顺着定义的\径流?/span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ( (transitionName</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>         </span><span style="color: #000000;">&&</span><span style="color: #000000;"> (exception</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) </span><span style="color: #008000;">//</span><span style="color: #008000;"> and if no unhandled exception occurred during the action </span><span style="color: #008000;"><br></span><span style="color: #000000;">       ) {<br>      </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (token.getNode().hasLeavingTransition(transitionName)) {<br>        token.signal(transitionName);<br>      }<br>    }<br>   <br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果定义了repeat属性则job记录不容许删除,同时计算新的执行旉</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (repeat</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br>      deleteThisJob </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br><br>      </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (dueDate.getTime()</span><span style="color: #000000;"><=</span><span style="color: #000000;">System.currentTimeMillis()) {<br>        dueDate </span><span style="color: #000000;">=</span><span style="color: #000000;"> businessCalendar<br>              .add(dueDate,<br>                </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Duration(repeat));<br>      }<br>      log.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">updated timer for repetition '</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">' in '</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">(dueDate.getTime()</span><span style="color: #000000;">-</span><span style="color: #000000;">System.currentTimeMillis())</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">' millis</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    }<br>   <br>    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> deleteThisJob;<br>  }</span></div> <br><br><img src ="http://www.aygfsteel.com/RongHao/aggbug/125886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2007-06-22 17:13 <a href="http://www.aygfsteel.com/RongHao/archive/2007/06/22/125886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBPM的时间服?/title><link>http://www.aygfsteel.com/RongHao/archive/2007/06/21/125512.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 21 Jun 2007 04:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2007/06/21/125512.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/125512.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2007/06/21/125512.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/125512.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/125512.html</trackback:ping><description><![CDATA[JBPM旉服务的用主要体现在对timer节点的用。timer节点有两U用方式:一U是挂接到node节点下,在进入node节点时触发,在离开node节点时终止;另外一U是挂接到task节点下,在Q务创建时触发Q默认在d完成后终止。下面D例说明:<br>  <span style="font-weight: bold;">一、挂接到node节点 </span>  <br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;"><</span><span style="color: #800000;">state </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">='catch </span><span style="color: #ff0000;">crooks'</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>      </span><span style="color: #0000ff;"><</span><span style="color: #800000;">timer </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">='reminder'<br>         </span><span style="color: #ff0000;">duedate</span><span style="color: #0000ff;">='3 </span><span style="color: #ff0000;">business hours'<br>         repeat</span><span style="color: #0000ff;">='10 </span><span style="color: #ff0000;">business minutes'<br>         transition</span><span style="color: #0000ff;">='time-out-transition' </span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>        </span><span style="color: #0000ff;"><</span><span style="color: #800000;">action </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">='the-remainder-action-class-name' </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br>        </span><span style="color: #0000ff;"><</span><span style="color: #800000;">transition </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">='time-out-transition' </span><span style="color: #ff0000;">to</span><span style="color: #0000ff;">='next' </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br>      </span><span style="color: #0000ff;"></</span><span style="color: #800000;">timer</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;"></</span><span style="color: #800000;">state</span><span style="color: #0000ff;">></span></div> <br>  解释Qtimer会在流Eo牌进入节点catch crooks时触发,延迟3 business hours开始执行动作,?0 business minutes重复执行一ơ,直到令牌dcatch crooks节点?br>  对time节点来说 name、repeat、transition都是可选属性。对一个流E定义来_每一个time节点的name必须唯一Q如果你不定义name属性,引擎会默认把node节点的name赋给timer。在上面q个例子里,如果你不定义timer节点的nameQ则它的name׃是catch crooks。说说repeat属性,如果你不定义它,则timer׃只执行一ơ动作不会重复执行。transition属性,如果定义了这个属性,程令牌会在timer执行动作完毕后,着q个路径dnode节点。所以在上面q个例子里,管定义了repeat属性,actionq是会只执行一ơ?br>  action节点Q可选,即timer节点在时间到时执行的动作Q可以是LactioncdQ包括script。注意与旉有关的两UactioncdQcreate-timer ?cancel-timer。其实一个timer节点在被引擎解释时就是被分解为create-timer ?cancel-timer两个actionQcreate-timer挂接到node-enter事g中,cancel-timer挂接到node-leave事g中。action节点最多只可以挂一个?br>  说说整个q程Q?br>  1、o牌进入节点catch crooks<br>  2、timer被触发(实际q时是在执行create-timer动作Q?br>  3? business hours?timer 事g触发<br>  4、定义的action被执?br>  5、o牌顺着time-out-transition路径dcatch crooks节点<br>  6、cancel-timer动作被执行即timerl止Q没有给repeat的机会)<br>  <span style="font-weight: bold;">二、挂接到task节点</span><br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">  </span><span style="color: #0000ff;"><</span><span style="color: #800000;">task-node </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="Evaluate web order"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;"><</span><span style="color: #800000;">task </span><span style="color: #ff0000;">swimlane</span><span style="color: #0000ff;">="salesman"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>      </span><span style="color: #0000ff;"><</span><span style="color: #800000;">timer </span><span style="color: #ff0000;">duedate</span><span style="color: #0000ff;">="20 seconds"</span><span style="color: #ff0000;"> repeat</span><span style="color: #0000ff;">="10 seconds"</span><span style="color: #ff0000;"> cancel-event</span><span style="color: #0000ff;">='task-start'><br>        </span><span style="color: #ff0000;"><action class</span><span style="color: #0000ff;">="org.jbpm.websale.RemindActor"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>          </span><span style="color: #0000ff;"><</span><span style="color: #800000;">swimlaneName</span><span style="color: #0000ff;">></span><span style="color: #000000;">salesman</span><span style="color: #0000ff;"></</span><span style="color: #800000;">swimlaneName</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>        </span><span style="color: #0000ff;"></</span><span style="color: #800000;">action</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>      </span><span style="color: #0000ff;"></</span><span style="color: #800000;">timer</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;"></</span><span style="color: #800000;">task</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;"><</span><span style="color: #800000;">transition </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="OK"</span><span style="color: #ff0000;"> to</span><span style="color: #0000ff;">="salefork"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br>    </span><span style="color: #0000ff;"><</span><span style="color: #800000;">transition </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="More info needed"</span><span style="color: #ff0000;"> to</span><span style="color: #0000ff;">="Fix web order data"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br>  </span><span style="color: #0000ff;"></</span><span style="color: #800000;">task-node</span><span style="color: #0000ff;">></span></div> <br>  与挂接到node 的区别是Q这里可以定义一个属性cancel-eventQ可以指定那些事件可以终止timer的执行,默认是task-end。可以指定多个事Ӟ?,'分割QQ一事g触发timer即终止?br>  可以看到jbpm对Q务实例和节点执行时的旉服务q是支持的很好,可以做出很多的扩展,但是它没有对整个程实例本n提供更多的服务,比如说定时的程启动和整个流E的旉控制{等。以及对_旉点的支持q不够?br><img src ="http://www.aygfsteel.com/RongHao/aggbug/125512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2007-06-21 12:00 <a href="http://www.aygfsteel.com/RongHao/archive/2007/06/21/125512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发现jbpm BusinessCalendar的一个疏?/title><link>http://www.aygfsteel.com/RongHao/archive/2007/06/15/124549.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 15 Jun 2007 09:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2007/06/15/124549.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/124549.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2007/06/15/124549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/124549.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/124549.html</trackback:ping><description><![CDATA[jbpm BusinessCalendar是一个很好用的计工作日讑֮的时间服务组Ӟ中不的是它的工作日设定是写死在配|文件中Q不能灵zȝq户修攏V另外hongsoft在他的博客中提到jbpm BusinessCalendar可能存在的一个bugQ?br><a >http://blog.csdn.net/hongbo781202/archive/2006/02/28/612541.aspx</a><br>q个bug在我的测试中没有重现Q我的jbpm版本?.2Q可以认为jbpm已经修复q个bug。另外在<br>jbpm BusinessCalendar的配|文件中有这么一?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">weekday.thuesday=  9:00-12:00 & 12:30-17:00</span></div> <br>可以理解为是一个疏忽,应该是tuesdayQ礼拜二Q呵c?br><img src ="http://www.aygfsteel.com/RongHao/aggbug/124549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2007-06-15 17:58 <a href="http://www.aygfsteel.com/RongHao/archive/2007/06/15/124549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作时间管理需?/title><link>http://www.aygfsteel.com/RongHao/archive/2007/06/14/124259.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 14 Jun 2007 03:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2007/06/14/124259.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/124259.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2007/06/14/124259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/124259.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/124259.html</trackback:ping><description><![CDATA[<span style="font-weight: bold; font-size: 18pt;">工作时间管理按功能分类</span>Q?br>  <span style="font-weight: bold;">1.</span> 旉事g启动工作流E实例(指定旉炏V时间间隔、周期时_<br>  <span style="font-weight: bold;">2.</span> d挂v恢复Q指定时间点、时间间隔)<br>  <span style="font-weight: bold;">3.</span> d预警、报警、超旉知<br>  <span style="font-weight: bold;">4.</span> 工作流E实例超旉知<br>  <span style="font-weight: bold;">5.</span> 非工作日、节假日讑֮<br><span style="font-weight: bold;">  6.</span> 程、Q务的处理旉l计<br style="font-weight: bold;"><span style="font-weight: bold; font-size: 18pt;">具体说明</span>Q?br>  <span style="font-weight: bold;">1?/span>工作流E实例在讄的时间自动启动,讄旉包括下面两种方式Q?br>     a、指定一个固定的旉点,然后讄周期旉Q例如每天、每周的周一、每月的W一天;<br>     b、指定一个固定的旉点,然后讄旉间隔Q例?0分钟后,2时后,一天后Q一个月后?br>  <span style="font-weight: bold;">2?/span>d在上一个Q务节点完成后多长旉启动。ƈ发Q务之间的旉启动关系。Q务在指定旉点启动?br>     举例Q胦务每周五下午2点开始集中处理报销事务Q所有流E实例流转到财务报销节点处于{待状态,直到周五下午2点Q务才启动Q胦务才在Q务列表里看到待处理的报销事务q中处理?br>  <span style="font-weight: bold;">3?/span>举例说明Q经理审批这个Q务节点设|完成时?时<br>     <span style="font-weight: bold;">预警</span>Q时间过去预定完成时间一定百分比比如50%q未完成Q则在Q务发出半时后系l发出预警信息,按一定时间间隔@环发出。直CQ务报警或d时或Q务完成?br>     <span style="font-weight: bold;">报警</span>Q时间过去预定完成时间一定百分比比如90%q未完成Q则在Q务发?4分钟后系l发出报警信息,预警自动l止。报警信息只发送一ơ?br>     <span style="font-weight: bold;">时通知</span>QQ务在规定旉内未完成Q系l发旉知。同时Q务超时存在业务或程处理QQ?br>时应当可以挂上javabean处理一定业务逻辑Q同时流E可以选择l箋{待或是跌{?br>  <span style="font-weight: bold;">4?/span>和Q务超时类|pȝ发送超旉知Q同时应该存在业务和程的处理。比如说程自动l止?br>  <span style="font-weight: bold;">5?/span>主要提供旉计算时对非工作日、非工作旉和节假日的考虑。这里的旉计算仅仅针对于输入一个时间计一定时间间隔后输出一个时_比如说现在是周五2点,输入Q两天时间间隔,输入Q周?点,输出。考虑非工作日Q则输出应该Z周二2炏V用途主要体现在对Q务和程的时间完成期限限定计上?br>  <span style="font-weight: bold;">6?/span>l计Q报表?br>大家提提自己的意见?br><br><img src ="http://www.aygfsteel.com/RongHao/aggbug/124259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2007-06-14 11:42 <a href="http://www.aygfsteel.com/RongHao/archive/2007/06/14/124259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我对BPM的认?/title><link>http://www.aygfsteel.com/RongHao/archive/2007/03/26/106395.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 26 Mar 2007 06:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2007/03/26/106395.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/106395.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2007/03/26/106395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/106395.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/106395.html</trackback:ping><description><![CDATA[昨天参加了BEA UG的活动。其中第二场是BEA|振东先生的BPM讲解。因为公怸直就是做工作的Q所以对BPMq个概念一直是非常的关注,但是一直也是搞不太清楚Workflow与BPM的关p,L以ؓBPM是对WorkFlow的一层包装而已Q是新瓶装老酒。在听罗振东先生演讲的过E中Q我开始有了一些自q认识?br />一句话_<b>BPM是徏立在EAI基础上的工作?/b><br />和工作流不同QBPMx的是一个很完整概念上的业务程Q这个业务流E可能需要横跨多个ITpȝQ这些系l通过某种方式暴露出流E中所需要的服务Qwebservice是一U选择Q,BPM推动q个程的流转。同Ӟ相对于以往的工作流单纯的流E流转,BPM提供了更多,包括程仿真Q过E分析、过E优化等{。意思就是,在某个流E运行一D|间以后,BPM会基于数据提供对该流E的分析Q数据挖掘?Q,从而能够基于这些分析提供对上层理决策的支持。有点像q筹学?br />那么Q一个工作流厂商是否可以很容易的研发出BPM的品?{案是不行。看看哪些BPM的厂商,无一不是在EAI斚w有很多经验的大公司。所以,BPM实施的关键还是要建立在EAI实施的基上。至于BPM和SOAQ如果以前的pȝ是基于SOA架构的,那自然EAIh是会更加Ҏ(gu)QBPM理所当然是拥抱SOA的。(BEA的品没用adapterQ?br />那么当前工作的发展方向呢?个h认ؓ可以从BPM的功能里扑ֈ一些线索,那就是流E仿真,q程分析、过E优化。比如一个请假申hE,l计一下,在哪个节点的办理效率最低,哪些节点在实际中不是必须{等Q当然这些都是工作流本nZ程的数据进行的独立的分析,有点决策的意思在里面?br />呵呵Q个人的一些浅见。希望多批评?img src ="http://www.aygfsteel.com/RongHao/aggbug/106395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2007-03-26 14:27 <a href="http://www.aygfsteel.com/RongHao/archive/2007/03/26/106395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jbpm的用戯色管?http://www.aygfsteel.com/RongHao/archive/2005/11/16/20121.htmlronghaoronghaoWed, 16 Nov 2005 10:00:00 GMThttp://www.aygfsteel.com/RongHao/archive/2005/11/16/20121.htmlhttp://www.aygfsteel.com/RongHao/comments/20121.htmlhttp://www.aygfsteel.com/RongHao/archive/2005/11/16/20121.html#Feedback0http://www.aygfsteel.com/RongHao/comments/commentRss/20121.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/20121.htmlEntitycL其他三个cȝ父类Q它包含了两个属性:name(String)?permissions(Set)
Usercȝ承Entityc,包含三个属性:password(String)?email(String)?memberships(Set)
Groupcȝ承Entityc,包含四个属? type(String) 、parent(Group)?children(Set)?memberships(Set)
Membershipcȝ承Entityc,包含三个属?role(String)?user(User)?group(Group)
很明显,一个user对应一个用P一个group对应一个用LQ它们之间通过membership兌Qƈ且一个user可以属于多个不同cdQtype)的groupQuser?group之间是多对多的关pR?BR>Membershipcȝrole属性个人感觉用途不大,反倒是name属性代表了user在group里的roleQ角ԌQ?img src ="http://www.aygfsteel.com/RongHao/aggbug/20121.html" width = "1" height = "1" />

ronghao 2005-11-16 18:00 发表评论
]]>
jbpm里的Nodehttp://www.aygfsteel.com/RongHao/archive/2005/11/15/19935.htmlronghaoronghaoTue, 15 Nov 2005 10:14:00 GMThttp://www.aygfsteel.com/RongHao/archive/2005/11/15/19935.htmlhttp://www.aygfsteel.com/RongHao/comments/19935.htmlhttp://www.aygfsteel.com/RongHao/archive/2005/11/15/19935.html#Feedback0http://www.aygfsteel.com/RongHao/comments/commentRss/19935.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/19935.htmlnode的作?BR>node有两个主要的作用Q?BR>1Q?STRONG>执行java代码Q比如说创徏task instanceQQ务实例)、发出通知、更新数据库{等。很典型的就是在node 上挂上我们的action
2) 控制程的执?/STRONG>Q?BR>  A、等待状?BR>     程q入到这个node时将处于{待状态,直到一个signal 的发?BR>  B、流E将沿着一个leaving transition过q个node
     q种情况Ҏ(gu)一点,需要有个action挂在q个node上(注意q个action不是event触发的!Q,action中将会调用到API?BR>     executionContext.leaveNode(String transitionName)QtransitionName卌里的leaving transition名字?BR>  C、创建新的执行\?BR>     很典型的是fork node。流E在q里会分叉,产生新的执行路径。这样就创徏了新的tokenQ每个新的token代表一个新的执行\径。注意的是,q些新的token和生前的token是父子关p!
  D、结束执行\?BR>     一个node可以l束一条执行\径,q同h味着相应的token的结束和程的结束?img src ="http://www.aygfsteel.com/RongHao/aggbug/19935.html" width = "1" height = "1" />

ronghao 2005-11-15 18:14 发表评论
]]>
程图中的node type http://www.aygfsteel.com/RongHao/archive/2005/11/14/19735.htmlronghaoronghaoMon, 14 Nov 2005 08:59:00 GMThttp://www.aygfsteel.com/RongHao/archive/2005/11/14/19735.htmlhttp://www.aygfsteel.com/RongHao/comments/19735.htmlhttp://www.aygfsteel.com/RongHao/archive/2005/11/14/19735.html#Feedback0http://www.aygfsteel.com/RongHao/comments/commentRss/19735.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/19735.html1、task-node
  一个task-node可以包含一个或多个taskQ这些task分配l特定的user。当程执行到task-nodeӞtask instance会被创建,一个task对应一个task instance。task instances 创徏后,task-node处于等待状态。当所有的task instances被特定的user执行完毕后,会发出一个新的signal 到tokenQ即程l箋执行?BR>2、state
  state是一个纯_的wait state({待状态)。它和task-node的区别就是它不会创徏task instances。很典型的用法是Q当q入q个节点Ӟ通过l定一个action到node-enter eventQ,发送一条消息到外部的系l,然后程处于等待状态。外部系l完成一些操作后q回一条消息,q个消息触发一个signal 到tokenQ然后流El执行。(不常用)
3、decision
  当需要在程中根据不同条件来判断执行不同路径Ӟ可以用decision节点。两U方法:最单的是在transitions里增加condition elementsQ条ӞQcondition是beanshell script写的Q它q回一个boolean。当q行的时候,decision节点会在它?leaving transitions里@环,同时比较 leaving transitions里的conditionQ最先返?true'的conditionQ那个leaving transitions会被执行;作ؓ选择Q你可以实现DecisionHandler接口Q它有一个decide()Ҏ(gu)Q该Ҏ(gu)q回一个String(leaving transition的名字)?BR>4、fork
  fork节点把一条执行\径分L多条同时q行Qƈ发)的执行\径,每条dfork节点的\径生一个子token?BR>5、join
  默认情况下,join节点会认为所有到达该节点的token都有着相同的父token。join 节点会结束每一个到达该节点的token,当所有的子token都到达该节点后,父token会激zR当仍然有子token处于zd状态时Qjoin 节点是wait state({待状态)?BR>6、node
  node节点是让你挂自qaction用的Q注意:不是event触发Q!Q,当流E到达该节点Ӟaction会被执行。你的action要实现ActionHandler接口。同P在你的action里要控制程Q?img src ="http://www.aygfsteel.com/RongHao/aggbug/19735.html" width = "1" height = "1" />

ronghao 2005-11-14 16:59 发表评论
]]>
jbpm的流E模?/title><link>http://www.aygfsteel.com/RongHao/archive/2005/11/12/19445.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sat, 12 Nov 2005 01:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2005/11/12/19445.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/19445.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2005/11/12/19445.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/19445.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/19445.html</trackback:ping><description><![CDATA[<STRONG>1、process definition<BR></STRONG>   一个process definition代表了一个正式的业务程Q它以一个流E图为基。这个流E图?nbsp; 许多node和transitionl成。每个node在这个流E图里都有着各自Ҏ(gu)的类型,q些不同的类型决定了node在运行时的不同行为。一个process definition只有一个start state ?BR><STRONG>2、token</STRONG><BR>   一个token代表了一条执行\径,它包含了q条执行路径的当前的执行状态(current stateQ?<BR><STRONG>3、process instance<BR></STRONG>   一个process instanceQ流E实例)即一个process definitionQ流E定义)的流E执行实例。一个process definition可以对应多个process instance。当一个process instance被创建的时候,一个主执行路径token同时被创建,q个token叫做root tokenQ它指向程定义的start stateQprocessDefinition.getStartState()==token.getNode()Q?BR><STRONG>4、signal <BR></STRONG>   一个signal 发送给token通知token l箋程的执行。如果signal 没有指定transitionQtoken沿~省的transitiond当前状?如果signal 指定transitionQtoken沿指定的transitiond当前的状态。看源代码可以看到发lprocess instance的signal 其实都是发送给了root token?<BR><STRONG>5、Actions</STRONG> <BR>   jbpm提供了灵zȝaction Q当程执行Qtoken q入node和transitionӞ会触发相应的一些eventQ事Ӟ。在q些event上附上我们自己写的actionQ就会带动action 的执行。action里是我们自己的相关java操作代码Q非常方ѝ注意的是eventQ事Ӟ是内|的Q无法扩展。另外,action也可以直接挂在node上,而不依赖于eventQ事Ӟ的触发,q个很重要!<img src ="http://www.aygfsteel.com/RongHao/aggbug/19445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2005-11-12 09:46 <a href="http://www.aygfsteel.com/RongHao/archive/2005/11/12/19445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jbpmd分配理http://www.aygfsteel.com/RongHao/archive/2005/11/11/19333.htmlronghaoronghaoFri, 11 Nov 2005 08:39:00 GMThttp://www.aygfsteel.com/RongHao/archive/2005/11/11/19333.htmlhttp://www.aygfsteel.com/RongHao/comments/19333.htmlhttp://www.aygfsteel.com/RongHao/archive/2005/11/11/19333.html#Feedback3http://www.aygfsteel.com/RongHao/comments/commentRss/19333.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/19333.html一个Task instanceQQ务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的Q务清单时Q你可以通过一个与用户兌的actorId来查询这张表?/P>

一个流E定义有一个TaskMgmtDefinitionQ一个TaskMgmtDefinition对应多个swimlane,同时对应多个task;一个swimlane有多个task,可以  TaskMgmtDefinition中通过task的名U直接获取相应的task;

swimlane对象有四个属性,分别是nameQ名字)、assignmentDelegationQ分配代理类Q、taskMgmtDefinition、tasksQSet 对应多个task),可以增加task

task对象主要的属性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNodeQ需要注意的是swimlane和assignmentDelegation中间只是可以一个属性有|因ؓ它们都和d的分配有关系?/P>

一个流E实例有一个TaskMgmtInstanceQ一个TaskMgmtInstance对应多个swimlaneInstance,同时对应多个taskInstance;一个swimlaneInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance;

swimlaneInstance对象主要有五个属性,分别是name、actorId、pooledActorsQSetQ、swimlane、taskMgmtInstance?BR>taskInstance对象的主要属性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors?/P>

当对dq行分配Ӟ一般需要实现AssignmentHandlerq个接口Q这个接口的Ҏ(gu)只有一个:
  void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一个典型的实现Q把名字?change nappy'的Q务交lNappyAssignmentHandlerq个cL分配Q?BR>   <task name='change nappy'>
      <assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />
   </task>
NappyAssignmentHandlerc:
  public void assign(Assignable assignable, ExecutionContext executionContext) {
    assignable.setActorId("papa");
  }
同样QAssignable只是一个接口,它有两个Ҏ(gu)QsetActorId()和setPooledActors()QAssignable的具体实现类也是两个
  swimlaneInstancehe和taskInstance。这样就不不隄解整个Q务分配流E了Q?BR>  1、流E进入TaskNode节点Q执行TaskNodecȝexecute()Ҏ(gu)Q该Ҏ(gu)首先获得TaskMgmtInstance实例Q然后通过它来创徏TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
  2、在上面的createTaskInstance(task, executionContext)里,该方法调用了taskInstance.assign(executionContext)对taskInstanceq行分配?BR>  3、在assign(executionContext)Ҏ(gu)里,首先会判断task属性里是否存在swimlaneQ如果有的话Q这个taskInstance׃分配lswimlane指定的ActorId?PooledActorsQ如果不存在Q再Ltask属性里 assignmentDelegationQ分配代理类Q通过代理c(x们自己写的实现AssignmentHandlerq个接口的类Q指定ActorId?PooledActors?



ronghao 2005-11-11 16:39 发表评论
]]>
վ֩ģ壺 | Ӱ| ƺ| | пǰ| Դ| | | ϼ| | ӱʡ| | | Զ| ײ| | | ÷| ʯ| | | ֶ| IJ| | ³| | Ͽ| ͷ| ¡| ϳ| | | | ư| | пǰ| | ̨| | ˻| ɽ|