日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
使用JBossjBPM實(shí)現(xiàn)流程訪(fǎng)問(wèn)和執(zhí)行的授權(quán)

當(dāng)今常見(jiàn)的BPM趨勢(shì)是集中化整個(gè)公司或公司內(nèi)大部門(mén)的BPM執(zhí)行。這意味著,單個(gè)BPM服務(wù)器(集群)運(yùn)行著整個(gè)公司的許多流程定義。這種方式的挑戰(zhàn)在 于,雖然BPM引擎(包括jBPM)提供了對(duì)于任務(wù)訪(fǎng)問(wèn)的授權(quán),但它們一般都不支持這些功能的授權(quán):流程定義的查看和刪除,流程實(shí)例的啟動(dòng)、結(jié)束、查看和刪除等。在這篇文章中,我們將描述如何對(duì)jBPM引擎進(jìn)行擴(kuò)展 (基于jBPM 4.3)來(lái)實(shí)現(xiàn)這一功能。

十年的彭陽(yáng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整彭陽(yáng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“彭陽(yáng)網(wǎng)站設(shè)計(jì)”,“彭陽(yáng)網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

整體實(shí)現(xiàn)方法

整個(gè)實(shí)現(xiàn)方式相當(dāng)直接了當(dāng)——對(duì)于每個(gè)流程定義引入一組可以授權(quán)的用戶(hù)/用戶(hù)組(類(lèi)似任務(wù)定義),作用于定義、實(shí)例和給定流程的歷史。此外,我們還想對(duì)給 定的用戶(hù)/用戶(hù)組支持多重授權(quán)級(jí)別——目前我們打算引入2個(gè)角色:“starter”和“user”。這里的“starter”是允許對(duì)流程定義/實(shí)例 /歷史進(jìn)行任何操作的角色,而“user”角色的權(quán)限僅限于查詢(xún)流程/歷史。

這種方式的實(shí)現(xiàn)需要對(duì)jBPM進(jìn)行以下改造:

◆流程定義:

給流程定義增加流程訪(fǎng)問(wèn)權(quán)限

◆流程部署:

擴(kuò)展當(dāng)前的流程部署器,增加流程授權(quán)定義的解析和流程訪(fǎng)問(wèn)列表的生成

引入額外的類(lèi)/數(shù)據(jù)庫(kù)表,存放每個(gè)流程定義的訪(fǎng)問(wèn)權(quán)限

◆流程執(zhí)行(Execution)

引入已授權(quán)命令(authorized command)——要求用戶(hù)經(jīng)過(guò)授權(quán)才能執(zhí)行的命令

修改現(xiàn)有的jBPM中我們期望基于當(dāng)前用戶(hù)證書(shū)進(jìn)行授權(quán)的部分。這包括啟動(dòng)、結(jié)束和刪除流程實(shí)例,以及刪除部署定義。

修改現(xiàn)有的jBPM查詢(xún),考慮現(xiàn)有用戶(hù)的證書(shū)。這包括部署和流程定義查詢(xún)、流程實(shí)例查詢(xún),以及歷史流程實(shí)例、活動(dòng)和細(xì)節(jié)的查詢(xún)。

除了以上更改,我們還想擴(kuò)展流程實(shí)例查詢(xún),好讓用戶(hù)可以通過(guò)指定某些流程變量的值來(lái)縮小查詢(xún)結(jié)果。這種搜索的一個(gè)常見(jiàn)情況就是查詢(xún)“由我啟動(dòng)的”流程。為 了確保這種查詢(xún)總是可用,我們更改了啟動(dòng)流程實(shí)例命令的實(shí)現(xiàn),顯式地把當(dāng)前用戶(hù)ID加到了流程變量值的集合中。

最后,為了支持多種用戶(hù)認(rèn)證方法,我們實(shí)現(xiàn)了一個(gè)自定義的身份會(huì)話(huà),它支持用程序來(lái)設(shè)置和訪(fǎng)問(wèn)當(dāng)前用戶(hù)的證書(shū)。其目的在于,把用戶(hù)證書(shū)(ID和參與的組) 的獲得和jBPM運(yùn)行時(shí)對(duì)這種信息的使用分離開(kāi)來(lái)。

我們的實(shí)現(xiàn)利用了非常強(qiáng)大和靈活的jBPM 4的配置機(jī)制,它讓我們可以:

通過(guò)擴(kuò)展現(xiàn)有jBPM類(lèi),最小化了自定義代碼的數(shù)量,只實(shí)現(xiàn)我們擴(kuò)展所需的額外功能

將我們的擴(kuò)展實(shí)現(xiàn)成可以與jBPM 4類(lèi)庫(kù)一起使用的單獨(dú)jar包,無(wú)需對(duì)現(xiàn)有庫(kù)進(jìn)行任何改變。

在深入我們的實(shí)現(xiàn)細(xì)節(jié)之前,我們首先要討論一下我們大量使用的jBPM 4的配置。

#p#

jBPM 4的配置機(jī)制

jBPM的基礎(chǔ)是流程虛擬機(jī)(PVM)[2],它建立在自定義的依賴(lài)注入實(shí)現(xiàn)之上。依賴(lài)注入由非常強(qiáng)大的、基于XML的配置機(jī)制控制,這種機(jī)制用于創(chuàng)建標(biāo)簽和預(yù)定義接口相關(guān)的特定實(shí)現(xiàn)之間的綁定 (binding)。

這種機(jī)制的核心是jbpm.wire.bindings.xml文件,它描述了[3] jBPM PVM的主要組件,包括:

◆基本類(lèi)型

◆對(duì)象及引用

◆環(huán)境引用

◆Hibernate綁定

◆會(huì)話(huà)

◆服務(wù)

◆部署器

◆攔截器

◆等

該文件是jBPM分發(fā)包的一部分。如果用戶(hù)想增加自己的綁定(binding),他可以創(chuàng)建jbpm.user.wire.bindings.xml描述 它們,而不用修改jbpm.wire.bindings.xml文件。

這兩個(gè)文件會(huì)被jBPM PVM在啟動(dòng)時(shí)讀入并解析,為定義在jbpm.cfg.xml中的基礎(chǔ)PVM執(zhí)行(execution)配置而服務(wù)。jbpm.cfg.xml一般會(huì)包含 多個(gè)部分,描述了PVM執(zhí)行的特定組件的配置。

jBPM PVM由一組提供PVM功能的服務(wù)組成[4]。主要的PVM服務(wù)包括:

◆倉(cāng)儲(chǔ)服務(wù),提供一組查看和管理部署倉(cāng)儲(chǔ)的方法

◆執(zhí)行服務(wù),提供一組查看和管理運(yùn)行中流程執(zhí)行(execution)的方 法。

◆管理服務(wù),提供一組查看和管理工作(job)的方法

◆任務(wù)服務(wù),提供一組查看和管理用戶(hù)任務(wù)(task)的方法。

◆歷史服務(wù),提供一組訪(fǎng)問(wèn)運(yùn)行中和已完成流程執(zhí)行的歷史信息的方法。

這組可用服務(wù)和實(shí)現(xiàn)這些服務(wù)的類(lèi)(使用前面說(shuō)的綁定)被配置成流程引擎的上下文。

服務(wù)執(zhí)行被實(shí)現(xiàn)成一組命令(command),它們作為服務(wù)方法執(zhí)行的一部分被調(diào)用。命令的實(shí)際執(zhí)行由命令服務(wù)控制。

命令服務(wù)在命令服務(wù)上下文中被配置成一組攔截器,實(shí)現(xiàn)橫切關(guān)注點(diǎn),環(huán)繞(around)命令調(diào)用(命令執(zhí)行管線(xiàn))。缺省的jBPM分發(fā)包在命令執(zhí)行管線(xiàn)中 攜帶了以下攔截器:

◆重試(Retry)攔截器負(fù)責(zé)重試命令執(zhí)行

◆環(huán)境(Environment)攔截器負(fù)責(zé)在必要時(shí)把jBPM上下文注入命 令執(zhí)行中

◆事務(wù)(Transaction)攔截器負(fù)責(zé)介入命令調(diào)用的事務(wù)邊界劃分。

攔截器是將jBPM移植到不同環(huán)境以及引入其他橫切關(guān)注點(diǎn)的核心機(jī)制。

命令執(zhí)行一般會(huì)利用環(huán)境,它也是可配置的。典型的環(huán)境組件有:

◆倉(cāng)儲(chǔ)會(huì)話(huà)

◆DB會(huì)話(huà)

◆消息會(huì)話(huà)

◆定時(shí)器會(huì)話(huà)

◆歷史會(huì)話(huà)

◆郵件會(huì)話(huà)

可以添加其他會(huì)話(huà)來(lái)擴(kuò)展PVM的功能。

最后,部署管理器配置允許指定一組部署器,它們依次執(zhí)行,把業(yè)務(wù)流程部署到PVM。這種方法使得擴(kuò)展流程定義可以通過(guò)實(shí)現(xiàn)額外的部署步驟完成,無(wú)需覆蓋 jBPM分發(fā)包自帶的部署器。

整個(gè)PVM的架構(gòu)如圖1示:

圖 1 PVM架構(gòu)

#p#

在流程定義中引入授權(quán)

我們?cè)趫D2中看到,可以給流程定義添加任意屬性。利用這種擴(kuò)展選項(xiàng),我們現(xiàn)在定義以下流程屬性,描述授權(quán)策略:

◆starter-users,具有“starter”角色的用戶(hù)列表

◆starter-groups,具有 “starter”角色的組列表

◆user-users,具有“user”角色的用戶(hù)列表

◆user-groups,具 有“user”角色的組列表

每個(gè)屬性的值是逗號(hào)分隔的組/用戶(hù)id列表。

圖 2 流程定義模式

此外,我們還定義了一個(gè)特殊的用戶(hù)類(lèi)型——“any”和兩個(gè)用戶(hù)組——“all”和“admin”。任何用戶(hù),不論其真實(shí)ID是什么,都是“any”用 戶(hù)。任何組,不論其ID是什么,也都是“all”。最后,“admin”組的成員被認(rèn)為是任意組的成員。

流程授權(quán)定義由以下規(guī)則驅(qū)動(dòng):

◆如果user-users和user-groups都未被指定,則user-users=”all”

◆如果 starter-users和starte-groups都未被指定,則流程用戶(hù)被額外地分配“starter”角色。

按照這個(gè)規(guī)則,清單1中的流程可以被任何人啟動(dòng)和使用。

 
 
 
 
  1.          key="NO_AUTHORIZATION" 
  2.          name="Test Authorization not required" 
  3.          version="1" 
  4.          xmlns="http://jbpm.org/4.0/jpdl"> 
  5.      
  6.          
  7.      
  8.      
  9.  
  10.  

清單 1 沒(méi)有授權(quán)信息的流程定義

清單2的流程可以被mark或tomcat組中的任何人使用和啟動(dòng)。

 
 
 
 
  1.          key="AUTHORIZATION" 
  2.          name="Test Authorization Required" 
  3.          version="1" 
  4.          xmlns="http://jbpm.org/4.0/jpdl" 
  5.          user-users="mark" 
  6.          user-groups="tomcat"> 
  7.      
  8.          
  9.      
  10.      
  11.  

清單 2 具有用戶(hù)授權(quán)信息的流程定義

我們引入了一個(gè)新類(lèi)——ACL,針對(duì)給定流程 (processDefinitionID,processDefinitionKey,DeploymentID),它包含一個(gè)單獨(dú)的訪(fǎng)問(wèn)列表(用戶(hù)或 組,以及類(lèi)型);同時(shí)還引入了相應(yīng)的Hibernate定義。

圖3中,清單1的流程部署為具有兩個(gè)角色(“user”和“starter”)的用戶(hù)“any”創(chuàng)建了2個(gè)ACL;而在圖4中,清單2的流程部署將創(chuàng)建4 個(gè)——用戶(hù)“mark”和組“tomcat”,每個(gè)都具有2個(gè)角色:“user”和“starter”。

圖 3 無(wú)授權(quán)信息的流程的ACL

圖 4 有用戶(hù)授權(quán)信息的流程的ACL

這些ACL的生成是通過(guò)引入額外的部署器完成的,它將在“標(biāo)準(zhǔn)”jBPM部署器之后運(yùn)行,抽取上面描述的授權(quán)屬性,為給定流程構(gòu)建ACL。

#p#

保護(hù)jBPM命令

我們采用了一種通用的方法來(lái)保護(hù)jBPM命令,包括實(shí)現(xiàn)用于定義命令所需授權(quán)信息的自定義的注解,以及處理這個(gè)注解的自定義的授權(quán)會(huì)話(huà)(命令攔截器)實(shí)現(xiàn)。

授權(quán)注解(清單3)可以指定所需的用戶(hù)角色和表示某個(gè)流程的方法。

 
 
 
 
  1. @Retention(value=RetentionPolicy.RUNTIME)  
  2. @Target(value=ElementType.METHOD)  
  3. public @interface AuthorizedCommand {  
  4.     /** Access type */ 
  5.     public String role();  
  6.     String key();  
  7. }  
  8.  

清單 3 授權(quán)注解

對(duì)于某個(gè)流程,用戶(hù)角色——“starter”或“user”——指向某個(gè)用戶(hù)應(yīng)該擁有的角色[6]。由于不同命令既可以引用部署ID,也可以引用流程ID或者流程鍵值,因此注解支持多種指定鍵值的方式,允許將合適的引用指定為鍵值。

清單4的授權(quán)攔截器檢查是否有命令的方法被授權(quán)注解修飾。如果有,則執(zhí)行適當(dāng)?shù)牟樵?xún),確定出哪些用戶(hù)和用戶(hù)組集合被授權(quán)給了這個(gè)命令,然后檢查當(dāng)前用戶(hù)是 否屬于他們。

 
 
 
 
  1. …………  
  2.  
  3. @SuppressWarnings("unchecked")  
  4. public void checkPermission(Command command, EnvironmentImpl environment) {  
  5.     environment.setAuthenticatedUserId(environment.get(AuthorizationIdentitySession.class).getAuthenticatedUserId());  
  6.     for( Method method : command.getClass().getMethods()) {  
  7.         AuthorizedCommand sc = method.getAnnotation(AuthorizedCommand.class);  
  8.         if(sc != null){  
  9.             log.debug("Checking Class based Secured Function");  
  10.             String ID = environment.get(AuthorizationIdentitySession.class).getAuthenticatedUserId();  
  11.             Object value = null;  
  12.             try {  
  13.                 log.debug("Checking authorization: " + command.getClass().getName());  
  14.                 Session session = environment.get(SessionImpl.class);  
  15.                 value = method.invoke(command, (Object[])null);  
  16.                 Query uQ = session.createQuery(userQuery.get(sc.key())).  
  17.                 setString("role", sc.role()).setString("value",(String) value);  
  18.                 Query gQ = session.createQuery(groupQuery.get(sc.key())).  
  19.                 setString("role", sc.role()).setString("value", (String) value);  
  20.                 List userIds = (List)uQ.list();  
  21.                 List groups = (List)gQ.list();  
  22.                 if(!isAuthorized(environment, userIds, groups))   
  23.                     throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  24.             } catch (IllegalArgumentException e) {  
  25.                 log.error("Caught " + IllegalArgumentException.class, e);  
  26.                 throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  27.             } catch (IllegalAccessException e) {  
  28.                 log.error("Caught " + IllegalAccessException.class, e);  
  29.                 throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  30.             } catch (InvocationTargetException e) {  
  31.                 log.error("Caught " + InvocationTargetException.class, e);  
  32.                 throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  33.             }  
  34.         }    
  35.     }  
  36.     return;  
  37. }  
  38.  
  39. ……………………  
  40.  
  41. public boolean isAuthorized(EnvironmentImpl env, List authorizedUserIds, List authorizedGroupIds) {  
  42.     AuthorizationIdentitySession identitySession = env.get(AuthorizationIdentitySession.class);  
  43.     if (authorizedUserIds.contains(AuthorizationIdentitySession.ANONYMOUS_USER_ID))   
  44.         return true;  
  45.     if (authorizedUserIds.contains(identitySession.getAuthenticatedUserId()) )   
  46.         return true;  
  47.     //check if any of userGroups is an authorized group.  if so then return true  
  48.     List groups = identitySession.findGroupsByUser(identitySession.getAuthenticatedUserId());  
  49.     for(Group group : groups){  
  50.         String g = group.getId();  
  51.         //admin is allowed to execute any command  
  52.         if(g.equals(AuthorizationIdentitySession.ADMINISTRATORS_GROUP))  
  53.             return true;  
  54.         if(authorizedGroupIds.contains(g))  
  55.             return true;  
  56.     }  
  57.     return false;  
  58. }  
  59.  

清單 4 授權(quán)攔截器

為了保護(hù)命令實(shí)現(xiàn),我們創(chuàng)建了一個(gè)新類(lèi),它擴(kuò)展了現(xiàn)有的命令,增加了一個(gè)帶注解的方法(清單5),返回給定命令可用的鍵值。

 
 
 
 
  1. @AuthorizedCommand(role = ACL.STARTER, key = NavteqAuthorizationSession.PROCESSID)  
  2. public String getProcessDefinitionKey() {  
  3.    return processDefinitionId;  

清單 5 給啟動(dòng)流程實(shí)例命令引入授權(quán)信息

根據(jù)所提議的方法,我們對(duì)下列命令進(jìn)行了注解:

◆刪除部署

◆啟動(dòng)流程實(shí)例

◆啟動(dòng)最近的流程實(shí)例

◆結(jié)束流程實(shí)例

◆刪除流程實(shí)例

#p#

擴(kuò)展查詢(xún)

引入授權(quán)意味著查詢(xún)結(jié)果應(yīng)該只返回用戶(hù)被授權(quán)查看的信息[7]。這可以通過(guò)擴(kuò)展現(xiàn)有查詢(xún)的where語(yǔ)句實(shí)現(xiàn)(清單6)。

 
 
 
 
  1. //check authorization  
  2. String userId = EnvironmentImpl.getCurrent().getAuthenticatedUserId();  
  3. List userGroups = EnvironmentImpl.getCurrent().get(IdentitySession.class).findGroupsByUser(userId);  
  4.  
  5. hql.append(", " + ACL.class.getName() + " as acl ");  
  6. appendWhereClause("acl.deployment=deployment and acl.type='" +   
  7.                   ACL.STARTER +   
  8.                   "' ", hql);  
  9. appendWhereClause("((acl.userId in " +   
  10.                   Utils.createHqlUserString(userId) +   
  11.                   ") or " +   
  12.                   "(acl.groupId in " +   
  13.                   Utils.createHqlGroupString(userGroups) + "))   
  14.                   ", hql);  

清單 6 為流程定義查詢(xún)提供授權(quán)支持的額外where語(yǔ)句

額外的where語(yǔ)句是通過(guò)擴(kuò)展現(xiàn)有查詢(xún)實(shí)現(xiàn)和覆蓋hlq方法實(shí)現(xiàn)的。

按照這種方法,擴(kuò)展了以下查詢(xún):

◆部署查詢(xún)

◆流程定義查詢(xún)

◆流程實(shí)例查詢(xún)

◆歷史流程實(shí)例查詢(xún)

◆歷史活動(dòng) 查詢(xún)

◆歷史細(xì)節(jié)查詢(xún)

為了能夠增加字符串實(shí)例變量,以縮小查詢(xún)結(jié)果,我們還額外擴(kuò)展了一個(gè)流程實(shí)例查詢(xún)。

#p#

支持多種用戶(hù)管理方式

以上給出的實(shí)現(xiàn)依賴(lài)使用執(zhí)行環(huán)境來(lái)獲得當(dāng)前用戶(hù)ID和使用IdentitySession來(lái)獲得用戶(hù)組成員關(guān)系。jBPM分發(fā)包提供了這個(gè)接口的2個(gè)實(shí)現(xiàn):

◆IdentitySessionImpl,基于jBPM的用戶(hù)/組數(shù)據(jù)庫(kù)

◆JBossIdmIdentitySessionImpl, 基于JBoss Identity IDM組件

不同于大量依賴(lài)其他技術(shù)的實(shí)現(xiàn),對(duì)于我們的實(shí)現(xiàn),我們決定把用戶(hù)ID/組的獲取同這些信息的保存分離開(kāi)來(lái),使之可以被其他的jBPM實(shí)現(xiàn)利用(圖5)。

圖 5 用戶(hù)管理實(shí)現(xiàn)

為了確保在設(shè)定和重新設(shè)定用戶(hù)證書(shū)的時(shí)候環(huán)境是可用的,我們把這兩個(gè)操作實(shí)現(xiàn)成了命令(清單7),這樣,借助jBPM命令執(zhí)行服務(wù)就可以正確設(shè)置執(zhí)行環(huán)境。

 
 
 
 
  1. public static class SetPrincipalCommand extends AbstractCommand {  
  2.     private static final long serialVersionUID = 1L;  
  3.     private String userId;  
  4.     private String[] groups;  
  5.     public SetPrincipalCommand(String u, String...groups) {  
  6.         this.userId=u; this.groups=groups;  
  7.     }  
  8.     public Void execute(Environment environment) throws Exception {  
  9.         environment.get(AuthorizationIdentitySession.class).setPrincipal(userId,groups);  
  10.         return null;  
  11.     }  
  12. }  
  13.  
  14. public static class ResetPrincipalCommand extends AbstractCommand {  
  15.     private static final long serialVersionUID = 1L;  
  16.     public Void execute(Environment environment) throws Exception {  
  17.         environment.get(AuthorizationIdentitySession.class).reset();  
  18.         return null;  
  19.     }  
  20. }  
  21.  

清單 7 設(shè)置用戶(hù)證書(shū)命令

#p#

把新命令和查詢(xún)引入到j(luò)BPM執(zhí)行中

由于jBPM并沒(méi)有提供任何配置“命令——服務(wù)”關(guān)系的支持,為了能改變給定服務(wù)中的命令,就必須使用調(diào)用新命令的新服務(wù)實(shí)現(xiàn)覆蓋舊實(shí)現(xiàn)。清單8給出了一個(gè)使用新命令服務(wù)覆蓋歷史服務(wù)的例子。

 
 
 
 
  1. public class NavteqHistoryServiceImpl extends HistoryServiceImpl {  
  2.     @Override 
  3.     public HistoryActivityInstanceQuery createHistoryActivityInstanceQuery() {  
  4.       return new AuthorizedHistoryActivityInstanceQueryImpl(commandService);  
  5.     }  
  6.  
  7.     @Override 
  8.     public HistoryDetailQuery createHistoryDetailQuery() {  
  9.         return new AuthorizedHistoryDetailQueryImpl(commandService);  
  10.     }  
  11.  
  12.     @Override 
  13.     public HistoryProcessInstanceQuery createHistoryProcessInstanceQuery() {  
  14.         return newAuthorizedHistoryProcessInstanceQuery(commandService);  
  15.     }  
  16. }  
  17.  

清單 8 在歷史服務(wù)中引入授權(quán)命令

總結(jié)

本文給出的這部分實(shí)現(xiàn)[8]并沒(méi)有擴(kuò)展JPDL,而是擴(kuò)展了被jBPM支持的所有語(yǔ)言都使用的JBoss PVM[9]。結(jié)果是,這些語(yǔ)言都能夠使用這個(gè)實(shí)現(xiàn)。

致謝

我要感謝NAVTEQ的同事,尤其是Mark Kedzierski和我一起討論了整個(gè)設(shè)計(jì)和大部分代碼的實(shí)現(xiàn),以及Stefan Balkowec、Vlad Zhukov、Eugine Felds和Catalin Capota在定義整個(gè)解決方案中的幫助。


當(dāng)前題目:使用JBossjBPM實(shí)現(xiàn)流程訪(fǎng)問(wèn)和執(zhí)行的授權(quán)
文章轉(zhuǎn)載:http://www.5511xx.com/article/dhdeicj.html