﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java架构-随笔分类-flow学习</title><link>http://www.blogjava.net/fengyi/category/5605.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:21:04 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:21:04 GMT</pubDate><ttl>60</ttl><item><title>[转]一个JBPM工作流管理示例（四）</title><link>http://www.blogjava.net/fengyi/archive/2005/12/16/24249.html</link><dc:creator>虾米老</dc:creator><author>虾米老</author><pubDate>Fri, 16 Dec 2005 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/fengyi/archive/2005/12/16/24249.html</guid><wfw:comment>http://www.blogjava.net/fengyi/comments/24249.html</wfw:comment><comments>http://www.blogjava.net/fengyi/archive/2005/12/16/24249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengyi/comments/commentRss/24249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengyi/services/trackbacks/24249.html</trackback:ping><description><![CDATA[（一）&nbsp; 开始一个请假流程<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //user是请假人的actorId<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExecutionService es=JbpmServiceFactory.getInstance().openExecutionService(user);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap vs=new HashMap();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一些参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vs.put(Constants.REQUEST_STATUS,String.valueOf(0));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vs.put(Constants.REQUEST_RETURN_INFO,"No info!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vs.put(Constants.USER_NAME,EncodeTransfer.toISO(user));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vs.put(Constants.REQUEST_DAYS,String.valueOf(rea.getDays()));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开启请假流程<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es.startProcessInstance(Constants.WORK_NAME, vs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("["+user+"]"+"申请假期开始！请假"+rea.getDays()+"天！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return am.findForward("main");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ExecutionException ex) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("请假进程无法开始！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return am.findForward("error");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }finally{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>（二）当前执行任务<BR>&nbsp;&nbsp;&nbsp; 对于部门经理或者老板，找到要处理的请假。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String actorId = (String) req.getSession().getAttribute(Constants.USER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(actorId.equals("wang")){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actorId="boss";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(actorId.equals("bigli")){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actorId="chief";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get the execution service<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExecutionService executionService = JbpmServiceFactory.getInstance().<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openExecutionService(actorId);
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get the tasklist from jbpm for user<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List tasks = new ArrayList();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // add the jbpm tasks<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tasks.addAll(executionService.getTaskList(actorId));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // put the tasklist into the form<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mf.setTasks(tasks);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get the tasklist from jbpm for user<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List definitions = new ArrayList();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // add the jbpm definitions<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; definitions.addAll(executionService.getLatestDefinitions());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // put the tasklist into the form<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mf.setRequests(definitions);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // close the execution service<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executionService.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.getSession().setAttribute("mainForm",mf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("任务: " + tasks);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("当前可以执行的请求: " + definitions);<BR>（三）处理请假<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String actorId = (String) reqrest.getSession().getAttribute(Constants.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long tokenId=new Long(req.getParameter("tokenId"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get the execution service<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExecutionService executionService = JbpmServiceFactory.getInstance().<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openExecutionService(actorId);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map hm=executionService.getVariables(tokenId);//变量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String act=req.getParameter("action");//进行转换的transition<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executionService.endOfState(tokenId,hm,act);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executionService.close();</P><img src ="http://www.blogjava.net/fengyi/aggbug/24249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengyi/" target="_blank">虾米老</a> 2005-12-16 16:58 <a href="http://www.blogjava.net/fengyi/archive/2005/12/16/24249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]一个JBPM工作流管理示例（三） </title><link>http://www.blogjava.net/fengyi/archive/2005/12/16/24246.html</link><dc:creator>虾米老</dc:creator><author>虾米老</author><pubDate>Fri, 16 Dec 2005 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/fengyi/archive/2005/12/16/24246.html</guid><wfw:comment>http://www.blogjava.net/fengyi/comments/24246.html</wfw:comment><comments>http://www.blogjava.net/fengyi/archive/2005/12/16/24246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengyi/comments/commentRss/24246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengyi/services/trackbacks/24246.html</trackback:ping><description><![CDATA[<P><BR>（二）Decision<BR>package kellerdu.jbpm.delegation;</P>
<P>import org.jbpm.delegation.*;<BR>import kellerdu.jbpm.LogsFactory;<BR>import org.apache.commons.logging.Log;<BR>import kellerdu.jbpm.Constants;</P>
<P>public class ChiefDecision implements DecisionHandler {<BR>&nbsp;&nbsp;&nbsp; public ChiefDecision() {<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 判断是否需要主管批准，决定下一个要进行的transition<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param executionContext ExecutionContext<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @todo Implement this org.jbpm.delegation.DecisionHandler method<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public String decide(ExecutionContext executionContext) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log log=LogsFactory.getLogInstance(this.getClass());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ac=(String)executionContext.getVariable(Constants.USER_NAME);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ac!=null&amp;&amp;(ac.equals("dali")||ac.equals("wang"))){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info(ac+"需要老板批准！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "BossApprove";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info(ac+"需要先经主管批准");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "ChiefApprove";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<BR>（三）fork<BR>package kellerdu.jbpm.delegation;</P>
<P>import org.jbpm.*;<BR>import org.jbpm.delegation.*;<BR>import org.jbpm.model.execution.*;<BR>import java.util.*;</P>
<P>public class DecidedJoin implements JoinHandler {<BR>&nbsp;&nbsp;&nbsp; public DecidedJoin() {<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * fork，只要一个分支到达，即可进行下一步操作，同时取消其它同时进行的分支。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 这里就是用户如果取消，请假就取消。如果用户请假批准，则用户不能取消。<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param forkContext ForkContext<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @throws ExecutionException<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @todo Implement this org.jbpm.delegation.ForkHandler method<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public void join(JoinContext joinContext) throws ExecutionException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=joinContext.getConcurrentTokens().values().iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token arrivingToken = joinContext.getToken();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token to=(Token)it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(to.getId().equals(arrivingToken.getId())){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取消其它执行的Token<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; joinContext.getExecutionService().cancelToken(to.getId());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // reactivate the parent token.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; joinContext.reactivateToken( arrivingToken.getParent() );<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR></P><img src ="http://www.blogjava.net/fengyi/aggbug/24246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengyi/" target="_blank">虾米老</a> 2005-12-16 16:55 <a href="http://www.blogjava.net/fengyi/archive/2005/12/16/24246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]一个JBPM工作流管理示例（二）</title><link>http://www.blogjava.net/fengyi/archive/2005/12/16/24244.html</link><dc:creator>虾米老</dc:creator><author>虾米老</author><pubDate>Fri, 16 Dec 2005 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/fengyi/archive/2005/12/16/24244.html</guid><wfw:comment>http://www.blogjava.net/fengyi/comments/24244.html</wfw:comment><comments>http://www.blogjava.net/fengyi/archive/2005/12/16/24244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengyi/comments/commentRss/24244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengyi/services/trackbacks/24244.html</trackback:ping><description><![CDATA[<P>Action指明的是当前状态要执行的一些额外的操作，如记录log、发邮件等。<BR>（1）Swimline的delegation要做的就是判别当前Actor的身份。<BR>package kellerdu.jbpm.delegation;</P>
<P>import org.jbpm.delegation.*;<BR>import kellerdu.jbpm.LogsFactory;<BR>import org.apache.commons.logging.Log;</P>
<P>public class BossSwimlane implements AssignmentHandler {<BR>&nbsp;&nbsp;&nbsp; public BossSwimlane() {<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 当前的状态有哪个actor来具体负责处理，选择是老板的actor来处理。<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 如果王林是老板，那么他请假可以用他的名称来开始一个请假流程，当他检查他需要批示的<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 请假时，使用actorId=boss来找出所有的批示。这时selectActor返回的值就是一个常量“boss”<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param assignmentContext AssignmentContext<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @todo Implement this org.jbpm.delegation.AssignmentHandler method<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public String selectActor(AssignmentContext assignmentContext) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log log = LogsFactory.getLogInstance(this.getClass());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("任务分配给老板");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "boss";<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<BR>ackage kellerdu.jbpm.delegation;</P>
<P>import org.jbpm.delegation.*;<BR>import kellerdu.jbpm.LogsFactory;<BR>import org.apache.commons.logging.Log;</P>
<P>public class ChiefSwimlane implements AssignmentHandler {<BR>&nbsp;&nbsp;&nbsp; public ChiefSwimlane() {<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * selectActor<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @see BossSwimlane<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param assignmentContext AssignmentContext<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @todo Implement this org.jbpm.delegation.AssignmentHandler method<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public String selectActor(AssignmentContext assignmentContext) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log log = LogsFactory.getLogInstance(this.getClass());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("任务分配给上级主管");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "chief";<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR></P><img src ="http://www.blogjava.net/fengyi/aggbug/24244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengyi/" target="_blank">虾米老</a> 2005-12-16 16:51 <a href="http://www.blogjava.net/fengyi/archive/2005/12/16/24244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]一个JBPM工作流管理示例（一）</title><link>http://www.blogjava.net/fengyi/archive/2005/12/16/24243.html</link><dc:creator>虾米老</dc:creator><author>虾米老</author><pubDate>Fri, 16 Dec 2005 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/fengyi/archive/2005/12/16/24243.html</guid><wfw:comment>http://www.blogjava.net/fengyi/comments/24243.html</wfw:comment><comments>http://www.blogjava.net/fengyi/archive/2005/12/16/24243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengyi/comments/commentRss/24243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengyi/services/trackbacks/24243.html</trackback:ping><description><![CDATA[示例：<BR>在某一公司中，部门员工要休假的话需要部门主管的批准。如果休假天数大于10天的话，在部门主管的同意后，还必须上级主管批准。如果是部门主管要休假只要上级主管批准即可。在休假被批准之前，申请人可以撤销休假申请。<BR>每个员工还有多少天休假必须管理起来，在员工提交休假申请时要检查申请天数是否超过可用天数。申请批准后，要在可用天数里减去申请天数。每次休假申请结束之后，不管通过未通过或是否取消，都必须记录下来。主管在批复申请之后，系统要将批复结果Email给申请人。对于大于10天的申请，如果部门主管已批准同意而上级主管还未批准，这时申请人撤销申请后，系统应发Email通知部门主管申请已撤销。&nbsp;<BR>&nbsp;&nbsp;processdefinition.xml如下：<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;!-- edited with XMLSPY v2004 rel. 3 U (<A href="http://www.xmlspy.com/">http://www.xmlspy.com</A>) by keller (zju) --&gt;<BR>&lt;!DOCTYPE process-definition PUBLIC<BR>&nbsp;&nbsp;&nbsp; "-//jBpm/jBpm Mapping DTD 2.0//EN"<BR>&nbsp;&nbsp;&nbsp; "<A href="http://jbpm.org/dtd/processdefinition-2.0.dtd">http://jbpm.org/dtd/processdefinition-2.0.dtd</A>"&gt;<BR>&lt;process-definition&nbsp; name="RequestLeave"&gt;<BR>&nbsp;&lt;swimlane name="requester"&gt;<BR>&nbsp;&nbsp;&lt;description&gt;申请者&lt;/description&gt;<BR>&nbsp;&lt;/swimlane&gt;<BR>&nbsp;&lt;swimlane name="chief"&gt;<BR>&nbsp;&nbsp;&lt;description&gt;部门主管&lt;/description&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.delegation.ChiefSwimlane"/&gt;<BR>&nbsp;&lt;/swimlane&gt;<BR>&nbsp;&lt;swimlane name="boss"&gt;<BR>&nbsp;&nbsp;&lt;description&gt;上级主管&lt;/description&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.delegation.BossSwimlane"/&gt;<BR>&nbsp;&lt;/swimlane&gt;<BR>&nbsp;&lt;start-state name="request" swimlane="requester"&gt;<BR>&nbsp;&nbsp;&lt;transition to="BeginRequest"/&gt;<BR>&nbsp;&lt;/start-state&gt;<BR>&nbsp;&lt;fork name="BeginRequest"&gt;<BR>&nbsp;&nbsp;&lt;transition to="RequesterCancel"/&gt;<BR>&nbsp;&nbsp;&lt;transition to="IsChief"/&gt;<BR>&nbsp;&lt;/fork&gt;<BR>&nbsp;&lt;decision name="IsChief"&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.delegation.ChiefDecision"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="BossApprove"&nbsp; to="BossApprove"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="ChiefApprove"&nbsp; to="ChiefApprove"/&gt;<BR>&nbsp;&lt;/decision&gt;<BR>&nbsp;&lt;state name="RequesterCancel"&gt;<BR>&nbsp;&nbsp;&lt;assignment swimlane="requester"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="cancel" to="Decided"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 将请假的状态改变为“取消”--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.RequestCancel"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&lt;/state&gt;<BR>&nbsp;&lt;state name="ChiefApprove"&gt;<BR>&nbsp;&nbsp;&lt;assignment swimlane="chief"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="approve" to="NeedBossApprove"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 将请假的状态改变为“主管批准”--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.ChiefApprove"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&nbsp;&lt;transition name="disapprove" to="Decided"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 将请假的状态改变为“主管否决”--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.ChiefDisapprove"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&lt;/state&gt;<BR>&nbsp;&lt;state name="BossApprove"&gt;<BR>&nbsp;&nbsp;&lt;assignment swimlane="boss"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="approve" to="Decided"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 将请假的状态改变为“老板批准”--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.BossApprove"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&nbsp;&lt;transition name="disapprove" to="Decided"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 将请假的状态改变为“老板否决”--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.BossDisapprove"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&lt;/state&gt;<BR>&nbsp;&lt;decision name="NeedBossApprove"&gt;<BR>&nbsp;&nbsp;&lt;!-- 请假天数大于10天的要老板批准&nbsp; --&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="need" to="BossApprove"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="notNeed" to="Decided"/&gt;<BR>&nbsp;&lt;/decision&gt;<BR>&nbsp;&lt;join name="Decided"&gt;<BR>&nbsp;&nbsp;&lt;description&gt;有一个先到达即进行父Token&lt;/description&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.delegation.DecidedJoin"/&gt;<BR>&nbsp;&nbsp;&lt;transition to="DoSomething"/&gt;<BR>&nbsp;&lt;/join&gt;<BR>&nbsp;&lt;decision name="DoSomething"&gt;<BR>&nbsp;&nbsp;&lt;description&gt;<BR>&nbsp;&nbsp;&nbsp; 根据请求的状态决定。<BR>&nbsp;&nbsp;&nbsp; （1）“主管或者老板批准”－‘approve’：修改员工休假的总天数，设定发给用户E-Mail的信息。<BR>&nbsp;&nbsp;&nbsp; （2）“主管或者老板否决”-“disapprove”：设定发给用户E－Mail的信息。<BR>&nbsp;&nbsp;&nbsp; （3）“撤销”-"cancel"－设定发给用户E－Mail的信息。如果主管批准，要发给主管消息说明已经撤销。<BR>&nbsp;&nbsp;&nbsp; &lt;/description&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.delegation.DoSomethingDecision"/&gt;<BR>&nbsp;&nbsp;&lt;transition name="disapprove" to="Finished"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.Disapprove"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&nbsp;&lt;transition name="approve" to="Finished"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.Approve"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&nbsp;&lt;transition name="cancel" to="Finished"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.Cancel"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/action&gt;<BR>&nbsp;&nbsp;&lt;/transition&gt;<BR>&nbsp;&lt;/decision&gt;<BR>&nbsp;&lt;end-state name="Finished"/&gt;<BR>&nbsp;&lt;action event-type="process-end"&gt;<BR>&nbsp;&nbsp;&lt;!-- 发送E－Mail消息给申请者，记录请假日志 --&gt;<BR>&nbsp;&nbsp;&lt;delegation class="kellerdu.jbpm.action.ProcessEndAction"/&gt;<BR>&nbsp;&lt;/action&gt;<BR>&lt;/process-definition&gt;<BR><img src ="http://www.blogjava.net/fengyi/aggbug/24243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengyi/" target="_blank">虾米老</a> 2005-12-16 16:49 <a href="http://www.blogjava.net/fengyi/archive/2005/12/16/24243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring webflow学习笔记一(名词)</title><link>http://www.blogjava.net/fengyi/archive/2005/12/12/23484.html</link><dc:creator>虾米老</dc:creator><author>虾米老</author><pubDate>Mon, 12 Dec 2005 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/fengyi/archive/2005/12/12/23484.html</guid><wfw:comment>http://www.blogjava.net/fengyi/comments/23484.html</wfw:comment><comments>http://www.blogjava.net/fengyi/archive/2005/12/12/23484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengyi/comments/commentRss/23484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengyi/services/trackbacks/23484.html</trackback:ping><description><![CDATA[spring webflow名词:<BR>Spring webflow是有限状态机为基础的.主要是针对用户交互与事务为核心<BR>每个流程包括动作状态(action states) ,显示状态(view states),跳转状态(transactions)<BR>流程是用户定义好的一组客户交互组合,即由动作,显示状态及他们之间的跳转关系组成.<BR>显示状态(viewstates):对显示组件进行修饰.<BR>动作(action):是动作状态可以连接申明重用的最小单位.<BR>动作状态(action states):对事件(用户的或者其他的)的一种响应,自身包括可执行的action,transition<BR>跳转(Transition):类似于Struts中的ActionForward.负责连接2个状态<BR>后续动作(Continuation):用于回退或重新开始新流程.<img src ="http://www.blogjava.net/fengyi/aggbug/23484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengyi/" target="_blank">虾米老</a> 2005-12-12 15:14 <a href="http://www.blogjava.net/fengyi/archive/2005/12/12/23484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>