日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思

發(fā)布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Jbpm4提供的IdentitySession接口并不是一種很好的處理方式,鑒于我們每個業(yè)務(wù)系統(tǒng)都有一套自己的用戶及權(quán)限認證管理機制,需要與jbpm4.4集成的話,就比較周折了,我們經(jīng)常需要查詢的就是用戶自己的任務(wù)。jbpm4的任務(wù)里有一個比較好的任務(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; ??
  • ??
  • ??
  • /** ?
  • ?*?@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); ??
  • ??} ??
  • }??
  • 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);} }

    ?

    ?這要求我們在設(shè)計流程定義后,任務(wù)的處理人已經(jīng)必須定下來了,但若我們在流程發(fā)布后,還需要手工改這里的任務(wù)執(zhí)行人員(并且人員是我們系統(tǒng)的用戶),甚至人員可能在流程運行過程中,由用戶在任務(wù)表單或計算過程中動態(tài)指定,以上的方式并不能滿足我們的要求。

    ?

    基于這種想法,應(yīng)該設(shè)計另一種允許用戶修改流程定義中的人員,并且跟我們的系統(tǒng)用戶角色結(jié)合起來。

    jbpm4之后的版本,啟動流程及運行流程時,都會去讀取流程定義,因此,我們可以動態(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,其值由后臺用戶在后面通過界面來設(shè)置。

    ?

    其設(shè)置后,就生成以上的代碼寫至jbpm4_lob表中的blobvalue字段中去則可,這是持久化的處理。

    ?

    也可以臨時調(diào)用類似以下的代碼動態(tài)實現(xiàn)以上效果:

    ?

    Java代碼
  • /** ?
  • ?????*?為流程定義加上任務(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ù)的人員動態(tài)指派 ??
  • ?????????????descriptor.setClassName("com.htsoft.core.jbpm.UserAssignHandler"); ??
  • ?????????????//動態(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(); ??
  • ?????????????} ??
  • ?????????} ??
  • ????}??
  • /*** 為流程定義加上任務(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ù)的人員動態(tài)指派descriptor.setClassName("com.htsoft.core.jbpm.UserAssignHandler");//動態(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è)置并不會生效。

    ?

    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; ??
  • ??
  • /** ?
  • ?*?尚未開始使用 ?
  • ?*?<B><P>Joffice?--?http://www.jee-soft.cn</P></B> ?
  • ?*?<B><P>Copyright?(C)?2008-2010?GuangZhou?HongTian?Software?Company?(廣州宏天軟件有限公司)</P></B>? ?
  • ?*?<B><P>description:</P></B> ?
  • ?*?<P></P> ?
  • ?*?<P>product:joffice</P> ?
  • ?*?<P></P>? ?
  • ?*?@see?com.htsoft.core.jbpm.UserAssignHandler ?
  • ?*?<P></P> ?
  • ?*?@author? ?
  • ?*?@version?V1 ?
  • ?*?@create:?2010-11-23下午02:58:01 ?
  • ?*/??
  • public?class?UserAssignHandler?implements?AssignmentHandler{ ??
  • ????private?Log?logger=LogFactory.getLog(UserAssignHandler.class); ??
  • ????//授予用戶ID ??
  • ????String?userIds; ??
  • ????//授權(quán)角色ID ??
  • ????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); ??
  • ???????? ??
  • ????????//在表單提交中指定了固定的執(zhí)行人員 ??
  • ????????if(StringUtils.isNotEmpty(assignId)){ ??
  • ????????????assignable.setAssignee(assignId); ??
  • ????????????return; ??
  • ????????} ??
  • ???????? ??
  • ????????//在表單中指定了執(zhí)行的角色TODO ??
  • ???????? ??
  • ????????//在表單中指定了會簽人員 ??
  • ????????String?signUserIds=(String)execution.getVariable(Constants.FLOW_SIGN_USERIDS); ??
  • ???????? ??
  • ????????if(signUserIds!=null){ ??
  • ????????????//TODO?取到該任務(wù),進行會簽設(shè)置 ??
  • ????????} ??
  • ???????? ??
  • ????????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)容還不錯,歡迎將生活随笔推薦給好友。