ããã«ã¡ã¯ã ããã«!
åœç€Ÿã¯ ERP ã¯ã©ã¹ã®ãœãããŠã§ã¢ ãœãªã¥ãŒã·ã§ã³ã®éçºãå°éãšããŠããŸãããã®å€§éšåã¯ãèšå€§ãªéã®ããžãã¹ ããžãã¯ãš EDMS ã«ããããã¥ã¡ã³ã ãããŒãåãããã©ã³ã¶ã¯ã·ã§ã³ ã·ã¹ãã ã«ãã£ãŠå ããããŠããŸãã åœç€Ÿè£œåã®çŸåšã®ããŒãžã§ã³ã¯ JavaEE ãã¯ãããžãŒã«åºã¥ããŠããŸããããã€ã¯ããµãŒãã¹ã®å®éšãç©æ¥µçã«è¡ã£ãŠããŸãã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã®æãåé¡ã®ããé åã® XNUMX ã€ã¯ãé£æ¥ãããã¡ã€ã³ã«å±ããããŸããŸãªãµãã·ã¹ãã ã®çµ±åã§ãã 䜿çšããã¢ãŒããã¯ã㣠ã¹ã¿ã€ã«ããã¯ãããž ã¹ã¿ãã¯ããã¬ãŒã ã¯ãŒã¯ã«é¢ä¿ãªããçµ±åã®åé¡ã¯åžžã«ç§ãã¡ã«å€§ããªé çã®çš®ãäžããŠããŸããããæè¿ã§ã¯ãã®ãããªåé¡ã®è§£æ±ºã«é²æ©ãèŠãããŸãã
ä»åã玹ä»ããèšäºã§ã¯ãNPOæ³äººã¯ãªã¹ã¿ãæå®å°åã§è¡ã£ãçµéšãšå»ºç¯ç 究ã«ã€ããŠã話ããŸãã ãŸããã¢ããªã±ãŒã·ã§ã³éçºè ã®èŠ³ç¹ããçµ±ååé¡ã«å¯Ÿããç°¡åãªè§£æ±ºçã®äŸãèŠãŠããã®ã·ã³ãã«ãã®èåŸã«äœãé ãããŠããããèŠã€ããŠãããŸãã
å 責äºé
ãã®èšäºã§èª¬æãããŠããã¢ãŒããã¯ãã£äžããã³æè¡çãªãœãªã¥ãŒã·ã§ã³ã¯ãç¹å®ã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã«ãããå人çãªçµéšã«åºã¥ããŠç§ã«ãã£ãŠææ¡ããããã®ã§ãã ãããã®ãœãªã¥ãŒã·ã§ã³ã¯æ®éçã§ãããšã¯äž»åŒµããŠããããä»ã®äœ¿çšæ¡ä»¶äžã§ã¯æé©ã§ã¯ãªãå¯èœæ§ããããŸãã
BPM ã¯ãããšäœã®é¢ä¿ãããã®ã§ãããã?
ãã®è³ªåã«çããã«ã¯ããœãªã¥ãŒã·ã§ã³ã«é©çšãããåé¡ã®è©³çŽ°ãããå°ãæ·±ãæãäžããå¿ èŠããããŸãã äžè¬çãªãã©ã³ã¶ã¯ã·ã§ã³ ã·ã¹ãã ã®ããžãã¹ ããžãã¯ã®äž»èŠéšåã¯ããŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠããŒã¿ããŒã¹ã«ããŒã¿ãå ¥åãããã®ããŒã¿ãæåããã³èªåã§æ€èšŒããã¯ãŒã¯ãããŒãéããŠå®è¡ããå¥ã®ã·ã¹ãã /åæããŒã¿ããŒã¹/ã¢ãŒã«ã€ãã«å ¬éããã¬ããŒããçæããããšã§ãã ã ãããã£ãŠã顧客ã«ãšã£ãŠã®ã·ã¹ãã ã®éèŠãªæ©èœã¯ãå éšããžãã¹ ããã»ã¹ã®èªååã§ãã
䟿å®äžãéä¿¡ã§ã¯ãããã¥ã¡ã³ãããšããçšèªããç¹å®ã®ã¯ãŒã¯ãããŒãããªã³ã¯ãã§ããå
±éã®ããŒã«ãã£ãŠçµåãããäžé£ã®ããŒã¿ãæœè±¡åãããã®ãšããŠäœ¿çšããŸãã
ããããçµ±åããžãã¯ã«ã€ããŠã¯ã©ãã§ãããã? çµå±ã®ãšãããçµ±åã¿ã¹ã¯ã¯ã·ã¹ãã ã®ã¢ãŒããã¯ãã£ã«ãã£ãŠçæããã顧客ã®èŠæ±ã«ãããã®ã§ã¯ãªãããŸã£ããç°ãªãèŠå ã®åœ±é¿äžã§éšåã«ãåå²ããããŸãã
- ã³ã³ãŠã§ã€ã®æ³åã®å¯Ÿè±¡ãšãªãã
- 以åã«ä»ã®è£œåçšã«éçºããããµãã·ã¹ãã ãåå©çšããçµæã
- éæ©èœèŠä»¶ã«åºã¥ããŠãã¢ãŒããã¯ãã®è£éã§æ±ºå®ãããŸãã
çµ±åã¢ãŒãã£ãã¡ã¯ãã§ããžãã¹ ããžãã¯ãæ±æãããªãããã«ããŠãã¢ããªã±ãŒã·ã§ã³éçºè ãã·ã¹ãã ã®ã¢ãŒããã¯ã㣠ã©ã³ãã¹ã±ãŒãã®æ©èœã詳ãã調ã¹ãå¿ èŠããªããªãããã«ãçµ±åããžãã¯ãã¡ã€ã³ ã¯ãŒã¯ãããŒã®ããžãã¹ ããžãã¯ããåé¢ããããšãã倧ããªèªæããããŸãã ãã®ã¢ãããŒãã«ã¯å€ãã®å©ç¹ããããŸãããå®è·µããŠã¿ããšå¹æããªãããšãããããŸãã
- ã¡ã€ã³ ã¯ãŒã¯ãããŒã®å®è£ ã«ã¯æ¡åŒµãã€ã³ããéãããŠãããããçµ±åã®åé¡ã解決ããã«ã¯ãéåžžãåæåŒã³åºãã®åœ¢åŒã§æãåçŽãªãªãã·ã§ã³ã«æ»ããŸã (åæçµ±åã®æ¬ ç¹ã«ã€ããŠã¯åŸè¿°ããŸã)ã
- å¥ã®ãµãã·ã¹ãã ããã®ãã£ãŒãããã¯ãå¿ èŠãªå Žåã§ããçµ±åã¢ãŒãã£ãã¡ã¯ãã¯ã³ã¢ ããžãã¹ ããžãã¯ã«äŸµå ¥ããŸãã
- ã¢ããªã±ãŒã·ã§ã³éçºè ã¯çµ±åãç¡èŠããã¯ãŒã¯ãããŒãå€æŽããããšã§ç°¡åã«çµ±åãç Žå£ã§ããŸãã
- ãŠãŒã¶ãŒã®èŠ³ç¹ããã·ã¹ãã ã¯åäžã®å šäœã§ã¯ãªããªãããµãã·ã¹ãã éã®ãç¶ãç®ããç®ç«ã€ããã«ãªããåé·ãªãŠãŒã¶ãŒæäœãçºçããŠããããµãã·ã¹ãã ããå¥ã®ãµãã·ã¹ãã ãžã®ããŒã¿è»¢éãéå§ãããŸãã
ãã XNUMX ã€ã®ã¢ãããŒãã¯ãçµ±åã€ã³ã¿ã©ã¯ã·ã§ã³ãã³ã¢ ããžãã¹ ããžãã¯ããã³ã¯ãŒã¯ãããŒã®äžå¯æ¬ ãªéšåãšããŠèæ ®ããããšã§ãã ã¢ããªã±ãŒã·ã§ã³éçºè ã®è³æ Œãæ¥å¢ããã®ãé²ãããã«ãæ°ããçµ±åã€ã³ã¿ã©ã¯ã·ã§ã³ã®äœæã¯ããœãªã¥ãŒã·ã§ã³ãéžæããæ©äŒãæå°éã«æããç°¡åãã€æ¥œã«è¡ãå¿ èŠããããŸãã ããã¯ãæã£ãŠãããããé£ããããšã§ããããŒã«ã¯ããŠãŒã¶ãŒãã足ãæããããããšãªãããã®äœ¿çšã«å¿ èŠãªããŸããŸãªãªãã·ã§ã³ãæäŸã§ããã»ã©åŒ·åã§ãªããã°ãªããŸããã ãã©ã³ã¶ã¯ã·ã§ã³å¢çãäžè²«æ§ãã¢ãããã¯æ§ãã»ãã¥ãªãã£ãã¹ã±ãŒãªã³ã°ãè² è·ãšãªãœãŒã¹ã®åæ£ãã«ãŒãã£ã³ã°ãããŒã·ã£ãªã³ã°ãã¢ããªã±ãŒã·ã§ã³éçºè ã«ã¯ããã®ãããªãã¹ãŠã®è³ªåã«å¯Ÿããçãããã§ã«é ãããŠãããããªãã·ã³ãã«ãªãœãªã¥ãŒã·ã§ã³ ãã³ãã¬ãŒããæäŸããå¿ èŠããããŸãã ãããã®ãã³ãã¬ãŒãã¯éåžžã«å®å šã§ããå¿ èŠããããŸããããžãã¹ ããžãã¯ã¯éåžžã«é »ç¹ã«å€æŽãããããããšã©ãŒãçºçãããªã¹ã¯ãå¢å ããŸãããšã©ãŒã®ã³ã¹ãã¯ããªãäœãã¬ãã«ã«ç¶æãããå¿ èŠããããŸãã
ããããBPM ã¯ãããšäœã®é¢ä¿ãããã®ã§ãããã? ã¯ãŒã¯ãããŒãå®è£
ããã«ã¯å€ãã®ãªãã·ã§ã³ããããŸã...
å®éãåœç€Ÿã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãç¶æ
é·ç§»å³ã®å®£èšçå®çŸ©ãšé·ç§»çšã®ããžãã¹ ããžãã¯ãšãã³ãã©ãŒã®æ¥ç¶ãä»ããããžãã¹ ããã»ã¹ã®å¥ã®å®è£
ãéåžžã«äººæ°ããããŸãã ãã®å Žåãããžãã¹ããã»ã¹ã«ããããææžãã®çŸåšã®äœçœ®ã決å®ããç¶æ
ã¯ããææžãèªäœã®å±æ§ãšãªããŸãã
ãããžã§ã¯ãéå§æã®ããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸã
ãã®å®è£ ã®äººæ°ã¯ãç·åœ¢ããžãã¹ ããã»ã¹ã®äœæãæ¯èŒçç°¡åã§è¿ éã§ããããã§ãã ãããããœãããŠã§ã¢ ã·ã¹ãã ãç¶ç¶çã«è€éã«ãªãã«ã€ããŠãããžãã¹ ããã»ã¹ã®èªååãããéšåãæ¡å€§ããããè€éã«ãªããŸãã ããã»ã¹ã®äžéšãå解ããŠåå©çšããã ãã§ãªããååå²ã䞊è¡ããŠå®è¡ãããããã«ããã»ã¹ãåå²ããå¿ èŠããããŸãã ãã®ãããªç¶æ³ã§ã¯ãããŒã«ã¯äžäŸ¿ã«ãªããç¶æ é·ç§»å³ã®æ å ±å 容ã倱ãããŸã (çµ±åã®çžäºäœçšãå³ã«ãŸã£ããåæ ãããŸãã)ã
èŠä»¶ã®æ確åãæ°åç¹°ãè¿ããåŸã®ããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
ãã®ç¶æ³ãæéããæ¹æ³ã¯ãšã³ãžã³ã®çµ±åã§ãã
è€éãªããžãã¹ããã»ã¹ã®ã»ãã®äžéš
é·æçã«ã¯ããã®ãœãªã¥ãŒã·ã§ã³ã¯æåŸ ã«å¿ããããŸããã§ãããããžã¥ã¢ã« ããŒã«ã䜿çšããŠããžãã¹ ããã»ã¹ãäœæããéã®åŽåéçŽåºŠãé«ãããã蚱容å¯èœãªçç£æ§ææšãéæã§ãããããŒã«èªäœãéçºè ã®éã§æãå«ãããããŒã«ã® XNUMX ã€ã«ãªããŸããã ãšã³ãžã³ã®å éšæ§é ã«é¢ããèŠæ ããããå€ãã®ãããããããæŸèæããåºçŸããŸããã
jBPM ã䜿çšããããšã®äž»ãªããžãã£ããªåŽé¢ã¯ãããžãã¹ ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ç¬èªã®æ°žç¶çãªç¶æ ãæã€ããšã®ã¡ãªãããšãã¡ãªãããèªèã§ããããã«ãªã£ãããšã§ããã ãŸããããã»ã¹ ã¢ãããŒãã䜿çšããŠãä¿¡å·ãã¡ãã»ãŒãžãä»ããéåæ察話ã䜿çšããŠãç°ãªãã¢ããªã±ãŒã·ã§ã³éã®è€éãªçµ±åãããã³ã«ãå®è£ ã§ããå¯èœæ§ã確èªããŸããã ããã«ã¯ãæ°žç¶çãªç¶æ ã®ååšãéèŠãªåœ¹å²ãæãããŸãã
äžèšã«åºã¥ããŠã次ã®ããã«çµè«ä»ããããšãã§ããŸãã BPM ã¹ã¿ã€ã«ã®ããã»ã¹ ã¢ãããŒãã«ãããå¹ åºãã¿ã¹ã¯ã解決ããŠããŸããŸãè€éåããããžãã¹ ããã»ã¹ãèªååããçµ±åã¢ã¯ãã£ããã£ããããã®ããã»ã¹ã«èª¿åããŠé©åãããå®è£ ãããããã»ã¹ãé©åãªè¡šèšæ³ã§èŠèŠçã«è¡šç€ºããæ©èœãç¶æããããšãã§ããŸãã
çµ±åãã¿ãŒã³ãšããŠã®åæåŒã³åºãã®æ¬ ç¹
åæçµ±åãšã¯ãæãåçŽãªããããã³ã°åŒã³åºããæããŸãã XNUMX ã€ã®ãµãã·ã¹ãã ã¯ãµãŒããŒåŽãšããŠæ©èœããå¿ èŠãªã¡ãœããã䜿çšã㊠API ãå ¬éããŸãã å¥ã®ãµãã·ã¹ãã ãã¯ã©ã€ã¢ã³ãåŽãšããŠæ©èœããé©åãªã¿ã€ãã³ã°ã§åŒã³åºããè¡ã£ãŠçµæãåŸ ã¡ãŸãã ã·ã¹ãã ã¢ãŒããã¯ãã£ã«å¿ããŠãã¯ã©ã€ã¢ã³ãåŽãšãµãŒããŒåŽã¯åãã¢ããªã±ãŒã·ã§ã³ããã³ããã»ã¹ã«é 眮ããããšããç°ãªãã¢ããªã±ãŒã·ã§ã³ããã³ããã»ã¹ã«é 眮ããããšãã§ããŸãã XNUMX çªç®ã®ã±ãŒã¹ã§ã¯ãRPC å®è£ ãé©çšãããã©ã¡ãŒã¿ãšåŒã³åºãçµæã®ããŒã·ã£ãªã³ã°ãæäŸããå¿ èŠããããŸãã
ãã®çµ±åãã¿ãŒã³ã«ã¯ããªãå€ãã®æ¬ ç¹ããããŸããããã®åçŽãã®ããå®éã«ã¯éåžžã«åºã䜿çšãããŠããŸãã å®è£ ã®éãã«é äºãããå·®ãè¿«ã£ãç· ãåãã«çŽé¢ããŠäœåºŠãäœåºŠã䜿çšããããåŸãªããªãããœãªã¥ãŒã·ã§ã³ãæè¡çè² åµãšããŠèšé²ãããŸãã ããããçµéšã®æµ ãéçºè ããåã«æªåœ±é¿ã«æ°ã¥ããŠããªãã ãã§ãç¡æèã«ããã䜿çšããŠããŸãããšãèµ·ãããŸãã
ãµãã·ã¹ãã ã®æ¥ç¶æ§ã®æãæãããªå¢å ã«å ããŠããã©ã³ã¶ã¯ã·ã§ã³ã®ãæ¡å€§ãããã³ãæ¡åŒµãã«é¢ããããã»ã©æããã§ã¯ãªãåé¡ããããŸãã å®éãããžãã¹ ããžãã¯ã«äœããã®å€æŽãå ããããå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯åé¿ã§ããããã®çµæããã©ã³ã¶ã¯ã·ã§ã³ã¯ããããã®å€æŽã®åœ±é¿ãåããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ ãªãœãŒã¹ããããã¯ããŸãã ã€ãŸããäžæ¹ã®ãµãã·ã¹ãã ãä»æ¹ã®ãµãã·ã¹ãã ããã®å¿çãåŸ ã€ãŸã§ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŠããã¯ã解é€ããããšã¯ã§ããŸããã ããã«ãããããŸããŸãªåœ±é¿ãçãããªã¹ã¯ãå€§å¹ ã«å¢å ããŸãã
- ã·ã¹ãã ã®å¿çæ§ã倱ããããŠãŒã¶ãŒã¯ãªã¯ãšã¹ãã«å¯Ÿããå¿çãé·æéåŸ ã€ããšã«ãªããŸãã
- éåžžããµãŒããŒã¯ã¹ã¬ãã ããŒã«ãéå¯ã§ããããã«ãŠãŒã¶ãŒ ãªã¯ãšã¹ããžã®å¿çãåæ¢ããŸããã¹ã¬ããã®å€§éšåã¯ããã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠå æãããŠãããªãœãŒã¹ã«ããã¯ãããŠããŸãã
- ãããããã¯ãçºçãå§ããŸãããããããã¯ãçºçããå¯èœæ§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®æéããã©ã³ã¶ã¯ã·ã§ã³ã«å«ãŸããããžãã¹ ããžãã¯ããã³ããã¯ã®éã«å€§ããäŸåããŸãã
- ãã©ã³ã¶ã¯ã·ã§ã³ã¿ã€ã ã¢ãŠããšã©ãŒã衚瀺ãããŸãã
- ã¿ã¹ã¯ã§å€§éã®ããŒã¿ã®åŠçãšå€æŽãå¿ èŠãªå ŽåããµãŒããŒã¯ OutOfMemory ã§ã倱æãããŸãããŸããåæçµ±åã®ååšã«ãããåŠçãã軜ãããã©ã³ã¶ã¯ã·ã§ã³ã«åå²ããããšãéåžžã«å°é£ã«ãªããŸãã
ã¢ãŒããã¯ãã£ã®èŠ³ç¹ããèŠããšãçµ±åäžã«ãããã¯åŒã³åºãã䜿çšãããšãåã ã®ãµãã·ã¹ãã ã®å質ã«å¯Ÿããå¶åŸ¡ã倱ãããŸãããããµãã·ã¹ãã ã®ç®æšå質ææšããå¥ã®ãµãã·ã¹ãã ã®å質ææšããåãé¢ããŠç¢ºä¿ããããšã¯äžå¯èœã§ãã ãµãã·ã¹ãã ãç°ãªãããŒã ã«ãã£ãŠéçºãããŠããå Žåãããã¯å€§ããªåé¡ã«ãªããŸãã
çµ±åãããŠãããµãã·ã¹ãã ãç°ãªãã¢ããªã±ãŒã·ã§ã³ã«ãããäž¡æ¹ã®åŽã§åæçãªå€æŽãè¡ãå¿ èŠãããå Žåãç¶æ³ã¯ããã«èå³æ·±ããã®ã«ãªããŸãã ãããã®å€æŽã®ãã©ã³ã¶ã¯ã·ã§ã³æ§ã確ä¿ããã«ã¯ã©ãããã°ããã§ãããã?
å€æŽãåå¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§è¡ãããå Žåã¯ãä¿¡é Œæ§ã®é«ãäŸå€åŠçãšè£åãæäŸããå¿ èŠããããããã«ãããåæçµ±åã®äž»ãªå©ç¹ã§ããã·ã³ãã«ããå®å šã«å€±ãããŸãã
åæ£ãã©ã³ã¶ã¯ã·ã§ã³ãæãæµ®ãã³ãŸãããä¿¡é Œæ§ã確ä¿ããã®ãé£ãããããç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯åæ£ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŸããã
ãã©ã³ã¶ã¯ã·ã§ã³åé¡ã®è§£æ±ºçãšããŠã®ãSagaã
ãã€ã¯ããµãŒãã¹ã®äººæ°ãé«ãŸãã«ã€ãã
ãã®ãã¿ãŒã³ã¯ãåè¿°ã®é·ããã©ã³ã¶ã¯ã·ã§ã³ã®åé¡ãå®å šã«è§£æ±ºããããžãã¹ ããžãã¯ã®åŽããã·ã¹ãã ã®ç¶æ ã管çããæ©èœãæ¡åŒµããŸãããã©ã³ã¶ã¯ã·ã§ã³ã倱æããåŸã®è£åã¯ãã·ã¹ãã ãå ã®ç¶æ ã«ããŒã«ããã¯ããããšã¯ã§ããŸãããã次ã®ãããªæ©èœãæäŸããŸãã代æ¿ã®ããŒã¿åŠçã«ãŒãã ããã«ãããããã»ã¹ããè¯å¥œãªãçµäºã«ããããšãããšãã«ãæ£åžžã«å®äºããããŒã¿åŠçã¹ããããç¹°ãè¿ãããšãé¿ããããšãã§ããŸãã
èå³æ·±ãããšã«ãã¢ããªã·ã㯠ã·ã¹ãã ã§ã¯ããã®ãã¿ãŒã³ã¯ççµåãµãã·ã¹ãã ã®çµ±åã«ãé¢é£ããŠãããé·æéå®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ãšããã«å¯Ÿå¿ãããªãœãŒã¹ ããã¯ã«ãã£ãŠåŒãèµ·ããããæªåœ±é¿ã芳å¯ãããŸãã
BPM ã¹ã¿ã€ã«ã®ããžãã¹ ããã»ã¹ã«é¢ããŠããSagaãã®å®è£ ã¯éåžžã«ç°¡åã§ããããšãããããŸããããSagaãã®åã ã®ã¹ãããã¯ããžãã¹ ããã»ã¹å ã®ã¢ã¯ãã£ããã£ãšããŠæå®ã§ããããžãã¹ ããã»ã¹ã®æ°žç¶çãªç¶æ ãæå®ã§ããŸãã ãSagaãã®å éšç¶æ ã決å®ããŸãã ã€ãŸããè¿œå ã®èª¿æŽã¡ã«ããºã ã¯å¿ èŠãããŸããã å¿ èŠãªã®ã¯ããã©ã³ã¹ããŒããšããŠãå°ãªããšã XNUMX åãã®ä¿èšŒããµããŒãããã¡ãã»ãŒãž ãããŒã«ãŒã ãã§ãã
ãã ãããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ç¬èªã®ã代åãããããŸãã
- ããžãã¹ ããžãã¯ã¯ããè€éã«ãªããŸããè£åãæ€èšããå¿ èŠããããŸãã
- å®å šãªäžè²«æ§ãæŸæ£ããå¿ èŠããããŸãããããã¯ã¢ããªã·ã㯠ã·ã¹ãã ã§ã¯ç¹ã«æ³šæãå¿ èŠã§ãã
- ã¢ãŒããã¯ãã£ã¯ããå°ãè€éã«ãªããã¡ãã»ãŒãž ãããŒã«ãŒãããã«å¿ èŠã«ãªããŸãã
- è¿œå ã®ç£èŠããã³ç®¡çããŒã«ãå¿ èŠã«ãªããŸã (ãã ããäžè¬çã«ã¯ããã¯è¯ãããšã§ãããã·ã¹ãã ãµãŒãã¹ã®å質ãåäžããŸã)ã
ã¢ããªã·ã㯠ã·ã¹ãã ã®å Žåãããµã°ãã䜿çšããæ£åœãªçç±ã¯ããã»ã©æçœã§ã¯ãããŸããã ãã€ã¯ããµãŒãã¹ããã®ä»ã® SOA ã§ã¯ããããŒã«ãŒããã§ã«ååšãããããžã§ã¯ãã®éå§æã«å®å šãªäžè²«æ§ãç ç²ã«ãªãå¯èœæ§ãé«ããç¹ã«ããžãã¹ ããžãã¯ã«äŸ¿å©ãª API ãããå Žåããã®ãã¿ãŒã³ã䜿çšããå©ç¹ãæ¬ ç¹ãå€§å¹ ã«äžåãå¯èœæ§ããããŸããã¬ãã«ã
ããžãã¹ ããžãã¯ããã€ã¯ããµãŒãã¹ã«ã«ãã»ã«åãã
ãã€ã¯ããµãŒãã¹ã®å®éšãéå§ãããšããåœç¶ã®çåãçããŸããããã¡ã€ã³ ããŒã¿ã®æ°žç¶æ§ãä¿èšŒãããµãŒãã¹ã«é¢é£ããŠããã¡ã€ã³ ããžãã¹ ããžãã¯ãã©ãã«é 眮ããããšããããšã§ãã
ããŸããŸãª BPMS ã®ã¢ãŒããã¯ãã£ãèŠããšãããžãã¹ ããžãã¯ãæ°žç¶æ§ããåé¢ããã®ãåççã§ããããã«æãããããããŸããããã¡ã€ã³ ããžãã¹ ããžãã¯ãå®è¡ããããã®ç°å¢ãšã³ã³ãããŒã圢æãããã©ãããã©ãŒã ãšãã¡ã€ã³ã«äŸåããªããã€ã¯ããµãŒãã¹ã®å±€ãäœæãããã¡ã€ã³ ããŒã¿ã®æ°žç¶æ§ã次ã®ããã«èšèšããŸããéåžžã«ã·ã³ãã«ã§è»œéãªãã€ã¯ããµãŒãã¹ã®å¥åã®ã¬ã€ã€ãŒã ãã®å Žåã®ããžãã¹ ããã»ã¹ã¯ãæ°žç¶å±€ã®ãµãŒãã¹ã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãå®è¡ããŸãã
ãã®ã¢ãããŒãã«ã¯éåžžã«å€§ããªå©ç¹ããããŸãããã©ãããã©ãŒã ã®æ©èœã奜ããªã ãå¢ããããšãã§ãããã©ãããã©ãŒã ãã€ã¯ããµãŒãã¹ã®å¯Ÿå¿ããã¬ã€ã€ãŒã®ã¿ãä»åŸãè¥å€§åãããŸãã ãã©ãããã©ãŒã ã®æ°æ©èœãæŽæ°ããããšãã©ã®ãã¡ã€ã³ã®ããžãã¹ ããã»ã¹ã§ãããã«äœ¿çšã§ããããã«ãªããŸãã
ãã詳现ãªèª¿æ»ã«ããããã®ã¢ãããŒãã®é倧ãªæ¬ ç¹ãæããã«ãªããŸããã
- å€ãã®ãã¡ã€ã³ã®ããžãã¹ ããžãã¯ãäžåºŠã«å®è¡ãããã©ãããã©ãŒã ãµãŒãã¹ã¯ãåäžé害ç¹ãšããŠå€§ããªãªã¹ã¯ã䌎ããŸãã ããžãã¹ ããžãã¯ãé »ç¹ã«å€æŽãããšãã·ã¹ãã å šäœã®é害ã«ã€ãªãããšã©ãŒã®ãªã¹ã¯ãé«ãŸããŸãã
- ããã©ãŒãã³ã¹ã®åé¡: ããžãã¹ ããžãã¯ã¯ãçããŠé
ãã€ã³ã¿ãŒãã§ã€ã¹ãéããŠããŒã¿ãåŠçããŸãã
- ããŒã¿ã¯åã³ããŒã·ã£ãªã³ã°ããããããã¯ãŒã¯ ã¹ã¿ãã¯ãéããŠéãããŸãã
- ãã¡ã€ã³ ãµãŒãã¹ã¯ããµãŒãã¹ã®å€éš API ã¬ãã«ã§ãªã¯ãšã¹ãããã©ã¡ãŒã¿åããæ©èœãäžååãªãããããžãã¹ ããžãã¯ã®åŠçã«å¿ èŠãªããŒã¿ãããå€ãã®ããŒã¿ãæäŸããããšããããããŸãã
- ããžãã¹ ããžãã¯ã®ããã€ãã®ç¬ç«ããéšåã¯ãåŠçã®ããã«åãããŒã¿ãç¹°ãè¿ãåèŠæ±ããå¯èœæ§ããããŸã (ãã®åé¡ã¯ãããŒã¿ããã£ãã·ã¥ããã»ãã·ã§ã³ ã³ã³ããŒãã³ããè¿œå ããããšã§è»œæžã§ããŸãããããã«ããã¢ãŒããã¯ãã£ãããã«è€éã«ãªããããŒã¿ã®é¢é£æ§ãšãã£ãã·ã¥ã®ç¡å¹åã®åé¡ãçºçããŸã)ã
- ãã©ã³ã¶ã¯ã·ã§ã³ã®åé¡:
- ãã©ãããã©ãŒã ãµãŒãã¹ã«ãã£ãŠä¿åãããæ°žç¶çãªç¶æ ãæã€ããžãã¹ ããã»ã¹ã¯ãã¡ã€ã³ ããŒã¿ãšççŸããŠããããã®åé¡ã解決ããç°¡åãªæ¹æ³ã¯ãããŸããã
- ãã¡ã€ã³ ããŒã¿ ãããã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®å€éšã«é 眮ãã: çŸåšã®ããŒã¿ã®æ£ç¢ºæ§ãæåã«ç¢ºèªããåŸã§ãã¡ã€ã³ ããžãã¹ ããžãã¯ãå€æŽããå¿ èŠãããå Žåã¯ãåŠçãããããŒã¿ã«ç«¶åããå€æŽãçºçããå¯èœæ§ãæé€ããå¿ èŠããããŸãã å€éšããŒã¿ã®ãããã¯ã¯åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸããããã®ãããªè§£æ±ºçã«ã¯ãããªããªã¹ã¯ã䌎ããã·ã¹ãã å šäœã®ä¿¡é Œæ§ãäœäžããŸãã
- æŽæ°æã®è¿œå ã®åé¡: å Žåã«ãã£ãŠã¯ãæ°žç¶åãµãŒãã¹ãšããžãã¹ ããžãã¯ãåæçã«ããŸãã¯å³å¯ãªé åºã§æŽæ°ããå¿ èŠããããŸãã
æçµçã«ã¯ããã¡ã€ã³ ããŒã¿ãšãã¡ã€ã³ ããžãã¹ ããžãã¯ã XNUMX ã€ã®ãã€ã¯ããµãŒãã¹ã«ã«ãã»ã«åãããšããåºæ¬ã«ç«ã¡è¿ãå¿ èŠããããŸããã ãã®ã¢ãããŒãã¯ããã€ã¯ããµãŒãã¹ãã·ã¹ãã ã®äžå¯æ¬ ãªã³ã³ããŒãã³ããšããŠèªèããããšãç°¡çŽ åããäžèšã®åé¡ãåŒãèµ·ãããŸããã ãããç¡æã§ã¯æäŸãããŸããã
- API æšæºåã¯ãããžãã¹ ããžã㯠(ç¹ã«ãããžãã¹ ããã»ã¹ã®äžéšãšããŠãŠãŒã¶ãŒ ã¢ã¯ãã£ããã£ãæäŸãã) ããã³ API ãã©ãããã©ãŒã ãµãŒãã¹ãšã®å¯Ÿè©±ã«å¿ èŠã§ãã API ã®å€æŽãäžäœäºææ§ããã³äžäœäºææ§ã«ã€ããŠã¯ããã现å¿ã®æ³šæãæãå¿ èŠããããŸãã
- ãã®ãããªåãã€ã¯ããµãŒãã¹ã®äžéšãšããŠããžãã¹ ããžãã¯ã確å®ã«æ©èœããããã«ããã«ã¯ãã©ã³ã¿ã€ã ã©ã€ãã©ãªãè¿œå ããå¿ èŠããããŸããããã«ããããã®ãããªã©ã€ãã©ãªã«å¯Ÿããæ°ããèŠä»¶ãçããŸãã軜éæ§ãšæšç§»çãªäŸåé¢ä¿ãæå°éã§ããããšã
- ããžãã¹ ããžãã¯éçºè ã¯ã©ã€ãã©ãªã®ããŒãžã§ã³ãç£èŠããå¿ èŠããããŸãããã€ã¯ããµãŒãã¹ãé·æéå®æããŠããªãå Žåãå€ãããŒãžã§ã³ã®ã©ã€ãã©ãªãå«ãŸããŠããå¯èœæ§ãé«ããªããŸãã ããã¯ãæ°ããæ©èœãè¿œå ããéã®äºæãã¬é害ãšãªãå¯èœæ§ããããããŒãžã§ã³éã«äºææ§ã®ãªãå€æŽããã£ãå Žåã«ã¯ããã®ãããªãµãŒãã¹ã®å€ãããžãã¹ ããžãã¯ãã©ã€ãã©ãªã®æ°ããããŒãžã§ã³ã«ç§»è¡ããããšãå¿ èŠã«ãªãå ŽåããããŸãã
ãã®ãããªã¢ãŒããã¯ãã£ã«ã¯ãã©ãããã©ãŒã ãµãŒãã¹ã®å±€ãååšããŸããããã®å±€ã¯ãã¡ã€ã³ ããžãã¹ ããžãã¯ãå®è¡ããããã®ã³ã³ããã圢æããããã®ç°å¢ã®ã¿ã圢æããè£å©çãªããã©ãããã©ãŒã ãæ©èœãæäŸããŸãã ãã®ãããªã¬ã€ã€ãŒã¯ããã¡ã€ã³ ãã€ã¯ããµãŒãã¹ã®è»œéæ§ãç¶æããããã ãã§ãªãã管çãäžå åããããã«ãå¿ èŠã§ãã
ããšãã°ãããžãã¹ ããã»ã¹å ã®ãŠãŒã¶ãŒ ã¢ã¯ãã£ããã£ã«ãã£ãŠã¿ã¹ã¯ãçæãããŸãã ãã ããã¿ã¹ã¯ãæäœããå ŽåããŠãŒã¶ãŒã¯äžè¬ãªã¹ãå ã®ãã¹ãŠã®ãã¡ã€ã³ã®ã¿ã¹ã¯ã衚瀺ããå¿ èŠããããŸããããã¯ããã¡ã€ã³ ããžãã¹ ããžãã¯ãæé€ããã察å¿ãããã©ãããã©ãŒã ã¿ã¹ã¯ç»é²ãµãŒãã¹ãå¿ èŠã§ããããšãæå³ããŸãã ãã®ãããªã³ã³ããã¹ãã§ããžãã¹ ããžãã¯ã®ã«ãã»ã«åãç¶æããããšã¯éåžžã«åé¡ããããããããã®ã¢ãŒããã¯ãã£ã®åŠ¥åç¹ã§ãã
ã¢ããªã±ãŒã·ã§ã³éçºè ã®èŠç¹ããèŠãããžãã¹ããã»ã¹ã®çµ±å
äžã§è¿°ã¹ãããã«ãã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãåªããéçºçç£æ§ãæåŸ ã§ããããã«ãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã®çžäºäœçšãå®è£ ããæè¡çããã³ãšã³ãžãã¢ãªã³ã°çæ©èœããæœè±¡åããå¿ èŠããããŸãã
ãã®èšäºã®ããã«ç¹å¥ã«èæ¡ããããããªãé£ããç©ååé¡ã解ããŠã¿ãŸãããã ãã㯠1 ã€ã®ã¢ããªã±ãŒã·ã§ã³ãå«ããã²ãŒã ãã¿ã¹ã¯ãšãªãããããããç¹å®ã®ãã¡ã€ã³åãapp2ãããapp3ãããappXNUMXããå®çŸ©ããŸãã
åã¢ããªã±ãŒã·ã§ã³å ã§ããžãã¹ ããã»ã¹ãèµ·åãããçµ±åãã¹ãéããŠãããŒã«éã³ããå§ãŸããŸãã ãBallããšããååã®ã¡ãã»ãŒãžã¯ããŒã«ãšããŠæ©èœããŸãã
ã²ãŒã ã®ã«ãŒã«ïŒ
- æåã®ãã¬ã€ã€ãŒãã€ãã·ãšãŒã¿ãŒã§ãã 圌ã¯ä»ã®ãã¬ã€ã€ãŒãã²ãŒã ã«æåŸ ããã²ãŒã ãéå§ãããã€ã§ãçµäºã§ããŸãã
- ä»ã®ãã¬ã€ã€ãŒã¯ã²ãŒã ãžã®åå ã宣èšãããäºããšæåã®ãã¬ã€ã€ãŒããç¥ããŸããã
- ããŒã«ãåãåã£ãåŸããã¬ãŒã€ãŒã¯ä»ã®åå ãã¬ãŒã€ãŒãéžæãããã®ãã¬ãŒã€ãŒã«ããŒã«ãæž¡ããŸãã éä¿¡ã®ç·æ°ãã«ãŠã³ããããŸãã
- åãã¬ãŒã€ãŒã¯ããšãã«ã®ãŒããæã£ãŠããããã®ãã¬ãŒã€ãŒãããŒã«ããã¹ãããã³ã«æžå°ããŸãã ãšãã«ã®ãŒãå°œãããšããã¬ã€ã€ãŒã¯èŸä»»ãè¡šæããŠã²ãŒã ããé¢ããŸãã
- ãã¬ãŒã€ãŒãäžäººã«ãªã£ãå Žåããã¬ãŒã€ãŒã¯ããã«éå Žã宣èšããŸãã
- ãã¹ãŠã®ãã¬ã€ã€ãŒãè±èœãããšãæåã®ãã¬ã€ã€ãŒãã²ãŒã çµäºã宣èšããŸãã 圌ãæ©æã«ã²ãŒã ãçµäºããå Žåã圌ã¯ã²ãŒã ãå®äºããããã«æ®ããŸãã
ãã®åé¡ã解決ããããã«ãããžãã¹ ããã»ã¹ã« DSL ã䜿çšããŸããããã«ãããæå°éã®å®åæ㧠Kotlin ã®ããžãã¯ãã³ã³ãã¯ãã«èšè¿°ããããšãã§ããŸãã
æåã®ãã¬ãŒã€ãŒ (å¥åãã²ãŒã ã®éå§è ) ã®ããžãã¹ ããã»ã¹ã¯ãapp1 ã¢ããªã±ãŒã·ã§ã³ã§åäœããŸãã
ã¯ã©ã¹InitialPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList : ArrayList<PlayerInfo>()
// ÐÑП клаÑÑ ÑкзеЌплÑÑа пÑПÑеÑÑа: ОМкапÑÑлОÑÑÐµÑ ÐµÐ³ÐŸ вМÑÑÑеММее ÑПÑÑПÑМОе
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
var playerName: String by persistent("Player1")
var energy: Int by persistent(30)
var players: PlayersList by persistent(PlayersList())
var shotCounter: Int = 0
}
// ÐÑП ЎеклаÑаÑÐžÑ ÐŒÐŸÐŽÐµÐ»Ðž пÑПÑеÑÑа: ÑПзЎаеÑÑÑ ÐŸÐŽÐžÐœ Ñаз, ОÑпПлÑзÑеÑÑÑ Ð²ÑеЌО
// ÑкзеЌплÑÑаЌО пÑПÑеÑÑа ÑППÑвеÑÑÑвÑÑÑегП клаÑÑа
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
version = 1) {
// ÐП пÑавОлаЌ, пеÑвÑй ОгÑПк ÑвлÑеÑÑÑ ÐžÐœÐžÑОаÑПÑПЌ ОгÑÑ Ðž ЎПлжеМ бÑÑÑ ÐµÐŽÐžÐœÑÑвеММÑÐŒ
uniqueConstraint = UniqueConstraints.singleton
// ÐбÑÑвлÑеЌ акÑОвМПÑÑО, Оз кПÑПÑÑÑ
ÑПÑÑÐŸÐžÑ Ð±ÐžÐ·ÐœÐµÑ-пÑПÑеÑÑ
val sendNewGameSignal = signal<String>("NewGame")
val sendStopGameSignal = signal<String>("StopGame")
val startTask = humanTask("Start") {
taskOperation {
processCondition { players.size > 0 }
confirmation { "ÐПЎклÑÑОлПÑÑ ${players.size} ОгÑПкПв. ÐаÑОМаеЌ?" }
}
}
val stopTask = humanTask("Stop") {
taskOperation {}
}
val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
println("... join player ${signal.data} ...")
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
println("... player ${signal.data} is out ...")
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val throwStartBall = messageSend<Int>("Ball") {
messageData = { 1 }
activation = { selectNextPlayer() }
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
// ТепеÑÑ ÐºÐŸÐœÑÑÑÑОÑÑеЌ гÑÐ°Ñ Ð¿ÑПÑеÑÑа Оз ПбÑÑвлеММÑÑ
акÑОвМПÑÑей
startFrom(sendNewGameSignal)
.fork("mainFork") {
next(startTask)
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut)
.branch("checkPlayers") {
ifTrue { players.isEmpty() }
.next(sendStopGameSignal)
.terminate()
ifElse().next(waitPlayerOut)
}
}
startTask.fork("afterStart") {
next(throwStartBall)
.branch("mainLoop") {
ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
ifElse().next(waitBall).next(throwBall).loop()
}
next(stopTask).next(sendStopGameSignal)
}
// ÐавеÑаеЌ Ма акÑОвМПÑÑО ЎПпПлМОÑелÑÐœÑе ПбÑабПÑÑОкО ÐŽÐ»Ñ Ð»ÐŸÐ³ÐžÑПваМОÑ
sendNewGameSignal.onExit { println("Let's play!") }
sendStopGameSignal.onExit { println("Stop!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
val player = process.players.random()
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
ããžãã¹ ããžãã¯ã®å®è¡ã«å ããŠãäžèšã®ã³ãŒãã¯ãå³ã®åœ¢åŒã§èŠèŠåã§ããããžãã¹ ããã»ã¹ã®ãªããžã§ã¯ã ã¢ãã«ãçæã§ããŸãã ããžã¥ã¢ã©ã€ã¶ãŒããŸã å®è£ ããŠããªããããæç»ã«å°ãæéãè²»ããå¿ èŠããããŸãã (ããã§ã¯ãå³ãšä»¥äžã®ã³ãŒãã®äžè²«æ§ãé«ããããã«ãã²ãŒãã®äœ¿çšã«é¢ãã BPMN è¡šèšãå°ãç°¡ç¥åããŸãã)ã
app2 ã«ã¯ãä»ã®ãã¬ãŒã€ãŒã®ããžãã¹ ããã»ã¹ãå«ãŸããŸãã
ã¯ã©ã¹RandomPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList: ArrayList<PlayerInfo>()
class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {
var playerName: String by input(persistent = true,
defaultValue = "RandomPlayer")
var energy: Int by input(persistent = true, defaultValue = 30)
var players: PlayersList by persistent(PlayersList())
var allPlayersOut: Boolean by persistent(false)
var shotCounter: Int = 0
val selfPlayer: PlayerInfo
get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}
val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer",
version = 1) {
val waitNewGameSignal = signalWait<String>("NewGame")
val waitStopGameSignal = signalWait<String>("StopGame")
val sendPlayerJoin = signal<String>("PlayerJoin") {
signalData = { playerName }
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
eventCondition = { signal ->
signal.sender.processInstanceId != process.id
&& !process.players.any { signal.sender.processInstanceId == it.id}
}
handler = { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
}
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
allPlayersOut = players.isEmpty()
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val receiveHandshake = messageWait<String>("Handshake") { message ->
if (!players.any { message.sender.processInstanceId == it.id}) {
players.add(PlayerInfo(
message.data!!,
message.sender.domain,
message.sender.processInstanceId))
}
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
startFrom(waitNewGameSignal)
.fork("mainFork") {
next(sendPlayerJoin)
.branch("mainLoop") {
ifTrue { energy < 5 || allPlayersOut }
.next(sendPlayerOut)
.next(waitBall)
ifElse()
.next(waitBall)
.next(throwBall)
.loop()
}
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut).next(waitPlayerOut)
next(receiveHandshake).next(receiveHandshake)
next(waitStopGameSignal).terminate()
}
sendPlayerJoin.onExit { println("$playerName: I'm here!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
val player = if (process.players.isNotEmpty())
process.players.random()
else
process.selfPlayer
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
å³ïŒ
app3 ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå°ãç°ãªãåäœãæã€ãã¬ãŒã€ãŒãäœæããŸãã次ã®ãã¬ãŒã€ãŒãã©ã³ãã ã«éžæãã代ããã«ãã©ãŠã³ãããã³ ã¢ã«ãŽãªãºã ã«åŸã£ãŠåäœããŸãã
ã¯ã©ã¹RoundRobinPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList: ArrayList<PlayerInfo>()
class RoundRobinPlayer : ProcessImpl<RoundRobinPlayer>(roundRobinPlayerModel) {
var playerName: String by input(persistent = true,
defaultValue = "RoundRobinPlayer")
var energy: Int by input(persistent = true, defaultValue = 30)
var players: PlayersList by persistent(PlayersList())
var nextPlayerIndex: Int by persistent(-1)
var allPlayersOut: Boolean by persistent(false)
var shotCounter: Int = 0
val selfPlayer: PlayerInfo
get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}
val roundRobinPlayerModel = processModel<RoundRobinPlayer>(
name = "RoundRobinPlayer",
version = 1) {
val waitNewGameSignal = signalWait<String>("NewGame")
val waitStopGameSignal = signalWait<String>("StopGame")
val sendPlayerJoin = signal<String>("PlayerJoin") {
signalData = { playerName }
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
eventCondition = { signal ->
signal.sender.processInstanceId != process.id
&& !process.players.any { signal.sender.processInstanceId == it.id}
}
handler = { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
}
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
allPlayersOut = players.isEmpty()
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val receiveHandshake = messageWait<String>("Handshake") { message ->
if (!players.any { message.sender.processInstanceId == it.id}) {
players.add(PlayerInfo(
message.data!!,
message.sender.domain,
message.sender.processInstanceId))
}
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
startFrom(waitNewGameSignal)
.fork("mainFork") {
next(sendPlayerJoin)
.branch("mainLoop") {
ifTrue { energy < 5 || allPlayersOut }
.next(sendPlayerOut)
.next(waitBall)
ifElse()
.next(waitBall)
.next(throwBall)
.loop()
}
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut).next(waitPlayerOut)
next(receiveHandshake).next(receiveHandshake)
next(waitStopGameSignal).terminate()
}
sendPlayerJoin.onExit { println("$playerName: I'm here!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<RoundRobinPlayer, Int>.selectNextPlayer() {
var idx = process.nextPlayerIndex + 1
if (idx >= process.players.size) {
idx = 0
}
process.nextPlayerIndex = idx
val player = if (process.players.isNotEmpty())
process.players[idx]
else
process.selfPlayer
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
ãã以å€ã®å Žåããã¬ã€ã€ãŒã®è¡åã¯ååãšå€ãããªããããå³ã¯å€ãããŸããã
ããã§ãããããã¹ãŠãå®è¡ããããã®ãã¹ããå¿ èŠã§ãã å®åæã§èšäºãä¹±éã«ãªããªãããã«ããã¹ãèªäœã®ã³ãŒãã®ã¿ã瀺ããŸã (å®éãä»ã®ããžãã¹ ããã»ã¹ã®çµ±åããã¹ãããããã«ä»¥åã«äœæãããã¹ãç°å¢ã䜿çšããŸãã)ã
ãã¹ãã²ãŒã ()
@Test
public void testGame() throws InterruptedException {
String pl2 = startProcess(app2, "RandomPlayer", playerParams("Player2", 20));
String pl3 = startProcess(app2, "RandomPlayer", playerParams("Player3", 40));
String pl4 = startProcess(app3, "RoundRobinPlayer", playerParams("Player4", 25));
String pl5 = startProcess(app3, "RoundRobinPlayer", playerParams("Player5", 35));
String pl1 = startProcess(app1, "InitialPlayer");
// ТепеÑÑ ÐœÑжМП МеЌМПгП пПЎПжЎаÑÑ, пПка ОгÑПкО "пПзМакПЌÑÑÑÑ" ÐŽÑÑг Ñ ÐŽÑÑгПЌ.
// ÐЎаÑÑ ÑеÑез sleep - плПÑ
Пе ÑеÑеМОе, заÑП ÑаЌПе пÑПÑÑПе.
// Ðе ЎелайÑе Ñак в ÑеÑÑезМÑÑ
ÑеÑÑаÑ
!
Thread.sleep(1000);
// ÐапÑÑкаеЌ ОгÑÑ, закÑÑÐ²Ð°Ñ Ð¿ÐŸÐ»ÑзПваÑелÑÑкÑÑ Ð°ÐºÑОвМПÑÑÑ
assertTrue(closeTask(app1, pl1, "Start"));
app1.getWaiting().waitProcessFinished(pl1);
app2.getWaiting().waitProcessFinished(pl2);
app2.getWaiting().waitProcessFinished(pl3);
app3.getWaiting().waitProcessFinished(pl4);
app3.getWaiting().waitProcessFinished(pl5);
}
private Map<String, Object> playerParams(String name, int energy) {
Map<String, Object> params = new HashMap<>();
params.put("playerName", name);
params.put("energy", energy);
return params;
}
ãã¹ããå®è¡ããŠãã°ãèŠãŠã¿ãŸãããã
ã³ã³ãœãŒã«åºå
ÐзÑÑа блПкОÑПвка клÑÑа lock://app1/process/InitialPlayer
Let's play!
СМÑÑа блПкОÑПвка клÑÑа lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!
ããããã¹ãŠãããããã€ãã®éèŠãªçµè«ãå°ãåºãããšãã§ããŸãã
- å¿ èŠãªããŒã«ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³éçºè ã¯ããžãã¹ ããžãã¯ãäžæããããšãªããã¢ããªã±ãŒã·ã§ã³éã®çµ±å察話ãäœæã§ããŸãã
- ãšã³ãžãã¢ãªã³ã°èœåãå¿ èŠãšããçµ±åã¿ã¹ã¯ã®è€éãã¯ãæåãããã¬ãŒã ã¯ãŒã¯ã®ã¢ãŒããã¯ãã£ã«å«ãŸããŠããå Žåããã¬ãŒã ã¯ãŒã¯å ã«é ãããšãã§ããŸãã åé¡ã®é£ããã¯é ãããšãã§ããªãã®ã§ãã³ãŒãã§ã®é£ããåé¡ã®è§£æ±ºçã¯ãã®ããã«ãªããŸãã
- çµ±åããžãã¯ãéçºãããšãã¯ãæçµçãªæŽåæ§ãšããã¹ãŠã®çµ±ååå è ã®ç¶æ å€åã®ç·åœ¢æ§ã®æ¬ åŠãèæ ®ããããšãäžå¯æ¬ ã§ãã ãã®ãããå€éšã€ãã³ããçºçããé åºã«åœ±é¿ãããªãããã«ããããã«ãããžãã¯ãè€éã«ããå¿ èŠããããŸãã ãã®äŸã§ã¯ããã¬ã€ã€ãŒã¯ã²ãŒã ããã®éå Žã宣èšããåŸãã²ãŒã ã«åŒ·å¶çã«åå ããããšã«ãªããŸãã圌ã®éå Žã«é¢ããæ å ±ããã¹ãŠã®åå è ã«å±ããåŠçããããŸã§ãä»ã®ãã¬ã€ã€ãŒã¯åœŒã«ããŒã«ããã¹ãç¶ããŸãã ãã®ããžãã¯ã¯ã²ãŒã ã®ã«ãŒã«ã«åŸã£ãŠããããéžæããã¢ãŒããã¯ãã£ã®ãã¬ãŒã ã¯ãŒã¯å ã§ã®åŠ¥åçãªè§£æ±ºçã§ãã
次ã«ããœãªã¥ãŒã·ã§ã³ã®ããŸããŸãªè€éãã劥åç¹ããã®ä»ã®ç¹ã«ã€ããŠèª¬æããŸãã
ãã¹ãŠã®ã¡ãã»ãŒãžã¯ XNUMX ã€ã®ãã¥ãŒã«ãããŸã
ãã¹ãŠã®çµ±åã¢ããªã±ãŒã·ã§ã³ã¯ãå€éšãããŒã«ãŒã®åœ¢åŒã§æäŸããã XNUMX ã€ã®çµ±åãã¹ãã¡ãã»ãŒãžçšã® XNUMX ã€ã® BPMQueueãããã³ä¿¡å· (ã€ãã³ã) çšã® XNUMX ã€ã® BPMTopic ãããã¯ã§åäœããŸãã ãã¹ãŠã®ã¡ãã»ãŒãžã XNUMX ã€ã®ãã¥ãŒã«éãããšèªäœã劥åã§ãã ããžãã¹ ããžã㯠ã¬ãã«ã§ã¯ãã·ã¹ãã æ§é ãå€æŽããã«ãæ°ããã¡ãã»ãŒãž ã¿ã€ãã奜ããªã ãå°å ¥ã§ããããã«ãªããŸããã ããã¯å€§å¹ ãªç°¡çŽ åã§ãããäžå®ã®ãªã¹ã¯ã䌎ããŸããç§ãã¡ã®å žåçãªã¿ã¹ã¯ã®æèã§ã¯ãããã¯ç§ãã¡ã«ãšã£ãŠããã»ã©éèŠã§ã¯ãããŸããã§ããã
ãã ããããã«ã¯åŸ®åŠãªç¹ã XNUMX ã€ãããŸããåã¢ããªã±ãŒã·ã§ã³ã¯ãå ¥å£ã®ãã¥ãŒããããã®ãã¡ãã»ãŒãžããã®ãã¡ã€ã³ã®ååã§ãã£ã«ã¿ãªã³ã°ããŸãã ä¿¡å·ã®ãå¯èŠæ§ã®ç¯å²ãã XNUMX ã€ã®ã¢ããªã±ãŒã·ã§ã³ã«å¶éããå¿ èŠãããå Žåã¯ãä¿¡å·å ã§ãã¡ã€ã³ãæå®ããããšãã§ããŸãã ããã«ãããã¹ã®ã¹ã«ãŒããããåäžããŸãããããžãã¹ ããžãã¯ã¯ãã¡ã€ã³åã䜿çšããŠåäœããå¿ èŠããããŸããã¡ãã»ãŒãžã®ã¢ãã¬ã¹æå®ã®å Žåã¯å¿ é ãä¿¡å·ã®å Žåã¯æãŸããã§ãã
çµ±åãã¹ã®ä¿¡é Œæ§ã®ç¢ºä¿
ä¿¡é Œæ§ã¯ããã€ãã®ãã€ã³ãã§æ§æãããŸãã
- éžæããã¡ãã»ãŒãž ãããŒã«ãŒã¯ãã¢ãŒããã¯ãã£ã®éèŠãªã³ã³ããŒãã³ãã§ãããåäžé害ç¹ã§ãããããååãªèé害æ§ãåããŠããå¿ èŠããããŸãã åªãããµããŒããšå€§èŠæš¡ãªã³ãã¥ããã£ãåãããå®çžŸã®ããå®è£ ã®ã¿ã䜿çšããå¿ èŠããããŸãã
- ã¡ãã»ãŒãž ãããŒã«ãŒã®é«å¯çšæ§ã確ä¿ããå¿ èŠããããçµ±åã¢ããªã±ãŒã·ã§ã³ããã¡ãã»ãŒãž ãããŒã«ãŒãç©ççã«åé¢ããå¿ èŠããããŸã (ããžãã¹ ããžãã¯ãé©çšãããã¢ããªã±ãŒã·ã§ã³ã®é«å¯çšæ§ã確ä¿ããããšã¯ã¯ããã«å°é£ã§ãããã³ã¹ããããããŸã)ã
- ãããŒã«ãŒã¯ãå°ãªããšã XNUMX åãã®é éä¿èšŒãæäŸãã矩åããããŸãã ããã¯ãçµ±åãã¹ã確å®ã«åäœãããããã®å¿ é èŠä»¶ã§ãã ãXNUMX åã ããã¬ãã«ã®ä¿èšŒã¯å¿ èŠãããŸãããããžãã¹ ããã»ã¹ã¯ãååãšããŠãã¡ãã»ãŒãžãã€ãã³ãã®ç¹°ãè¿ãã®å°çã«ææã§ã¯ãªãããããéèŠãªç¹å¥ãªã¿ã¹ã¯ã§ã¯ãããžãã¹ã«è¿œå ã®ãã§ãã¯ãè¿œå ããæ¹ãç°¡åã§ããéåžžã«ãé«äŸ¡ãªãä¿èšŒãåžžã«äœ¿çšãããããè«ççã§ãã
- ã¡ãã»ãŒãžãšã·ã°ãã«ã®éä¿¡ã¯ãããžãã¹ ããã»ã¹ãšãã¡ã€ã³ ããŒã¿ã®ç¶æ
ã®å€åã䌎ããã©ã³ã¶ã¯ã·ã§ã³å
šäœã«é¢äžããå¿
èŠããããŸãã æšå¥šããããªãã·ã§ã³ã¯ãã¿ãŒã³ã䜿çšããããšã§ã
ãã©ã³ã¶ã¯ã·ã§ã³éä¿¡ããã¯ã¹ ãã ããããŒã¿ããŒã¹å ã«è¿œå ã®ããŒãã«ãšãªããŒã¿ãŒãå¿ èŠã«ãªããŸãã JEE ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒã«ã« JTA ãããŒãžã£ãŒã䜿çšããããšã§ãããç°¡çŽ åã§ããŸãããéžæãããããŒã«ãŒãžã®æ¥ç¶ãæ©èœããå¿ èŠããããŸããXA ; - åä¿¡ã¡ãã»ãŒãžãšã€ãã³ãã®ãã³ãã©ãŒã¯ãããžãã¹ ããã»ã¹ã®ç¶æ ãå€æŽãããã©ã³ã¶ã¯ã·ã§ã³ãšãé£æºããå¿ èŠããããŸãããã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ãããå Žåã¯ãã¡ãã»ãŒãžã®åä¿¡ããã£ã³ã»ã«ããå¿ èŠããããŸãã
- ãšã©ãŒã«ããé
ä¿¡ã§ããªãã£ãã¡ãã»ãŒãžã¯å¥ã®ã¹ãã¬ãŒãžã«ä¿åããå¿
èŠããã
DLQ (ãããã¬ã¿ãŒãã¥ãŒ)ã ãã®ç®çã®ããã«ããã®ãããªã¡ãã»ãŒãžãã¹ãã¬ãŒãžã«ä¿åãã(çŽ æ©ãã°ã«ãŒãåãšæ€çŽ¢ã®ããã«) å±æ§ããšã«ã€ã³ããã¯ã¹ãä»ããã¡ãã»ãŒãžã®è¡šç€ºãå®å ã¢ãã¬ã¹ãžã®åéä¿¡ãåé€ã®ããã® API ãå ¬éããå¥ã®ãã©ãããã©ãŒã ãã€ã¯ããµãŒãã¹ãäœæããŸããã ã·ã¹ãã 管çè ã¯ãWeb ã€ã³ã¿ãŒãã§ã€ã¹ãéããŠãã®ãµãŒãã¹ãæäœã§ããŸãã - ãããŒã«ãŒèšå®ã§ã¯ãã¡ãã»ãŒãžã DLQ ã«å ¥ãå¯èœæ§ãæžããããã«ãé ä¿¡ã®åè©Šè¡åæ°ãšé ä¿¡éã®é 延ã調æŽããå¿ èŠããããŸã (æé©ãªãã©ã¡ãŒã¿ãèšç®ããããšã¯ã»ãŒäžå¯èœã§ãããçµéšã«åºã¥ããŠæäœããéçšäžã«èª¿æŽããããšãã§ããŸã) );
- DLQ ã¹ãã¢ã¯ç¶ç¶çã«ç£èŠããå¿ èŠããããç£èŠã·ã¹ãã ã¯ã¡ãã»ãŒãžã®æªé ä¿¡ãçºçããå Žåã«ã·ã¹ãã 管çè ãã§ããã ãæ©ã察å¿ã§ããããã«ã·ã¹ãã 管çè ã«èŠåããå¿ èŠããããŸãã ããã«ãããé害ãŸãã¯ããžãã¹ ããžã㯠ãšã©ãŒã®ã圱é¿ãåããé åããæžå°ããŸãã
- çµ±åãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ãäžæçã«ååšããªããŠã圱é¿ãåããªãããã«ããå¿ èŠããããŸãããããã¯ãžã®ãµãã¹ã¯ãªãã·ã§ã³ã¯æ°žç¶çã§ããå¿ èŠããããã¢ããªã±ãŒã·ã§ã³ãååšããªãéãä»ã®ãŠãŒã¶ãŒããã®ã¢ããªã±ãŒã·ã§ã³ããã®ã¡ãã»ãŒãžãåŠçããããšããªãããã«ãã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã³åã¯äžæã§ãªããã°ãªããŸãããåã
ããžãã¹ããžãã¯ã®ã¹ã¬ããã»ãŒãæ§ã®ç¢ºä¿
ããžãã¹ ããã»ã¹ã®åãã€ã³ã¹ã¿ã³ã¹ã¯ãè€æ°ã®ã¡ãã»ãŒãžãšã€ãã³ããåæã«åä¿¡ã§ãããããã®åŠçã¯äžŠè¡ããŠéå§ãããŸãã åæã«ãã¢ããªã±ãŒã·ã§ã³éçºè ã«ãšã£ãŠã¯ããã¹ãŠãã·ã³ãã«ã§ã¹ã¬ããã»ãŒãã§ããå¿ èŠããããŸãã
ããã»ã¹ã®ããžãã¹ ããžãã¯ã¯ããã®ããžãã¹ ããã»ã¹ã«åœ±é¿ãäžããåå€éšã€ãã³ããåå¥ã«åŠçããŸãã ãã®ãããªã€ãã³ãã«ã¯æ¬¡ã®ãããªãã®ããããŸãã
- ããžãã¹ããã»ã¹ã€ã³ã¹ã¿ã³ã¹ãèµ·åããã
- ããžãã¹ããã»ã¹å ã®ã¢ã¯ãã£ããã£ã«é¢é£ãããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã
- ããžãã¹ ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ããµãã¹ã¯ã©ã€ããããŠããã¡ãã»ãŒãžãŸãã¯ã·ã°ãã«ã®åä¿¡ã
- ããžãã¹ ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ã«ãã£ãŠèšå®ãããã¿ã€ããŒã®ããªã¬ãŒã
- API ãä»ããŠã¢ã¯ã·ã§ã³ãå¶åŸ¡ããŸã (ããã»ã¹ã®äžæãªã©)ã
ãã®ãããªåã€ãã³ãã¯ãããžãã¹ ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ã®ç¶æ ãå€æŽããå¯èœæ§ããããŸããã¢ã¯ãã£ããã£ã«ãã£ãŠã¯çµäºããå Žåãããã°éå§ããå Žåããããæ°žç¶ããããã£ã®å€ãå€æŽãããå ŽåããããŸãã ã¢ã¯ãã£ããã£ãéãããšã次ã®ã¢ã¯ãã£ããã£ã® XNUMX ã€ä»¥äžãã¢ã¯ãã£ãåãããå ŽåããããŸãã ãããã¯ãä»ã®ã€ãã³ãã®åŸ æ©ãåæ¢ããããšããè¿œå ã®ããŒã¿ãå¿ èŠãªãå Žåã¯åããã©ã³ã¶ã¯ã·ã§ã³ã§å®äºããããšãã§ããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãéããåã«ãããžãã¹ ããã»ã¹ã®æ°ããç¶æ ãããŒã¿ããŒã¹ã«ä¿åãããããã§æ¬¡ã®å€éšã€ãã³ããçºçããã®ãåŸ ã¡ãŸãã
ãªã¬ãŒã·ã§ãã« ããŒã¿ããŒã¹ã«ä¿åãããæ°žç¶çãªããžãã¹ ããã»ã¹ ããŒã¿ã¯ãSELECT FOR UPDATE ã䜿çšããå Žåã®åæåŠçã«éåžžã«äŸ¿å©ã§ãã XNUMX ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ããããžãã¹ ããã»ã¹ãå€æŽããããã«ããŒã¹ããããžãã¹ ããã»ã¹ã®ç¶æ ãååŸã§ããå Žåã䞊è¡ããŠå®è¡ãããŠããä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯å¥ã®å€æŽã«å¯ŸããŠåãç¶æ ãååŸã§ããªããªããæåã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºãããšãXNUMX çªç®ã®ãã©ã³ã¶ã¯ã·ã§ã³ãååŸãããŸãããã§ã«å€æŽãããç¶æ ãåãåãããšãä¿èšŒãããŠããŸãã
DBMS åŽã§æ²èŠ³çããã¯ã䜿çšããããšã§ãå¿
èŠãªèŠä»¶ããã¹ãŠæºãããŸã
ãã ããæ²èŠ³çãªããã¯ã¯ãããããã¯ã®è åšãšãªããããããžãã¹ ããžãã¯ã®é倧ãªã±ãŒã¹ã§ãããããã¯ãçºçããå Žåã«åããŠãSELECT FOR UPDATE ãé©åãªã¿ã€ã ã¢ãŠãã«å¶éããå¿ èŠããããŸãã
ãã XNUMX ã€ã®åé¡ã¯ãããžãã¹ ããã»ã¹ã®éå§ã®åæã§ãã ããžãã¹ ããã»ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãããŸããããããŒã¿ããŒã¹ã«ã¯ç¶æ ããªãããã説æããã¡ãœããã¯æ©èœããŸããã ç¹å®ã®ã¹ã³ãŒãå ã§ããžãã¹ ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ã®äžææ§ãä¿èšŒããå¿ èŠãããå Žåã¯ãããã»ã¹ ã¯ã©ã¹ãšå¯Ÿå¿ããã¹ã³ãŒãã«é¢é£ä»ããããããçš®ã®åæãªããžã§ã¯ããå¿ èŠã«ãªããŸãã ãã®åé¡ã解決ããããã«ãå€éšãµãŒãã¹ãéã㊠URI 圢åŒã®ããŒã§æå®ãããä»»æã®ãªãœãŒã¹ãããã¯ã§ããããã«ããå¥ã®ãã㯠ã¡ã«ããºã ã䜿çšããŸãã
ãã®äŸã§ã¯ãInitialPlayer ããžãã¹ ããã»ã¹ã«å®£èšãå«ãŸããŠããŸãã
uniqueConstraint = UniqueConstraints.singleton
ãããã£ãŠããã°ã«ã¯ã察å¿ããããŒã®ããã¯ã®ååŸãšè§£æŸã«é¢ããã¡ãã»ãŒãžãå«ãŸããŸãã ä»ã®ããžãã¹ ããã»ã¹ã«ã¯ãã®ãããªã¡ãã»ãŒãžã¯ãããŸãã: uniqueConstraint ãèšå®ãããŠããŸããã
æ°žç¶çãªç¶æ ãæã€ããžãã¹ããã»ã¹ã®åé¡
å Žåã«ãã£ãŠã¯ãæ°žç¶çãªç¶æ
ãç¶æããããšã¯ãéçºã«åœ¹ç«ã€ã ãã§ãªããå®éã®éçºã劚ããããšããããŸãã
åé¡ã¯ãããžãã¹ ããžãã¯ãããžãã¹ ããã»ã¹ ã¢ãã«ã«å€æŽãå ããå¿
èŠããããšãã«å§ãŸããŸãã ãã®ãããªå€æŽãã¹ãŠãããžãã¹ ããã»ã¹ã®å€ãç¶æ
ãšäºææ§ãããããã§ã¯ãããŸããã ããŒã¿ããŒã¹å
ã«å€æ°ã®ã©ã€ã ã€ã³ã¹ã¿ã³ã¹ãããå Žåãäºææ§ã®ãªãå€æŽãè¡ããšå€ãã®åé¡ãçºçããå¯èœæ§ããããŸããããã¯ãjBPM ã䜿çšãããšãã«ããçºçããŸãã
å€æŽã®æ·±ãã«å¿ããŠã次㮠XNUMX ã€ã®æ¹æ³ã§å¯ŸåŠã§ããŸãã
- å€ãããžãã¹ ããã»ã¹ ã¿ã€ãã«äºææ§ã®ãªãå€æŽãå ããªãããã«æ°ããããžãã¹ ããã»ã¹ ã¿ã€ããäœæããæ°ããã€ã³ã¹ã¿ã³ã¹ãèµ·åãããšãã«å€ãã¿ã€ãã®ä»£ããã«ããã䜿çšããŸãã å€ãã³ããŒã¯ã以åãšåãããã«ãåäœãç¶ããŸãã
- ããžãã¹ ããžãã¯ãæŽæ°ãããšãã«ãããžãã¹ ããã»ã¹ã®æ°žç¶çãªç¶æ ã移è¡ããŸãã
æåã®æ¹æ³ã¯ç°¡åã§ããã次ã®ãããªå¶éãšæ¬ ç¹ããããŸãã
- å€ãã®ããžãã¹ ããã»ã¹ ã¢ãã«ã§ããžãã¹ ããžãã¯ãéè€ããããžãã¹ ããžãã¯ã®éãå¢å ããŸãã
- å€ãã®å Žåãæ°ããããžãã¹ ããžãã¯ãžã®å³æ移è¡ãå¿ èŠã«ãªããŸã (çµ±åã¿ã¹ã¯ã«é¢ããŠã¯ãã»ãšãã©ã®å Žå)ã
- éçºè ã«ã¯ãå€ãã¢ãã«ãã©ã®æç¹ã§åé€ã§ãããããããŸããã
å®éã«ã¯äž¡æ¹ã®ã¢ãããŒãã䜿çšããŠããŸãããäœæ¥ã楜ã«ããããã«ããã€ãã®æ±ºå®ãäžããŸããã
- ããŒã¿ããŒã¹ã§ã¯ãããžãã¹ ããã»ã¹ã®æ°žç¶çãªç¶æ ããèªã¿åããããåŠçã容æãªåœ¢åŒãã€ãŸã JSON 圢åŒã®æååã§ä¿åãããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³å ãšå€éšã®äž¡æ¹ã§ç§»è¡ãå®è¡ã§ããããã«ãªããŸãã æåŸã®æ段ãšããŠãæåã§ä¿®æ£ããããšãã§ããŸã (ç¹ã«éçºäžã®ãããã°äžã«åœ¹ç«ã¡ãŸã)ã
- çµ±åããžãã¹ ããžãã¯ã§ã¯ããžãã¹ ããã»ã¹ã®ååã䜿çšãããªããããåå ããã»ã¹ã® 2 ã€ã®å®è£ ãæ°ããåå (ããšãã°ããInitialPlayerVXNUMXããªã©) ã®æ°ããå®è£ ã«ãã€ã§ã眮ãæããããšãã§ããŸãã ãã€ã³ãã£ã³ã°ã¯ã¡ãã»ãŒãžåãšã·ã°ãã«åãéããŠè¡ãããŸãã
- ããã»ã¹ ã¢ãã«ã«ã¯ããŒãžã§ã³çªå·ãããããã®ã¢ãã«ã«äºææ§ã®ãªãå€æŽãå ããå Žåã«ãã®çªå·ãå¢åããããã®çªå·ã¯ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ã®ç¶æ ãšãšãã«ä¿åãããŸãã
- ããã»ã¹ã®æ°žç¶çãªç¶æ ã¯ãæåã«ããŒã¿ããŒã¹ãã䟿å©ãªãªããžã§ã¯ã ã¢ãã«ã«èªã¿åãããã¢ãã«ã®ããŒãžã§ã³çªå·ãå€æŽãããå Žåã«ç§»è¡æé ã§äœ¿çšã§ããŸãã
- 移è¡æé ã¯ããžãã¹ ããžãã¯ã®é£ã«é 眮ãããããŒã¿ããŒã¹ããã®åŸ©å æã«ããžãã¹ ããã»ã¹ã®åã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠãé 延ããšåŒã°ããŸãã
- ãã¹ãŠã®ããã»ã¹ ã€ã³ã¹ã¿ã³ã¹ã®ç¶æ ãè¿ éãã€åæçã«ç§»è¡ããå¿ èŠãããå Žåã¯ãããå€å žçãªããŒã¿ããŒã¹ç§»è¡ãœãªã¥ãŒã·ã§ã³ã䜿çšãããŸãããJSON ã䜿çšããå¿ èŠããããŸãã
ããžãã¹ããã»ã¹ã«å¥ã®ãã¬ãŒã ã¯ãŒã¯ãå¿ èŠã§ãã?
ãã®èšäºã§èª¬æãããŠãããœãªã¥ãŒã·ã§ã³ã«ãããç§ãã¡ã®ç掻ãå€§å¹ ã«ç°¡çŽ åãããã¢ããªã±ãŒã·ã§ã³éçºã¬ãã«ã§è§£æ±ºã§ããåé¡ã®ç¯å²ãæ¡å€§ããããžãã¹ ããžãã¯ããã€ã¯ããµãŒãã¹ã«åé¢ãããšããã¢ã€ãã¢ãããé åçãªãã®ã«ãªããŸããã ãããéæããããã«ãå€ãã®äœæ¥ãè¡ãããããžãã¹ ããã»ã¹çšã®éåžžã«ã軜éããªãã¬ãŒã ã¯ãŒã¯ãäœæããããŸããã¢ããªã±ãŒã·ã§ã³ã®å¹ åºãåé¡ã®ã³ã³ããã¹ãã§ç¹å®ãããåé¡ã解決ããããã®ãµãŒãã¹ ã³ã³ããŒãã³ããäœæãããŸããã ç§ãã¡ã¯ãããã®çµæãå ±æããå ±éã³ã³ããŒãã³ãã®éçºãç¡æã©ã€ã»ã³ã¹ã®äžã§ãªãŒãã³ã¢ã¯ã»ã¹ã«ããããšèããŠããŸãã ããã«ã¯ããçšåºŠã®åŽåãšæéãå¿ èŠã«ãªããŸãã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã«å¯ŸããéèŠãç解ããããšã¯ãç§ãã¡ã«ãšã£ãŠãããªãã€ã³ã»ã³ãã£ããšãªãå¯èœæ§ããããŸãã ææ¡ãããèšäºã§ã¯ããã¬ãŒã ã¯ãŒã¯èªäœã®æ©èœã«ã¯ã»ãšãã©æ³šæãæãããŸããããæ瀺ãããäŸãããã®äžéšãèŠããŠããŸãã ãã¬ãŒã ã¯ãŒã¯ãå ¬éããå Žåã¯ãå¥ã®èšäºã§ããã«ã€ããŠåãäžããŸãã ãããŸã§ã®éã次ã®è³ªåã«çããŠãã£ãŒãããã¯ãæ®ããŠããã ããã°å¹žãã§ãã
ç»é²ãŠãŒã¶ãŒã®ã¿ãã¢ã³ã±ãŒãã«åå ã§ããŸãã
ããžãã¹ããã»ã¹ã«å¥ã®ãã¬ãŒã ã¯ãŒã¯ãå¿ èŠã§ãã?
-
èŠèŽè ã®ïŒïŒ%ãã¯ãããã®ãããªãã®ãé·ãéæ¢ããŠããŸãã
-
èŠèŽè ã®ïŒïŒ%ãããªãã®å®è£ ã«ã€ããŠè©³ããç¥ãããã®ã§ããã圹ç«ã€ãããããŸãã2
-
èŠèŽè ã®ïŒïŒ%ãæ¢åã®ãã¬ãŒã ã¯ãŒã¯ã® 1 ã€ã䜿çšããŠããŸããã眮ãæããããšãæ€èšããŠããŸãXNUMX
-
èŠèŽè ã®ïŒïŒ%ãæ¢åã®ãã¬ãŒã ã¯ãŒã¯ã® 3 ã€ã䜿çšããŠããŸããããã¹ãŠåé¡ãããŸããXNUMX
-
èŠèŽè ã®ïŒïŒ%ãç§ãã¡ã¯ãã¬ãŒã ã¯ãŒã¯ãªãã§ç®¡çããŸã3
-
èŠèŽè ã®ïŒïŒ%ãèªåã®ããšãæžããŠãã ãã4
16 人ã®ãŠãŒã¶ãŒãæ祚ããŸããã 7åã®ãŠãŒã¶ãŒãæ£æš©ããã
åºæïŒ habr.com