| 3.1.
BPMN 2.0ÊÇÊ²Ã´ÄØ£¿
ÒµÎñÁ÷³ÌÄ£ÐÍ×¢½â£¨Business Process Modeling Notation
- BPMN£©ÊÇ ÒµÎñÁ÷³ÌÄ£Ð͵ÄÒ»ÖÖ±ê׼ͼÐÎ×¢½â¡£Õâ¸ö±ê×¼ ÊÇÓɶÔÏó¹ÜÀí×飨Object Management
Group - OMG£©Î¬»¤µÄ¡£
»ù±¾ÉÏ£¬BPMN¹æ·¶¶¨ÒåÁËÈÎÎñ¿´ÆðÀ´ÔõÑùµÄ£¬ÄÄЩ½á¹¹¿ÉÒÔ ÓëÆäËû½øÐÐÁ¬½Ó£¬µÈµÈ¡£Õâ¾ÍÒâζ×Å
Òâ˼²»»á±»Îó½â¡£
±ê×¼µÄÔçÆÚ°æ±¾£¨1.2°æÒÔ¼°Ö®Ç°£©½ö½öÏÞÖÆÔÚÄ£ÐÍÉÏ£¬ Ä¿±êÊÇÔÚËùÓеÄÀûÒæÏà¹ØÕßÖ®¼äÐγÉͨÓõÄÀí½â£¬
ÔÚÎĵµ£¬ÌÖÂÛºÍʵÏÖÒµÎñÁ÷³ÌÖ®ÉÏ¡£ BPMN±ê×¼Ö¤Ã÷ÁËËü×Ô¼º£¬ÏÖÔÚÊг¡ÉÏÐí¶à½¨Ä£¹¤¾ß ¶¼Ê¹ÓÃÁËBPMN±ê×¼ÖеÄÔªËØºÍ½á¹¹¡£
ʵ¼ÊÉÏ£¬ÏÖÔÚµÄjPDLÉè¼ÆÆ÷ҲʹÓÃÁË BPMNÔªËØ¡£
BPMN¹æ·¶µÄ2.0°æ±¾£¬µ±Ç°ÒѾ´¦ÓÚ×îÖÕ½×¶ÎÁË£¬ ÒѾ¼Æ»®²»¾Í¾Í»áÍê³É£¬ÔÊÐíÌí¼Ó¾«È·µÄ¼¼Êõϸ½Ú
ÔÚBPMNµÄͼÐκÍÔªËØÖУ¬ Í¬Ê±ÖÆ¶¨BPMNÔªËØµÄÖ´ÐÐÓï·¨¡£ ͨ¹ýʹÓÃXMLÓïÑÔÀ´Ö¸¶¨ÒµÎñÁ÷³ÌµÄ¿ÉÖ´ÐÐÓï·¨£¬
BPMN¹æ·¶ÒѾÑݱäΪҵÎñÁ÷³ÌµÄÓïÑÔ£¬ ¿ÉÒÔÖ´ÐÐÔÚÈκμæÈÝBPMN2µÄÁ÷³ÌÒýÇæÖУ¬ ͬʱÒÀÈ»¿ÉÒÔʹÓÃÇ¿´óµÄͼÐÎ×¢½â¡£
3.2. ÀúÊ·ºÍÄ¿±ê
jBPM BPMN2µÄʵÏÖÊÇÔÚjBPM 4.0·¢²¼Ö®ºó ÔÚ2009Äê8Ô£¬ÔÚÓëÉçÇø½øÐÐÁ˽ôÃÜÐ×÷Ö®ºóÆô¶¯µÄ¡£
¶øºó£¬ÎÒÃǾö¶¨Á˵ÚÒ»¸ö·¢²¼°æ£¨±ÈÈ磬Îĵµ/QA£© Éæ¼°Ò»²¿·ÖBPMN2¹æ·¶£¬½«ÔÚjBPM 4.3·¢²¼¡£
ÎÒÃǵÄÄ¿±êÊǽ¨Á¢Ò»¸öÔÉúBPMN2ÔËÐÐÒýÇæ £¨»òÕß˵ʵÏÖ'¿ÉÖ´ÐеÄBPMN2'£©»ùÓÚÁ÷³ÌÐéÄâ»ú
£¨Process Virtual Machine - PVM£©¡£ ×¢Ò⣬Õâ¸ö°æ±¾µÄÖ÷ҪĿ±êÊÇÔÉú¿ÉÖ´ÐУ¬
²»ÊÇͼÐÎ×¢½â - µ«ÊÇÎÒÃÇÇå³þ ¶ÔÓÚδÀ´µÄ°æ±¾ÊǺÜÖØÒªµÄ¡£
Èç¹ûÓû§ÒѾÁ˽âÁËjBPM£¬¾Í»á·¢ÏÖ
ÅäÖýṹ±£³Ö²»±ä
APIÓëÒѾ´æÔÚµÄÍêȫһÑù»òÕߺÜÀàËÆ
²âÊÔBPMN2Á÷³ÌÒ²¿ÉÒÔʹÓó£ÓõÄjava²âÊÔ¿ò¼Ü
Êý¾Ý¿â±í½á¹¹±£³Ö²»±ä
ËùÒÔ£¬×ÜÌåÀ´Ëµ£¬ÎÒÃǵÄÖ÷ҪĿ±êÊDZ£³ÖËùÓÐÔÚjBPMÉϺõÄÊÂÇ飬 ¼ÓÇ¿ËüÃÇ£¬Ê¹ÓÃÒ»¸ö±ê×¼µÄÁ÷³ÌÓïÑÔ¡£
3.3. JPDL vs BPMN 2.0
µÚÒ»¸öÎÊÌâ¿ÉÄÜÊÇ£¬ºÜÕýµ±µÄ£¬Ó³ÈëÄÔº£µÄÊÇ£¬ ΪʲôÒѾÓÐÁËjPDL»¹ÒªÊµÏÖBPMN2¡£ËüÃÇÁ½¸öÓïÑÔ
µÄÄ¿±ê¶¼ÊǶ¨Òå¿ÉÖ´ÐеÄÒµÎñÁ÷³Ì¡£´Ó¸ß²ã´ÎÀ´¿´£¬ Á½¸öÓïÑÔÊǵÈЧµÄ¡£Ö÷ÒªµÄÇø±ðÊÇ BPMN2ÊÇ¡°³§ÉÌÖÐÁ¢¡±µÄ£¬Äã¿ÉÒÔʹÓñê×¼£¬
¶øjPDLÊǰó¶¨ÔÚjBPMÉϵģ¨ËäÈ»»áÓÐһЩÕùÂÛ °ó¶¨ÔÚ¿ªÔ´ÓïÑÔ³§É̱ÈÈçjPDL ºÍ°ó¶¨ÔÚ±ÕÔ´²úÆ·£©¡£
ÔÚjBPMÖУ¬Á½¸öÓïÑÔʵÏÖ¶¼Êǽ¨Á¢ÔÚjBPMÁ÷³ÌÐéÄâ»úÉ쵀 £¨PVM£©¡£ÕâÒâζ×ÅÁ½¸öÓïÑÔ¹²ÏíͨÓù¦ÄÜ
£¨³Ö¾Ã»¯£¬ÊÂÎñ£¬ÅäÖã¬Ò²Óлù±¾Á÷³Ì½á¹¹£¬µÈµÈ£©¡£ ½á¹û¾ÍÊÇ£¬¶ÔjBPMºËÐĵÄÓÅ»¯ »á¶ÔÁ½¸öÓïÑÔÓÐÒæ¡£ÒÀ¿¿PVM£¬BPMN2ʵÏÖ
½¨Á¢ÔÚ»ù´¡ÉÏ£¬ÒѾÔÚ¹ýÈ¥Ö¤Ã÷ÁËËü×Ô¼º£¬ ²¢ÓµÓÐÁ˺ܴóµÄ×îÖÕÓû§ÉçÇø¡£
µ±Ö´ÐÐÓïÑÔ£¬°ÑËüÃÇÏ໥±È½ÏµÄʱºò£¬ ÏÂÃæ¼¸µã±ØÐëÄÉÈ뿼ÂÇ£º
BPMN2ÊÇ»ùÓÚ±»BPM¹¤Òµ½ÓÊܵÄÒ»¸ö±ê×¼¡£
BPMN2ÊÇÓëʵÏÖÎ޹صġ£ÕâÒ»µãµÄȱµãÊǼ¯³Éjava¼¼Êõ jPDL×Ü»á¸üÔç¡£
ËùÒÔ£¬´Ójava¿ª·¢ÕߵĽǶȣ¬jPDL¸ü¼òµ¥£¬¸Ð¾õ¸ü×ÔÈ» £¨Ò»Ð©BPEL/WSDLµÄ¡°²ã´Î¡±Ò²ÔÚBPMNÖУ©¡£
jPDLµÄÒ»¸öÄ¿±êÊÇXML¿É¶Á£¬BPMN2Á÷³ÌÔÚ Ò»¶¨³Ì¶ÈÉÏÒ²ÊǿɶÁµÄ£¬µ«Êǹ¤¾ßºÍ¸ü¶à¹æ·¶µÄϸ½Ú
»áÒªÇóʵÏÖͬµÈ¼¶µÄ Éú²úÁ¦¡£
java¿ª·¢Õß¿ÉÒԺܿìѧ»ájPDL£¬ÒòΪËûÃǺÜÁ˽âjPDLÓïÑÔ£¬ »á·¢ÏÖʵÓù¤¾ßÓÐʱºòºÜÂé·³£¬
ÓïÑÔ±¾ÉíÒ²¹ýÓÚ¸´ÔÓÁË¡£
BPMN2°üº¬Ò»¸öºÜ´óµÄÃèÊö½á¹¹µÄ¼¯ºÏ£¬Ôڹ淶ÖС£ È»¶ø£¬¶Ô½Ó¿Ú´úÂëµÄ°ó¶¨Ôڹ淶ÖÐÊÇ¿ª·ÅµÄ
£¨ÓëXPDLÏà±È£©£¬¼´Ê¹WSDLͨ³£»á±»Ä¬ÈÏʹÓᣠÕâÒâζ×ÅÁ÷³ÌµÄ¿ÉÒÆÖ²ÐÔɥʧÁË£¬ µ±ÎÒÃǰÑÁ÷³ÌÒÆÖ²µ½Ò»¸öÒýÇæÉÏ£¬¶øÕâ¸öÒýÇæ²»Ö§³ÖͬÑùµÄ°ó¶¨»úÖÆ¡£
±ÈÈ磬µ÷ÓÃjavaÀàͨ³£ÊÇjBPMµÄĬÈÏʵÏÖ µÄ°ó¶¨·½Ê½¡£
ºÜ×ÔÈ»µÄ£¬ÒòΪÕþÖÎÔÒò£¬BPMN2¹æ·¶·¢Õ¹µÄ»á±È½ÏÂý¡£ jPDL¾Í¿ÉÒÔ¿ìËٱ仯£¬ºÍм¼Êõ½øÐм¯³É£¬
µ±ËûÃÇ·¢²¼µÄʱºò£¬ ÓëBPMN2Ïà±È¿ÉÒÔ¼Ó¿ì²½·¥½øÐÐÑÝ»¯¡£ µ±È»£¬ÒòΪÁ½¸ö¶¼½¨Á¢ÔÚͬһ¸öPVMÉÏ£¬jPDLÖеÄÂß¼
Ò²¿ÉÒÔÒ»Ö±µ½BPMN2ÉÏ£¬ ×÷Ϊһ¸öÀ©Õ¹£¬²»»á³öÏֺܶàÂé·³¡£
3.4. Bpmn 2.0 Ö´ÐÐ
BPMN2¹æ·¶¶¨ÒåÁ˷dz£·á¸»µÄÓïÑÔ£¬Îª½¨Ä£ºÍÖ´ÐÐÒµÎñÁ÷³Ì¡£ È»¶ø£¬Ò²Òâζ×ÅËü·Ç³£À§ÄÑ×ÜÀÀBPMN2¿ÉÄÜÊÇÔõÑù
ΪÁ˼ò»¯ÕâÖÖÇé¿ö£¬ÎÒÃǾö¶¨°Ñ BPMN2½á¹¹·ÖΪÈý¸öµÈ¼¶¡£ Çø·ÖµÄ·½Ê½Ö÷Òª»ùÓÚBruce SilverдµÄ
'BPMN method and Style'Õâ±¾Êé(http://www.bpmnstyle.com/)£¬
Dr. Jim ArlowµÄÅàѵ×ÊÁÏ( http://www.slideshare.net/jimarlow/introductiontobpmn005)£¬
'How much BPMN do you need'( http://www.bpm-research.com/2008/03/03/how-much-bpmn-do-you-need/)£¬
ºÍÎÒÃÇ×Ô¼ºµÄ¾Ñé¡£
ÎÒÃǶ¨ÒåÁËÈýÖÖBPMN2½á¹¹·ÖÀࣺ
»ù±¾£ºÕâ¸ö·ÖÀàµÄ½á¹¹ºÜÖ±½Ó ²¢ÇÒÈÝÒ×Á˽⡣Õâ¸ö·ÖÀàµÄ½á¹¹¿ÉÒÔÓÃÀ´Îª ¼òµ¥µÄÒµÎñÁ÷³Ì½¨Ä£¡£
¸ß¼¶£º°üº¬¸üÇ¿´ó»ò¸ü¸´ÔӵĽṹ£¬ ÕâЩ¶¼Ìá¸ßÁ˽¨Ä£ºÍÖ´ÐÐÓï·¨µÄѧϰÇúÏß¡£
ÒµÎñÁ÷³ÌµÄÖ÷ҪĿ±êÊÇʹÓÃÕâ¸ö ºÍ֮ǰµÄ·ÖÀàÀ´ÊµÏֽṹ¡£
¸´ÔÓ£ºÕâ¸ö·ÖÀàµÄ½á¹¹ÓÃÀ´ÊµÏÖº±¼ûµÄÇé¿ö£¬ »òÕßËüÃǵÄÓï·¨ÄÑÒÔÀí½â¡£
3.5. ÅäÖÃ
ÔÚÄãµÄÓ¦ÓÃÖÐʹÓÃBPMN 2.0ÊǺܼòµ¥µÄ£ºÖ»Òª°ÑÏÂÃæÒ»ÐÐ ¼ÓÈëjbpm.cfg.xmlÎļþ¡£
<import resource="jbpm.bpmn.cfg.xml" /> |
ÕâÀïµÄÒýÓûáÆôÓÃBPMN 2.0µÄÁ÷³Ì·¢²¼£¬Í¨¹ý°ÑBPMN 2.0·¢²¼Æ÷°²×°µ½Á÷³ÌÒýÇæÖС£
×¢ÒâÁ÷³ÌÒýÇæ¿ÉÒÔͬʱʹÓÃjPDLºÍBPMN 2.0Á÷³Ì¡£ ÕâÒâζ×ÅÔÚÄãµÄÓ¦ÓÃÀһЩÁ÷³Ì¿ÉÄÜÊÇjPDL£¬
ÆäËûµÄ¿ÉÄÜÊÇBPMN 2.0¡£
Á÷³ÌÒýÇæÊǸù¾Ý¶¨ÒåÎļþµÄºó׺À´Çø·ÖÁ÷³Ì¶¨ÒåµÄ¡£ ¶ÔÓÚBPMN 2.0£¬Ê¹ÓÃ*.bpmn.xmlºó׺
£¨jPDLʹÓÃ*.jpdl.xmlºó׺£©¡£
3.6. ʵÀý
·¢²¼Öаüº¬µÄÀý×ÓÒ²°üº¬ÁËÏÂÃæÕ½ÚÖÐ ÌÖÂÛµÄÿ¸ö½á¹¹µÄʵÀý¡£²é¿´BPMN
2.0µÄÁ÷³ÌʵÀý ºÍ²âÊÔÓÃÀý£¬ ÔÚorg.jbpm.examples.bpmn.* °üÏ¡£
²Î¿¼Óû§Ö¸ÄÏ£¬µÚ¶þÕ£¨°²×°£©£¬Ñо¿Ò»ÏÂÈçºÎµ¼ÈëʵÀý¡£ ²é¿´Õ½Ú'µ¼ÈëʵÀý'¡£
3.7. Á÷³Ì¸ùÔªËØ
Ò»¸öBPMN 2.0 XMLÁ÷³ÌµÄ¸ùÊÇdefinitionsÔªËØ¡£ ÔÚÃüÃû״̬£¬×ÓÔªËØ»á°üº¬ÕæÕýµÄÒµÎñÁ÷³Ì¶¨Òå¡£
ÿ¸öprocess×ÓÔªËØ ¿ÉÒÔÓµÓÐÒ»¸öidºÍ name¡£Ò»¸ö¿ÕµÄBPMN 2.0ÒµÎñÁ÷³Ì ¿´ÆðÀ´ÏñÏÂÃæÕâÑù¡£Ò²Òª×¢Òâ°ÑBPMN2.xsd·ÅÔÚclasspathÏ£¬
À´ÆôÓÃXML×Ô¶¯²¹È«¡£
<definitions id="myProcesses" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.omg.org/spec/BPMN/2.0 BPMN20.xsd" xmlns="http://schema.omg.org/spec/BPMN/2.0" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://jbpm.org/example/bpmn2">
<process id="myBusinessProcess"
name="My business processs">
...
</process>
<definitions |
Èç¹ûÒ»¸öprocessÔªËØ¶¨ÒåÁËid£¬Ëü»á×÷ΪҵÎñÁ÷³ÌµÄkeyʹÓà £¨±ÈÈ磬Æô¶¯Á÷³Ì¿ÉÒÔͨ¹ýµ÷ÓÃexecutionService.startProcessInstanceByKey("myBusinessProcess")£¬
·ñÔòjBPMÒýÇæ»á´´½¨Ò»¸öΨһÁ÷³Ìkey£¨ÓëjPDLÏàͬ£©¡£
3.8. »ù±¾½á¹¹
3.8.1. ʼþ
Óë»î¶¯ºÍÍø¹ØÒ»Æð£¬Ê¼þÓÃÀ´ÔÚʵ¼ÊµÄÿ¸öÒµÎñÁ÷³ÌÖС£ ʼþÈÃÒµÎñ½¨Ä£¹¤¾ßÓúÜ×ÔÈ»µÄ·½Ê½ÃèÊöÒµÎñÁ÷³Ì£¬±ÈÈç
'µ±ÎÒ½ÓÊÕµ½¿Í»§µÄ¶©µ¥£¬Õâ¸öÁ÷³Ì¾ÍÆô¶¯'£¬ 'Èç¹ûÁ½ÌìÄÚÈÎÎñû½áÊø£¬¾ÍÖÕÖ¹Á÷³Ì' »òÕß'µ±ÎÒÊÕµ½Ò»·âÈ¡ÏûÓʼþ£¬µ±Á÷³ÌÔÚÔËÐÐʱ£¬
ʹÓÃ×ÓÁ÷³Ì´¦ÀíÓʼþ'¡£×¢ÒâµäÐ͵ÄÒµÎñ ͨ³£Ê¹ÓÃÕâÖÖʼþÇý¶¯µÄ·½Ê½¡£ÈËÃDz»»áÓ²±àÂë˳Ðò´´½¨£¬ µ«ÊÇËûÃÇÇãÏòÓÚʹÓÃÔÚËûÃǵĻ·¾³Öз¢ÉúµÄÊÂÇ飨±ÈÈ磬ʼþ£©¡£
ÔÚBPMN¹æ·¶ÖУ¬ÃèÊöÁ˺ܶàʼþÀàÐÍ£¬ÎªÁ˸²¸Ç¿ÉÄܵÄÊÂÇ飬 ÔÚÒµÎñ»·¾³ÖпÉÄܳöÏÖµÄÇé¿ö¡£
3.8.2. ʼþ£º¿ÕÆô¶¯Ê¼þ
Ò»¸öÆô¶¯Ê¼þ˵Ã÷ÁËÁ÷³ÌµÄ¿ªÊ¼£¨»ò×ÓÁ÷³Ì£©¡£Í¼ÐÎÐÎʽ£¬Ëü¿´ÆðÀ´ ÊÇÒ»¸öÔ²£¨¿ÉÄÜ£©ÄÚ²¿ÓÐÒ»¸öСͼ±ê¡£Í¼±êÖ¸¶¨ÁËʼþµÄʵ¼ÊÀàÐÍ
»áÔÚÁ÷³ÌʵÀý´´½¨Ê±±»´¥·¢¡£
¿ÕÆô¶¯Ê¼þ»³öÀ´ÊÇÒ»¸öÔ²£¬ÄÚ²¿Ã»ÓÐͼ±ê£¬Òâ˼ÊÇ Õâ¸ö´¥·¢Æ÷ÊÇδ֪»òÕßδָ¶¨µÄ¡£jPDLµÄ¿ªÊ¼»î¶¯»ù±¾ÊÇÒ»ÑùµÄÓï·¨¡£
Á÷³ÌʵÀýµÄÁ÷³Ì¶¨Òå°üº¬Ò»¸ö¿ÕÆô¶¯Ê¼þ£¬ ¿ÉÒÔʹÓÃexecutionServiceµÄAPIµ÷Óô´½¨¡£
Ò»¸ö¿Õ¿ªÊ¼Ê¼þÏñÏÂÃæÕâÑù¶¨Òå¡£idÊDZØÌîµÄ£¬nameÊÇ¿ÉÑ¡µÄ¡£
<startEvent id="start" name="myStart" /> |
3.8.3. ʼþ£º¿Õ½áÊøÊ¼þ
½áÊøÊ¼þÖ¸¶¨ÁËÁ÷³ÌʵÀýÖÐÒ»¸öÁ÷³Ì·¾¶µÄ½áÊø¡£ ͼÐÎÉÏ£¬Ëü¿´ÆðÀ´¾ÍÊÇÒ»¸öÔ²
ÓµÓкñ±ß¿ò£¨¿ÉÄÜ£© ÄÚ²¿ÓÐСͼ±ê¡£ ͼ±êÖ¸¶¨Á˽áÊøµÄʱºò »áÖ´ÐÐÄÄÖÖ²Ù×÷¡£
¿Õ½áÊøÊ¼þ»³öÀ´ÊÇÒ»¸öÔ²£¬ÓµÓкñ±ß¿ò£¬ÄÚ²¿Ã»ÓÐͼ±ê£¬ ÕâÒâζ×ŵ±Á÷³Ìµ½´ïʼþʱ£¬²»»áÅ׳öÈκÎÐźš£
jPDLÖеĽáÊøÊ¼þÓë¿Õ½áÊøÊ¼þÓïÒåÏàͬ¡£
¿Õ½áÊøÊ¼þ¿ÉÒÔÏñÏÂÃæÒ»Ñù¶¨Ò壬idÊDZØÌîµÄ£¬nameÊÇ¿ÉÑ¡µÄ¡£
<endEvent id="end" name="myEnd" /> |
ÏÂÃæµÄÀý×ÓÏÔʾÁËֻʹÓÿտªÊ¼ºÍ½áÊøÊ¼þµÄÁ÷³Ì£º

Õâ¸öÁ÷³Ì¶ÔÓ¦µÄ¿ÉÖ´ÐÐXMLÏñÕâÑù £¨ºöÂÔÉùÃ÷ÓõÄdefinitions¸ùÔªËØ£©
<process id="noneStartEndEvent" name="BPMN2 Example none start and end event">
<startEvent id="start" />
<sequenceFlow id="flow1" name="fromStartToEnd"
sourceRef="start" targetRef="end"
/>
<endEvent id="end" name="End"
/>
</process> |
ÏÖÔÚ¿ÉÒÔͨ¹ýµ÷ÓÃstartProcessInstanceXXX²Ù×÷£¬ ´´½¨Ò»¸öÁ÷³ÌʵÀý¡£
ProcessInstance processInstance = executionService.startProcessInstanceByKey("noneStartEndEvent"); |
3.8.4. ʼþ£ºÖÕÖ¹½áÊøÊ¼þ
ÖÕÖ¹ºÍ¿Õ½áÊøÊ¼þµÄÇø±ðÊÇ Êµ¼ÊÖÐÁ÷³ÌµÄ·¾¶ÊÇÈçºÎ´¦ÀíµÄ£¨»òÕßʹÓÃBPMN
2.0µÄÊõÓï½Ð×ötoken£©¡£ ÖÕÖ¹½áÊøÊ¼þ»á½áÊøÕû¸öÁ÷³ÌʵÀý£¬¶ø¿Õ½áÊøÊ¼þÖ»»á½áÊøµ±Ç°Á÷³Ì·¾¶¡£ ËûÃǶ¼²»»áÅ׳öÈκÎÊÂÇé
µ±µ½´ï½áÊøÊ¼þµÄʱºò¡£

Ò»¸öÖÕÖ¹½áÊøÊ¼þ¿ÉÒÔÏñÏÂÃæ¶¨Òå¡£idÊDZØÌîµÄ£¬nameÊÇ¿ÉÑ¡µÄ¡£
<endEvent id="terminateEnd" name="myTerminateEnd"> <terminateEventDefinition/> </endEvent> |
ÖÕÖ¹½áÊøÊ¼þ±»Ãè»æ³É½áÊøÊ¼þÒ»Ñù£¨Ô²£¬ºñ±ß¿ò£©£¬ ÄÚ²¿Í¼±êʱһ¸öÍêÕûµÄÔ²¡£ÔÚÏÂÃæµÄÀý×ÓÖУ¬Íê³Étask1
»á½áÊøÁ÷³ÌʵÀý£¬µ±Íê³Étask2ʱֻ»á½áÊøµ½´ï½áÊøÊ¼þ µÄÁ÷³Ì·¾¶£¬Ö»Ê£ÏÂtask1´ò¿ª¡£
²Î¿¼jBPM·¢²¼°üÖеÄʵÀý£¬ µ¥Ôª²âÊÔºÍÒµÎñÁ÷³Ì¶ÔÓ¦XML¡£
3.8.5. ˳ÐòÁ÷
˳ÐòÁ÷ÊÇʼþ£¬»î¶¯ºÍÍø¹ØÖ®¼äµÄÁ¬Ïߣ¬ÏÔʾΪһÌõʵÏß ´øÓмýÍ·£¬ÔÚBPMNͼÐÎÖУ¨jPDLÖеÈЧµÄÊÇtransition£©¡£
ÿ¸ö˳ÐòÁ÷¶¼ÓÐÒ»¸öÔ´Í·ºÍÒ»¸ö Ä¿±êÒýÓ㬰üº¬ÁË »î¶¯£¬Ê¼þ»òÍø¹ØµÄid¡£
<sequenceFlow id="myFlow" name="My Flow" sourceRef="sourceId" targetRef="targetId" /> |
ÓëjPDLµÄÒ»¸öÖØÒªÇø±ðÊǶàÍâÏò˳ÐòÁ÷µÄÐÐΪ¡£ ÔÚjPDLÖУ¬Ö»ÓÐÒ»¸ö×ªÒÆ»á³ÉΪÍâÏò×ªÒÆ£¬³ý·Ç»î¶¯ÊÇfork
£¨»ò×Ô¶¨Òå»î¶¯ÓµÓÐforkÐÐΪ£©¡£È»¶ø£¬ÔÚBPMNÖУ¬ ¶àÍâÏò˳ÐòÁ÷µÄĬÈÏÐÐΪÊÇÇзֽøÈëµÄtoken£¨jBPMÖÐÊõÓï½Ð×öexecution£©
·Ö³Étoken¼¯ºÏ£¬Ã¿¸ö˳ÐòÁ÷Ò»¸ö¡£ÔÚÏÂÃæÇé¿öÖУ¬ ÔÚÍê³ÉµÚÒ»¸öÈÎÎñ£¬¾Í»á¼¤»îÈý¸öÈÎÎñ¡£

ΪÁ˱ÜÃâʹÓÃÒ»¸ö˳ÐòÁ÷£¬±ØÐëÌí¼ÓconditionÌõ¼þµ½Ë³ÐòÁ÷ÖС£ ÔÚÔËÐÐʱ£¬Ö»Óе±conditionÌõ¼þ½á¹ûΪtrue£¬
˳ÐòÁ÷²Å»á±»Ö´ÐС£
ΪÁ˸øË³ÐòÁ÷Ìí¼ÓconditionÌõ¼þ£¬Ìí¼ÓÒ»¸öconditionExpression
ÔªËØµ½Ë³ÐòÁ÷ÖС£Ìõ¼þ¿ÉÒÔ·ÅÔÚ ${}ÖС£
<sequenceFlow id=....> <conditionExpression xsi:type="tFormalExpression">${amount >= 500}</conditionExpression> </sequenceFlow> |
×¢Ò⣬µ±Ç°±ØÐë°Ñ xsi:type="tFormalExpression"Ìí¼Óµ½
conditionExpressionÖС£ÔÚδÀ´µÄ°æ±¾ÖпÉÄÜ»áÐ޸ġ£
»î¶¯£¨±ÈÈçÓû§ÈÎÎñ£©ºÍÍø¹Ø£¨±ÈÈçÎ¨Ò»Íø¹Ø£©¿ÉÒÔÓû§Ä¬ÈÏ˳ÐòÁ÷¡£ ĬÈÏ˳ÐòÁ÷Ö»»áÔڻ»òÍø¹ØµÄ
ËùÓÐÆäËûÍâÏò˳ÐòÁ÷µÄconditionÌõ¼þΪfalseʱ²Å»áʹÓᣠĬÈÏ˳ÐòÁ÷ͼÐÎÏñÊÇ˳ÐòÁ÷¶àÁËÒ»¸öбÏß±ê¼Ç¡£

ĬÈÏ˳ÐòÁ÷ͨ¹ýÖ¸¶¨»î¶¯»òÍø¹ØµÄ 'default' ÊôÐÔ À´Ê¹Óá£
ҲҪעÒ⣬ĬÈÏ˳ÐòÁ÷Éϵıí´ïʽ»á±»ºöÂÔ¡£
3.8.6. Íø¹Ø
BPMNÖеÄÍø¹ØÊÇÓÃÀ´¿ØÖÆÁ÷³ÌÖеÄÁ÷ÏòµÄ¡£¸üÈ·ÇеÄÊÇ£¬ µ±Ò»¸ötoken£¨BPMN
2.0ÖÐexecutionµÄ¸ÅÄî×¢½â£©µ½´ïÒ»¸öÍø¹Ø£¬ Ëü»á¸ù¾ÝÍø¹ØµÄÀàÐͽøÐкϲ¢»òÇз֡£
Íø¹ØÃè»æ³ÉÒ»¸öÁâÐΣ¬Ê¹ÓÃÒ»¸öÄÚ²¿Í¼±êÀ´Ö¸¶¨ÀàÐÍ £¨Î¨Ò»£¬¹ã·º£¬ÆäËû£©¡£
ËùÓÐÍø¹ØÀàÐÍ£¬¶¼¿ÉÒÔÉèÖÃgatewayDirection¡£ ÏÂÃæµÄÖµ¿ÉÒÔʹÓãº
unspecificed (ĬÈÏ)£ºÍø¹Ø¿ÉÄÜÓµÓжà¸ö ½øÈëºÍÍâ³ö˳ÐòÁ÷¡£
mixed£ºÍø¹Ø±ØÐëÓµÓжà¸ö ½øÈëºÍÍâ³ö˳ÐòÁ÷¡£
converging£ºÍø¹Ø±ØÐëÓµÓжà¸ö½øÈë˳ÐòÁ÷£¬ µ«ÊÇÖ»ÄÜÓÐÒ»¸öÍâ³ö˳ÐòÁ÷¡£
diverging£ºÍø¹Ø±ØÐëÓµÓÐÒ»¸ö½øÈë˳ÐòÁ÷£¬ ºÍ¶à¸öÍâ³ö˳ÐòÁ÷¡£
±ÈÈçÏÂÃæµÄÀý×Ó£º²¢ÐÐÍø¹ØµÄgatewayDirectionÊôÐÔΪ'converging'£¬
»áÓµÓÐjsonÐÐΪ¡£
<parallelGateway id="myJoin" name="My synchronizing join" gatewayDirection="converging" /> |
×¢Ò⣺gatewayDirectionÊôÐÔ¸ù¾Ý¹æ·¶ÊÇ¿ÉÑ¡µÄ¡£ ÕâÒâζ×ÅÎÒÃDz»ÄÜͨ¹ýÕâ¸öÊôÐÔÀ´
ÔÚÔËÐÐʱ֪µÀÒ»¸öÍø¹ØµÄÐÐΪ£¨±ÈÈ磬һ¸ö²¢ÐÐÍø¹Ø£¬ Èç¹ûÎÒÃÇÓù»Çзֺͺϲ¢ÐÐΪ£©¡£È»¶ø£¬gatewayDirectionÊôÐÔÓÃÔÚ½âÎöʱ
×÷ÎªÔ¼ÊøÌõ¼þ¶Ô½øÈë¡¢Íâ³ö˳ÐòÁ÷¡£ËùÒÔʹÓÃÕâ¸öÊôÐÔ »á¼õµÍ³ö´íµÄ»ú»á£¬µ±ÒýÓÃ˳ÐòÁ÷ʱ£¬ µ«²»ÊDZØÌîµÄ¡£
3.8.7. Íø¹Ø£ºÎ¨Ò»Íø¹Ø
Î¨Ò»Íø¹Ø±í´ïÁËÒ»¸öÁ÷³ÌÖеÄΨһ¾ö²ß¡£ »áÓÐÒ»¸öÍâÏò˳ÐòÁ÷±»Ê¹Ó㬸ù¾Ý¶¨ÒåÔÚ
˳ÐòÁ÷ÖеÄÌõ¼þ¡£
¶ÔÓ¦µÄjPDL½á¹¹£¬ÏàͬµÄÓï·¨ÊÇ decision»î¶¯¡£Î¨Ò»Íø¹ØµÄ ÍêÈ«¼¼ÊõÃû³ÆÊÇ'»ùÓÚÊý¾ÝµÄÎ¨Ò»Íø¹Ø'£¬
µ«ÊÇÒ²¾³£³ÆÎªXOR Íø¹Ø¡£ XORÍø¹Ø±»Ãè»æÎªÒ»¸öÁâÐΣ¬ÄÚ²¿ÓÐÒ»¸ö'X'£¬ Ò»¸ö¿ÕµÄÁâÐΣ¬Ã»ÓÐÍø¹ØÒ²ÏóÕ÷×ÅÎ¨Ò»Íø¹Ø¡£
ÏÂÃæÍ¼ÐÎÏÔʾÁËÎ¨Ò»Íø¹ØµÄÓ÷¨£º¸ù¾Ýamount±äÁ¿µÄÖµ£¬ »áÑ¡ÔñÎ¨Ò»Íø¹ØÍâÏòµÄÈý¸öÍâÏò˳ÐòÁ÷
ÖеÄÒ»¸ö¡£

Õâ¸öÁ÷³Ì¶ÔÓ¦µÄ¿ÉÖ´ÐÐXML¿´ÆðÀ´ÏñÏÂÃæÕâÑù¡£ ×¢ÒⶨÒåÔÚ˳ÐòÁ÷ÖеÄÌõ¼þ¡£Î¨Ò»Íø¹Ø»áÑ¡ÔñÒ»¸ö˳ÐòÁ÷£¬
Èç¹ûÌõ¼þÖ´ÐÐΪtrue¡£Èç¹û¶à¸öÌõ¼þ Ö´ÐÐΪtrue£¬µÚÒ»¸öÓöµ½µÄ¾Í»á±»Ê¹Óà £¨ÈÕÖ¾ÐÅÏ¢»áÏÔʾÕâÖÖÇé¿ö£©¡£
<process id="exclusiveGateway" name="BPMN2 Example exclusive gateway">
<startEvent id="start" />
<sequenceFlow id="flow1" name="fromStartToExclusiveGateway"
sourceRef="start" targetRef="decideBasedOnAmountGateway"
/>
<exclusiveGateway id="decideBasedOnAmountGateway"
name="decideBasedOnAmount" />
<sequenceFlow id="flow2" name="fromGatewayToEndNotEnough"
sourceRef="decideBasedOnAmountGateway"
targetRef="endNotEnough">
<conditionExpression xsi:type="tFormalExpression">
${amount < 100}
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow3" name="fromGatewayToEnEnough"
sourceRef="decideBasedOnAmountGateway"
targetRef="endEnough">
<conditionExpression xsi:type="tFormalExpression">
${amount <= 500 && amount >= 100}
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" name="fromGatewayToMoreThanEnough"
sourceRef="decideBasedOnAmountGateway"
targetRef="endMoreThanEnough">
<conditionExpression xsi:type="tFormalExpression">
${amount > 500}
</conditionExpression>
</sequenceFlow>
<endEvent id="endNotEnough" name="not
enough" />
<endEvent id="endEnough" name="enough"
/>
<endEvent id="endMoreThanEnough"
name="more than enough" />
</process> |
Õâ¸öÁ÷³ÌÐèÒªÒ»¸ö±äÁ¿£¬ÕâÑù±í´ïʽ¾Í¿ÉÒÔÔÚÔËÐÐÆÚ¼äÖ´ÐС£ ±äÁ¿¿ÉÒÔ±»Ìṩ£¬µ±Á÷³ÌʵÀýÖ´ÐеÄʱºò£¨ÀàËÆjPDL£©¡£
Map<String, Object> vars = new HashMap<String, Object>(); vars.put("amount", amount); ProcessInstance processInstance = executionService.startProcessInstanceByKey("exclusiveGateway", vars); |
Î¨Ò»Íø¹ØÐèÒªËùÓÐÍâÏò˳ÐòÁ÷É϶¼¶¨ÒåÌõ¼þ¡£ ¶ÔÕâÖÖ¹æÔòÒ»ÖÖÀýÍâÊÇĬÈÏ˳ÐòÁ÷¡£
ʹÓÃdefault ÊôÐÔÀ´ÒýÓÃÒ»¸öÒÑ´æÔÚµÄ Ë³ÐòÁ÷µÄid¡£Õâ¸ö˳ÐòÁ÷»á±»Ê¹Óà µ±ÆäËûÍâÏò˳ÐòÁ÷µÄÌõ¼þ¶¼Ö´ÐÐΪfalseʱ¡£
<exclusiveGateway id="decision" name="decideBasedOnAmountAndBankType" default="myFlow"/>
<sequenceFlow id="myFlow" name="fromGatewayToStandard"
sourceRef="decision" targetRef="standard">
</sequenceFlow> |
3.8.8. Íø¹Ø£º²¢ÐÐÍø¹Ø
²¢ÐÐÍø¹ØÓÃÀ´Çзֻòͬ²½Ïà¹ØµÄ½øÈë»òÍâ³ö ˳ÐòÁ÷¡£
²¢ÐÐÍø¹ØÓµÓÐÒ»¸ö½øÈë˳ÐòÁ÷µÄºÍ¶àÓÚÒ»¸öµÄÍâ³ö˳ÐòÁ÷ ½Ð×ö'²¢ÐÐÇзֻò 'AND-split'¡£ËùÓÐÍâ³ö˳ÐòÁ÷¶¼»á
±»²¢ÐÐʹÓá£×¢Ò⣺Ïñ¹æ·¶Öж¨ÒåµÄÄÇÑù£¬ Íâ³ö˳ÐòÁ÷ÖеÄÌõ¼þ¶¼»á±»ºöÂÔ¡£
²¢ÐÐÍø¹ØÓµÓжà¸ö½øÈë˳ÐòÁ÷ºÍÒ»¸öÍâ³ö˳ÐòÁ÷ ½Ð×ö'²¢Ðй鲢'»ò AND-join¡£ËùÓнøÈë˳ÐòÁ÷ÐèÒª
µ½´ïÕâ¸ö²¢Ðй鲢£¬ÔÚÍâÏò˳ÐòÁ÷ʹÓÃ֮ǰ¡£
²¢ÐÐÍø¹ØÏñÏÂÃæÕâÑù¶¨Ò壺
<parallelGateway id="myParallelGateway" name="My Parallel Gateway" /> |
×¢Ò⣬gatewayDirectionÊôÐÔ¿ÉÒÔ±»Ê¹Ó㬠ÒÑ»ñµÃ½¨Ä£´íÎó£¬ÔÚ½âÎö½×¶Î£¨²Î¿¼ÉÏÃæ£©¡£
ÏÂÃæµÄͼÐÎÏÔʾÁËÒ»¸ö²¢ÐÐÍø¹Ø¿ÉÒÔÈçºÎʹÓá£ÔÚÁ÷³ÌÆô¶¯ºó£¬ 'prepare
shipment' ºÍ 'bill customer'Óû§ÈÎÎñ¶¼»á±»¼¤»î¡£ ²¢ÐÐÍø¹Ø±»Ãè»æÎªÒ»¸öÁâÐΣ¬ÄÚ²¿Í¼±êÊÇÒ»¸öÊ®×Ö£¬
¶ÔÇзֺ͹鲢ÐÐΪ¶¼ÊÇÒ»Ñù¡£
ͼÐζÔÓ¦µÄXMLÈçÏÂËùʾ£º

<process id="parallelGateway" name="BPMN2 example parallel gatewar">
<startEvent id="Start" />
<sequenceFlow id="flow1" name="fromStartToSplit"
sourceRef="Start"
targetRef="parallelGatewaySplit" />
<parallelGateway id="parallelGatewaySplit"
name="Split"
gatewayDirection="diverging"/>
<sequenceFlow id="flow2a" name="Leg
1"
sourceRef="parallelGatewaySplit"
targetRef="prepareShipment" />
<userTask id="prepareShipment"
name="Prepare shipment"
implementation="other" />
<sequenceFlow id="flow2b" name="fromPrepareShipmentToJoin"
sourceRef="prepareShipment"
targetRef="parallelGatewayJoin" />
<sequenceFlow id="flow3a" name="Leg
2"
sourceRef="parallelGatewaySplit"
targetRef="billCustomer" />
<userTask id="billCustomer" name="Bill
customer"
implementation="other" />
<sequenceFlow id="flow3b" name="fromLeg2ToJoin"
sourceRef="billCustomer"
targetRef="parallelGatewayJoin" />
<parallelGateway id="parallelGatewayJoin"
name="Join"
gatewayDirection="converging"/>
<sequenceFlow id="flow4"
sourceRef="parallelGatewayJoin"
targetRef="End">
</sequenceFlow>
<endEvent id="End" name="End"
/>
</process> |
3.8.9. ÈÎÎñ
Ò»¸öÈÎÎñ±íʾ¹¤×÷ÐèÒª±»ÍⲿʵÌåÍê³É£¬ ±ÈÈçÈ˹¤»ò×Ô¶¯·þÎñ¡£
ÖØÒªµÄÊÇ×¢ÒâBPMNÓï·¨µÄ'task'ÓëjPDLÓï·¨µÄÇø±ð¡£ ÔÚjPDLÖУ¬'task'µÄ¸ÅÄî×ÜÊÇÓÃÔÚÈ˹¤×öһЩÊÂÇéµÄ»·¾³¡£
µÄÄǸöÁ÷³ÌÒýÇæÓöµ½jPDLÖеÄtask£¬Ëü»á´´½¨Ò»¸ötask£¬ ½»¸øÒ»Ð©È˵ÄÈÎÎñÁÐ±í£¬È»ºóËü»á½øÈëµÈ´ý״̬¡£È»¶øÔÚBPMN
2.0ÖУ¬ ÕâÀïÓкܶàÈÎÎñÀàÐÍ£¬Ò»Ð©±íʾµÈ´ý״̬£¨±ÈÈ磬User Task һЩ±íʾ×Ô¶¯»î¶¯£¨±ÈÈ磬Service
Task¡£ ËùÒÔСÐIJ»Òª»ìÏýÁËÈÎÎñµÄ¸ÅÄÔÚÇл»ÓïÑÔµÄʱºò¡£
ÈÎÎñ±»Ãè»æ³ÉÒ»¸öÔ²½Ç¾ØÐΣ¬Ò»°ãÄÚ²¿°üº¬ÎÄ×Ö¡£ ÈÎÎñµÄÀàÐÍ£¨Óû§ÈÎÎñ£¬·þÎñÈÎÎñ£¬½Å±¾ÈÎÎñ£¬µÈµÈ£©ÏÔʾÔÚ¾ØÐεÄ×óÉϽǣ¬ÓÃСͼ±êÇø±ð¡£
¸ù¾ÝÈÎÎñµÄÀàÐÍ£¬ ÒýÇæ»áÖ´Ðв»Í¬µÄ¹¦ÄÜ¡£
3.8.10. ÈÎÎñ£ºÈ˹¤ÈÎÎñ
user taskÊǵäÐ͵Ä'È˹¤ÈÎÎñ'£¬ ʵ¼ÊÖеÄÿ¸öworkflow»òBPMNÈí¼þÖж¼¿ÉÒÔÕÒµ½¡£µ±Á÷³ÌÖ´Ðе½´ïÕâÑùÒ»¸öuser
taskʱ£¬ Ò»¸öÐÂÈ˹¤ÈÎÎñ¾Í»á±»´´½¨£¬½»¸øÓû§µÄÈÎÎñÁÐ±í¡£
ºÍmanual taskµÄÖ÷񻂿±ðÊÇ £¨Ò²ÓëÈ˹¤¹¤×÷¶ÔÓ¦£©ÊÇÁ÷³ÌÒýÇæÁ˽âÈÎÎñ¡£
ÒýÇæ¿ÉÒÔ¸ú×Ù¾ºÕù£¬·ÖÅ䣬ʱ¼ä£¬ÆäËû£¬ÕâЩ²»ÊÇmanual taskµÄÇé¿ö¡£
user taskÃè»æÎªÒ»¸öÔ²½Ç¾ØÐΣ¬ÔÚ×óÉϽÇÊÇÒ»¸öСÓû§Í¼±ê¡£

user task±»¶¨ÒåΪÏÂÃæµÄBPMN 2.0 XML£º
<userTask id="myTask" name="My task" /> |
¸ù¾Ý¹æ·¶£¬¿ÉÒÔʹÓöàÖÖʵÏÖ£¨WebService, WS-humantask£¬µÈµÈ£©¡£
ͨ¹ýʹÓÃimplementationÊôÐÔ¡£ µ±Ç°£¬Ö»Óбê×¼µÄjBPMÈÎÎñ»úÖÆ²Å¿ÉÒÔÓã¬ËùÒÔÕâÀ»¹£©Ã»ÓÐ
¶¨Òå'implementation'ÊôÐԵŦÄÜ¡£
BPMN 2.0¹æ·¶°üº¬ÁËһЩ·½·¨°ÑÈÎÎñ·ÖÅ䏸Óû§£¬×飬½ÇÉ«µÈµÈ¡£ µ±Ç°µÄBPMN
2.0 jBPMʵÏÖÔÊÐíʹÓÃÒ»¸ö resourceAssignmentExpressionÀ´·ÖÅäÈÎÎñ£¬
½áºÏhumanPerformer or PotentialOwner½á¹¹¡£ Õⲿ·ÖÏ£ÍûÔÚδÀ´µÄ°æ±¾ÀïÄܹ»½øÒ»²½ÑÝ»¯¡£
potentialOwnerÓÃÀ´ÔÚÄãÏ£ÍûÈ·¶¨Óû§£¬×飬½ÇÉ«µÄʱºò¡£ ÕâÊÇÒ»¸ötaskµÄºòÑ¡ÈË¡£
²Î¿¼ÏÂÃæµÄÀý×Ó¡£ÕâÀïµÄ'My task'ÈÎÎñµÄºòÑ¡ÈË×éÊÇ'management'Óû§×é¡£ ҲҪעÒ⣬ÐèÒªÔÚÁ÷³ÌÍⲿ¶¨ÒåÒ»¸ö×ÊÔ´£¬
ÕâÑùÈÎÎñ·ÖÅäÆ÷¿ÉÒÔÒýÓõ½Õâ¸ö×ÊÔ´¡£ ʵ¼ÊÉÏ£¬Èκλ¶¼¿ÉÒÔÒýÓÃÒ»¸ö»ò¶à¸ö×ÊÔ´ÔªËØ¡£ Ŀǰ£¬Ö»ÐèÒª¶¨ÒåÕâ¸ö×ÊÔ´¾Í¿ÉÒÔÁË£¨ÒòΪËüÊǹ淶ÖеÄÒ»¸ö±ØÐëµÄÔªËØ£©£¬
µ«ÊÇÔÚÒÔºóµÄ·¢²¼ÖÐ»á½øÐмÓÇ¿£¨±ÈÈ磬×ÊÔ´¿ÉÒÔÓµÓÐÔËÐÐʱ²ÎÊý£©¡£
<resource id="manager" name="manager" />
<process ...>
...
<userTask id="myTask" name="My
task">
<potentialOwner resourceRef="manager"
jbpm:type="group">
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask> |
×¢Ò⣬ÎÒÃÇʹÓÃÁËÒ»¸öÌØ¶¨µÄºó׺ (jbpm:type="group")£¬À´¶¨ÒåÕâÊÇÒ»¸öÓû§×éµÄ·ÖÅ䷽ʽ¡£
Èç¹ûɾ³ýÁËÕâ¸öÊôÐÔ£¬¾Í»áĬÈÏʹÓÃÓû§×éµÄÓï·¨ £¨ÔÚÕâ¸öÀý×ÓÖÐÒ²ÊÇûÎÊÌâµÄ£©¡£ ÏÖÔÚ¼ÙÉèPeterºÍMaryÊÇmanagement×éµÄ³ÉÔ±
(ÕâÀïʹÓÃĬÈϵÄÉí·Ý·þÎñ)£º
identityService.createGroup("management");
identityService.createUser("peter",
"Peter", "Pan");
identityService.createMembership("peter",
"management");
identityService.createUser("mary",
"Mary", "Littlelamb");
identityService.createMembership("mary",
"management"); |
PeterºÍMary¶¼¿ÉÒÔÔÚËûÃǵÄÈÎÎñÁбíÖп´µ½ÕâÌõÈÎÎñ £¨´úÂëÀ´×ÔʵÀýµ¥Ôª²âÊÔ£©£º
// Peter and Mary are both part of management, so they both should see the task List<Task> tasks = taskService.findGroupTasks("peter"); assertEquals(1, tasks.size()); tasks = taskService.findGroupTasks("mary"); assertEquals(1, tasks.size());
// Mary claims the task
Task task = tasks.get(0);
taskService.takeTask(task.getId(), "mary");
assertNull(taskService.createTaskQuery().candidate("peter").uniqueResult());
taskService.completeTask(task.getId());
assertProcessInstanceEnded(processInstance); |
µ±·ÖÅ䷽ʽӦ¸ÃÊǺòÑ¡Óû§Ê±£¬ Ö»ÐèҪʹÓÃjbpm:type="user"ÊôÐÔ¡£
<userTask id="myTask" name="My User task"> <potentialOwner resourceRef="employee" jbpm:type="user"> <resourceAssignmentExpression> <formalExpression>peter</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> |
ÔÚÕâ¸öÀý×ÓÀPeter½«¿ÉÒÔ¿´µ½ÈÎÎñ£¬ÒòΪËûÊÇÕâ¸öÈÎÎñµÄºòÑ¡Óû§¡£
List<Task> tasks = taskService.createTaskQuery().candidate("peter").list(); |
human performerÓÃÀ´£¬µ±ÄãÏë°ÑÒ»¸öÈÎÎñÖ±½Ó·ÖÅä¸øÒ»¸öÈË£¬
×飬½Çɫʱ¡£Õâ¸ö·½·¨µÄʹÓ÷½Ê½ ¿´ÆðÀ´ºÍpotential ownerºÜÏñ¡£
<resource id="employee" name="employee" />
<process ...>
...
<userTask id="myTask" name="My
User task">
<humanPerformer resourceRef="employee">
<resourceAssignmentExpression>
<formalExpression>mary</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask> |
ÔÚÕâ¸öÀý×ÓÖУ¬ÈÎÎñ»áÖ±½Ó·ÖÅ䏸Mary¡£ Ëý¿ÉÒÔÔÚ×Ô¼ºµÄÈÎÎñÁбíÖп´µ½Õâ¸öÈÎÎñ£º
List<Task> tasks = taskService.findPersonalTasks("mary"); |
ÒòΪÈÎÎñ·ÖÅäÒѾÍê³É£¬Í¨¹ýʹÓà formalExpression£¬ËüÒ²¿ÉÒÔ¶¨Òå±í´ïʽ
ÔÚÔËÐÐÆÚ½âÎö¡£±í´ïʽ±¾ÉíÐèÒª·ÅÔÚ ${}ÖУ¬ÕâºÍjBPMÒ»Ñù¡£ ±ÈÈ磬Èç¹ûÁ÷³Ì±äÁ¿'user'±»¶¨ÒåÁË£¬È»ºó£¬Ëü¿ÉÒÔÓÃÔÚ±í´ïʽÖС£
µ±È»Ò²¿ÉÒÔʹÓøü¸´Ôӵıí´ïʽ¡£
<userTask id="myTask" name="My User task"> <humanPerformer resourceRef="employee"> <resourceAssignmentExpression> <formalExpression>${user}</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask> |
×¢Òâ²»ÐèÒªÔÚhumanPerformerÔªËØÖÐʹÓÃ'jbpm:type'£¬ÒòΪֻÄܽøÐÐ
Ö±½ÓÓû§·ÖÅä¡£Èç¹ûÈÎÎñÐèÒª±»·ÖÅä¸øÒ»¸ö½ÇÉ«»òÒ»¸ö×飬 ʹÓÃpotentialOwnerºÍgroupÀàÐÍ£¨µ±Äã°ÑÈÎÎñ·ÖÅä¸øÒ»¸ö×éʱ£¬
×éÖеÄËùÓгÉÔ±¶¼»á³ÉΪºòÑ¡Óû§ - ²Î¿¼potentialOwnerµÄÓ÷¨£©¡£
|