Jbpm4提供的IdentitySession接口并不是一種很好的處理方式,鑒于我們每個(gè)業(yè)務(wù)系統(tǒng)都有一套自己的用戶及權(quán)限認(rèn)證管理機(jī)制,需要與jbpm4.4集成的話,就比較周折了,我們經(jīng)常需要查詢的就是用戶自己的任務(wù)。jbpm4的任務(wù)里有一個(gè)比較好的任務(wù)人員指派定義方式,就是使用AssignmentHandler接口,其定義如下所示:
Java代碼
<?xml?version="1.0"?encoding="UTF-8"?> ????<process?name="TaskAssignmentHandler"?xmlns="http://jbpm.org/4.4/jpdl"> ??????<start?g="20,20,48,48"> ??????<transition?to="review"?/> ????</start> ??????<task?name="review"?g="96,16,127,52"> ??????<assignment-handler?class="org.jbpm.examples.task.assignmenthandler.AssignTask"> ????????<field?name="assignee"> ??????????<string?value="johndoe"?/> ????????</field> ??????</assignment-handler> ??????<transition?to="wait"?/> ????</task> ??????<state?name="wait"?g="255,16,88,52"?/> ????</process>??
<?xml version="1.0" encoding="UTF-8"?><process name="TaskAssignmentHandler" xmlns="http://jbpm.org/4.4/jpdl"><start g="20,20,48,48"><transition to="review" /></start><task name="review" g="96,16,127,52"><assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask"><field name="assignee"><string value="johndoe" /></field></assignment-handler><transition to="wait" /></task><state name="wait" g="255,16,88,52" /></process>
?
Java代碼
package?org.jbpm.examples.task.assignmenthandler; ????import?org.jbpm.api.model.OpenExecution; ??import?org.jbpm.api.task.Assignable; ??import?org.jbpm.api.task.AssignmentHandler; ??????????public?class?AssignTask?implements?AssignmentHandler?{ ???? ????private?static?final?long?serialVersionUID?=?1L; ??????String?assignee; ??????public?void?assign(Assignable?assignable,?OpenExecution?execution)?{ ??????assignable.setAssignee(assignee); ????} ??}??
package org.jbpm.examples.task.assignmenthandler;import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;/*** @author Tom Baeyens*/
public class AssignTask implements AssignmentHandler {private static final long serialVersionUID = 1L;String assignee;public void assign(Assignable assignable, OpenExecution execution) {assignable.setAssignee(assignee);}
}
?
?這要求我們?cè)谠O(shè)計(jì)流程定義后,任務(wù)的處理人已經(jīng)必須定下來了,但若我們?cè)诹鞒贪l(fā)布后,還需要手工改這里的任務(wù)執(zhí)行人員(并且人員是我們系統(tǒng)的用戶),甚至人員可能在流程運(yùn)行過程中,由用戶在任務(wù)表單或計(jì)算過程中動(dòng)態(tài)指定,以上的方式并不能滿足我們的要求。
?
基于這種想法,應(yīng)該設(shè)計(jì)另一種允許用戶修改流程定義中的人員,并且跟我們的系統(tǒng)用戶角色結(jié)合起來。
jbpm4之后的版本,啟動(dòng)流程及運(yùn)行流程時(shí),都會(huì)去讀取流程定義,因此,我們可以動(dòng)態(tài)修改以上配置文件,讓其生成類似如下的配置格式即可以滿足我們的要求:
?
Java代碼
<?xml?version="1.0"?encoding="UTF-8"?> ????<process?name="TaskAssignmentHandler"?xmlns="http://jbpm.org/4.4/jpdl"> ??????<start?g="20,20,48,48"> ??????<transition?to="review"?/> ????</start> ??????<task?name="review"?g="96,16,127,52"> ??????<assignment-handler?class="com.htsoft.core.jbpm.AssignmentHandler"> ????????<field?name="userIds"> ??????????<string?value="1"?/> ????????</field> ???????<field?name="roleIds"> ??????????<string?value="1,2"?/> ????????</field> ??????</assignment-handler> ??????<transition?to="wait"?/> ????</task> ??????<state?name="wait"?g="255,16,88,52"?/> ????</process>??
<?xml version="1.0" encoding="UTF-8"?><process name="TaskAssignmentHandler" xmlns="http://jbpm.org/4.4/jpdl"><start g="20,20,48,48"><transition to="review" /></start><task name="review" g="96,16,127,52"><assignment-handler class="com.htsoft.core.jbpm.AssignmentHandler"><field name="userIds"><string value="1" /></field><field name="roleIds"><string value="1,2" /></field></assignment-handler><transition to="wait" /></task><state name="wait" g="255,16,88,52" /></process>
?以上的userIds的1,以及roleIds的1,2則代表我們系統(tǒng)中的用戶id與角色的id,其值由后臺(tái)用戶在后面通過界面來設(shè)置。
?
其設(shè)置后,就生成以上的代碼寫至jbpm4_lob表中的blobvalue字段中去則可,這是持久化的處理。
?
也可以臨時(shí)調(diào)用類似以下的代碼動(dòng)態(tài)實(shí)現(xiàn)以上效果:
?
Java代碼
?????????public?void?addAssignHandler(ProUserAssign?proUserAssign){ ??????????ProcessDefinitionImpl?pd=(ProcessDefinitionImpl)repositoryService.createProcessDefinitionQuery().deploymentId(proUserAssign.getDeployId()).uniqueResult(); ???????????EnvironmentFactory?environmentFactory?=?(EnvironmentFactory)?processEngine; ???????????EnvironmentImpl?env=null; ???????????try?{ ???????????????env?=?environmentFactory.openEnvironment(); ??????????????????????????????TaskDefinitionImpl?taskDef=pd.getTaskDefinition(proUserAssign.getActivityName()); ???????????????UserCodeReference?userCodeReference?=?new?UserCodeReference(); ???????????????ObjectDescriptor?descriptor?=?new?ObjectDescriptor(); ??????????????????????????????descriptor.setClassName("com.htsoft.core.jbpm.UserAssignHandler"); ??????????????????????????????FieldOperation?userIdsFo?=?new?FieldOperation(); ???????????????userIdsFo.setFieldName("userIds");? ???????????????userIdsFo.setDescriptor(new?StringDescriptor(proUserAssign.getUserId())); ??????????????? ???????????????FieldOperation?groupIdsFo=new?FieldOperation(); ???????????????groupIdsFo.setFieldName("groupIds"); ???????????????groupIdsFo.setDescriptor(new?StringDescriptor(proUserAssign.getRoleId())); ??????????????? ???????????????List<Operation>?listOp=new?ArrayList<Operation>(); ???????????????listOp.add(userIdsFo); ???????????????listOp.add(groupIdsFo); ???????????????descriptor.setOperations(listOp); ??????????????? ???????????????userCodeReference.setCached(false); ???????????????userCodeReference.setDescriptor(descriptor); ???????????????taskDef.setAssignmentHandlerReference(userCodeReference); ??????????????? ???????????}catch(Exception?ex){ ???????????????logger.error("ADD?AssignHandler?Error:"?+?ex.getMessage()); ???????????}finally{ ???????????????if(env!=null){ ???????????????????env.close(); ???????????????} ???????????} ??????}??
/*** 為流程定義加上任務(wù)的指派人員接口* @param deployId*/public void addAssignHandler(ProUserAssign proUserAssign){ProcessDefinitionImpl pd=(ProcessDefinitionImpl)repositoryService.createProcessDefinitionQuery().deploymentId(proUserAssign.getDeployId()).uniqueResult();EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;EnvironmentImpl env=null;try {env = environmentFactory.openEnvironment();//找到任務(wù)的定義TaskDefinitionImpl taskDef=pd.getTaskDefinition(proUserAssign.getActivityName());UserCodeReference userCodeReference = new UserCodeReference();ObjectDescriptor descriptor = new ObjectDescriptor();//加上任務(wù)的人員動(dòng)態(tài)指派descriptor.setClassName("com.htsoft.core.jbpm.UserAssignHandler");//動(dòng)態(tài)加參數(shù)FieldOperation userIdsFo = new FieldOperation();userIdsFo.setFieldName("userIds"); userIdsFo.setDescriptor(new StringDescriptor(proUserAssign.getUserId()));FieldOperation groupIdsFo=new FieldOperation();groupIdsFo.setFieldName("groupIds");groupIdsFo.setDescriptor(new StringDescriptor(proUserAssign.getRoleId()));List<Operation> listOp=new ArrayList<Operation>();listOp.add(userIdsFo);listOp.add(groupIdsFo);descriptor.setOperations(listOp);userCodeReference.setCached(false);userCodeReference.setDescriptor(descriptor);taskDef.setAssignmentHandlerReference(userCodeReference);}catch(Exception ex){logger.error("ADD AssignHandler Error:" + ex.getMessage());}finally{if(env!=null){env.close();}}}
?
不過該方式?jīng)]有持久久,重啟系統(tǒng)后,保存的用戶及角色設(shè)置并不會(huì)生效。
?
UserAssignHandler類代碼如下:
?
?
Java代碼
package?com.htsoft.core.jbpm; ????import?org.apache.commons.lang.StringUtils; ??import?org.apache.commons.logging.Log; ??import?org.apache.commons.logging.LogFactory; ??import?org.jbpm.api.model.OpenExecution; ??import?org.jbpm.api.task.Assignable; ??import?org.jbpm.api.task.AssignmentHandler; ????import?com.htsoft.core.Constants; ???????????????????public?class?UserAssignHandler?implements?AssignmentHandler{ ??????private?Log?logger=LogFactory.getLog(UserAssignHandler.class); ????????????String?userIds; ????????????String?groupIds; ?????? ??????@Override??????public?void?assign(Assignable?assignable,?OpenExecution?execution)?throws?Exception?{ ?????????? ??????????String?assignId=(String)execution.getVariable(Constants.FLOW_ASSIGN_ID); ?????????? ??????????logger.info("assignId:===========>"?+?assignId); ?????????? ????????????????????if(StringUtils.isNotEmpty(assignId)){ ??????????????assignable.setAssignee(assignId); ??????????????return; ??????????} ?????????? ???????????????????? ????????????????????String?signUserIds=(String)execution.getVariable(Constants.FLOW_SIGN_USERIDS); ?????????? ??????????if(signUserIds!=null){ ????????????????????????} ?????????? ??????????logger.debug("Enter?UserAssignHandler?assign?method~~~~"); ?????????? ??????????if(userIds!=null){??????????????String[]uIds=userIds.split("[,]"); ??????????????if(uIds!=null?&&?uIds.length>1){??????????????????for(String?uId:uIds){ ??????????????????????assignable.addCandidateUser(uId); ??????????????????} ??????????????}else{ ??????????????????assignable.setAssignee(userIds); ??????????????} ??????????} ?????????? ??????????if(groupIds!=null){??????????????String[]gIds=userIds.split("[,]"); ??????????????if(gIds!=null&&?gIds.length>1){??????????????????for(String?gId:gIds){ ??????????????????????assignable.addCandidateGroup(gId); ??????????????????} ??????????????}else{ ??????????????????assignable.addCandidateGroup(groupIds); ??????????????} ??????????} ????????} ????}??
總結(jié)
以上是生活随笔為你收集整理的利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。