ã第ä¸åãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼BPMNå®è¡ç·¨ï¼
ååã¯ãCamunda Modelerãç¨ãã¦ãçµè²»ç³è«ãããã¼ã®ç°¡åãªBPMNã¢ããªã³ã°ããã¦ã¿ã¾ããã第ä¸åã¨ç¬¬äºåã¾ã§ã®ä½æ¥ãçµäºããããã¸ã§ã¯ããGitHubã«ããã£ã¦ããã®ã§ãä»åã¯ããããã¹ã¿ã¼ããã¾ãã
ä»åã¯ãååä½æããBPMNã¢ãã«ãCamundaä¸ã§å®è¡å¯è½ãªç¶æ
ã«ããç³è«ãæ¿èªã確èªã«å¿
è¦ãªãã©ã¼ã ï¼html/JavaScriptï¼ã¨Service Task
ã§å®è¡ããJavaã³ã¼ããå®è£
ããå®éã«ä½¿ããæ¥åã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦åä½ããã¦ã¿ã¾ãããã
ã¾ãå ã«æ¥åè¦ä»¶ãã¢ããªã³ã°ãã¦ããã¢ããªã±ã¼ã·ã§ã³ã®å®è£ ãè¡ãã¨ãããã¨ã§ãã¢ãã«é§åéçºã¨ãå¼ã¹ãæµãã«ãªã£ã¦ãã¾ãããã®æ¹æ³è«ã楽ããã§ããããã°ã¨æãã¾ãã
- ã第ä¸åãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼å°å ¥ç·¨ï¼
- ã第äºåãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼BPMNã¢ããªã³ã°ç·¨ï¼
- ã第ä¸åãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼BPMNå®è¡ç·¨ï¼
- ã第ååãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼DMNç·¨ï¼
- ã第äºåãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼CMMNç·¨ï¼
- ã第å åãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼ãã¹ãç·¨ï¼
- ã第ä¸åãçµè²»ç³è«ã®ããã¼ã§å¦ã¶Camundaã®åºæ¬ï¼ã¾ã¨ãï¼
ååä½æããçµè²»ç³è«ã®BPMNã¢ãã«
BPMNãå®è¡å¯è½ã«ãã
ã¾ãã¯ååä½æããBPMNã¢ãã«ãCamundaä¸ã§å®è¡å¯è½ã«ããå¿
è¦ãããã¾ãããçµè²»ç³è«ããã¼ã«ãé¸æãã¦ãå³å´ã«ç¾ããã¡ãã¥ã¼ããExecutable
ã¨ããé
ç®ã«ãã§ãã¯ãå
¥ããã°å®è¡å¯è½ã«ãªãã¾ãã
ã¾ããProcess Id
ã«ã¯ããããããååãã¤ãã¦ããã¾ããããä»åã¯ExpenseApplication
ã¨ãã¾ããã
ã¡ãªã¿ã«ãCamunda Modelerã§ã¤ããBPMNã¢ãã«ã¯æ®éã«èãã¦Camundaä¸ã§å®è¡ãããã ãããããã©ã«ãã§å®è¡å¯è½ã«ãã¦ããããã£ã¦ããissueãããã£ã¦ãã¦ãã©ããã次ã®ãã¼ã¸ã§ã³ï¼v1.12.0ï¼ã«ãã¼ã¸ããã¦ããããã§ãããªãªã¼ã¹ã¯ãã
ãã©ã¼ã ã®ä½æ
BPMNã®ã¯ã¼ã¯ããã¼ãå®è¡ããã«ããã£ã¦ã人éã«ããä½æ¥ã確èªãããããã®ãã©ã¼ã ãå¿ è¦ã«ãªã£ã¦ãã¾ãã
ä»åã®çµè²»ç³è«ããã¼ã§ã¯ãä¸è¨ã®ããã«ããããã®ã¤ãã³ãã»ã¦ã¼ã¶ã¼ã¿ã¹ã¯ã®BPMNã³ã³ãã¼ãã³ãã«å¯¾å¿ããã3ã¤ã®ãã©ã¼ã ãä½æãã¾ãã
BPMNã³ã³ãã¼ãã³ã | ãã©ã¼ã å | ãã¡ã¤ã«å |
---|---|---|
çµè²»ç³è«ãã©ã¼ã | apply-form.html | |
çµè²»æ¿èªãã©ã¼ã | approve-form.html | |
çµè²»ç¢ºèªãã©ã¼ã | confirm-form.html |
src/main/resources/static/forms/apply-form.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>çµè²»ç³è«ãã©ã¼ã </title> </head> <body> <h2>çµè²»ç³è«ãã©ã¼ã </h2> <form role="form" name="expenseForm" class="form-horizontal"> <div class="form-group"> <label class="control-label col-md-4" for="expenseReceiptUpload">é åæ¸ã®ã¢ãããã¼ã</label> <div class="col-md-8"> <input type="file" id="expenseReceiptUpload" cam-variable-name="expenseReceipt" cam-variable-type="File" cam-max-filesize="10000000" class="form-control"/> <div class="help-block">çµè²»ã®é åæ¸ã®ç»åãé¸æãã¦ãã ãã</div> </div> </div> <script cam-script type="text/form-script"> var fileUpload = $('#expenseReceiptUpload'); var fileUploadHelpBlock = $('.help-block', fileUpload.parent()); function flagFileUpload() { var hasFile = fileUpload.get(0).files.length > 0; fileUpload[hasFile ? 'removeClass' : 'addClass']('ng-invalid'); fileUploadHelpBlock[hasFile ? 'removeClass' : 'addClass']('error'); return hasFile; } fileUpload.on('change', function () { flagFileUpload(); }); camForm.on('submit', function(evt) { var hasFile = flagFileUpload(); // prevent submit if user has not provided a file evt.submitPrevented = !hasFile; }); </script> <div class="form-group"> <label class="control-label col-md-4" for="detail">å 容</label> <div class="col-md-8"> <input cam-variable-name="detail" cam-variable-type="String" id="detail" class="form-control" type="text" required /> </div> </div> <div class="form-group"> <label class="control-label col-md-4" for="amount">éé¡ï¼åï¼</label> <div class="col-md-8"> <input cam-variable-name="amount" cam-variable-type="Double" id="amount" name="amount" class="form-control" type="text" required /> </div> </div> <div class="form-group"> <label class="control-label col-md-4" for="expenseCategory">çµè²»ç¨®å¥</label> <div class="col-md-8"> <select cam-variable-name="expenseCategory" cam-variable-type="String" id="expenseCategory" class="form-control"> <option value="TRAVEL" label="æ 費交éè²»"/> <option value="MEAL" label="æ¥å¾ 交éè²»"/> <option value="EXPENDABLES" label="æ¶èå"/> <option value="OTHER" label="ãã®ä»"/> </select> </div> </div> </form> </body>
src/main/resources/static/forms/approve-form.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>çµè²»ç³è«ãã©ã¼ã </title> </head> <body> <h2>çµè²»ç³è«ãã©ã¼ã </h2> <form role="form" name="expenseForm" class="form-horizontal"> <p>çµè²»æ å ±ã確èªã®ä¸ãæ¿èªãã¦ãã ãã</p> <div class="form-group"> <label class="control-label col-md-2">çµè²»é åæ¸</label> <div class="form-control-static col-md-10"> <input type="hidden" cam-variable-name="expenseReceipt"/> <img src="{{ camForm.variableManager.variable('expenseReceipt').contentUrl }}" class="img-responsive"> </div> </div> <div class="form-group"> <label class="control-label col-md-2">å 容</label> <div class="col-md-10"> <input cam-variable-name="detail" type="text" name="detail" readonly="true" class="form-control" /> </div> </div> <div class="form-group"> <label class="control-label col-md-2">éé¡ï¼åï¼</label> <div class="col-md-10"> <input cam-variable-name="amount" type="text" name="amount" readonly="true" class="form-control" /> </div> </div> <div class="form-group"> <label class="control-label col-md-2">çµè²»ç¨®å¥</label> <div class="col-md-10"> <select cam-variable-name="expenseCategory" cam-variable-type="String" name="expenseCategory" disabled="true" class="form-control"> <option value="TRAVEL" label="æ 費交éè²»"/> <option value="MEAL" label="æ¥å¾ 交éè²»"/> <option value="EXPENDABLES" label="æ¶èå"/> <option value="OTHER" label="ãã®ä»"/> </select> </div> </div> <div class="form-group"> <div class="col-md-10 col-md-offset-2"> <label> æ¿èªãã¾ããï¼ <select cam-variable-name="approved" cam-variable-type="Boolean" id="approved" name="approved" class="form-control"> <option value="true" label="æ¿èª"/> <option value="false" label="å´ä¸"/> </select> </label> </div> </div> </form> </body>
src/main/resources/static/forms/confirm-form.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>çµè²»ç³è«ãã©ã¼ã </title> </head> <body> <h2>çµè²»ç³è«ãã©ã¼ã </h2> <form role="form" name="expenseForm" class="form-horizontal"> <p>çµè²»æ å ±ã確èªã®ä¸ãã¿ã¹ã¯ãCompleteã«ãã¦ãã ãã</p> <div class="form-group"> <label class="control-label col-md-2">çµè²»é åæ¸</label> <div class="form-control-static col-md-10"> <input type="hidden" cam-variable-name="expenseReceipt"/> <img src="{{ camForm.variableManager.variable('expenseReceipt').contentUrl }}" class="img-responsive"> </div> </div> <div class="form-group"> <label class="control-label col-md-2">å 容</label> <div class="col-md-10"> <input cam-variable-name="detail" type="text" name="detail" readonly="true" class="form-control" /> </div> </div> <div class="form-group"> <label class="control-label col-md-2">éé¡ï¼åï¼</label> <div class="col-md-10"> <input cam-variable-name="amount" type="text" name="amount" readonly="true" class="form-control" /> </div> </div> <div class="form-group"> <label class="control-label col-md-2">çµè²»ç¨®å¥</label> <div class="col-md-10"> <select cam-variable-name="expenseCategory" cam-variable-type="String" name="expenseCategory" disabled="true" class="form-control"> <option value="TRAVEL" label="æ 費交éè²»"/> <option value="MEAL" label="æ¥å¾ 交éè²»"/> <option value="EXPENDABLES" label="æ¶èå"/> <option value="OTHER" label="ãã®ä»"/> </select> </div> </div> <div class="form-group"> <div class="col-md-10 col-md-offset-2"> <label> æ¿èªæ å ±ï¼ <select cam-variable-name="approved" cam-variable-type="Boolean" id="approved" name="approved" disabled="true" class="form-control"> <option value="true" label="æ¿èª"/> <option value="false" label="å´ä¸"/> </select> </label> </div> </div> </form> </body>
BPMNã³ã³ãã¼ãã³ãã¨ãã©ã¼ã ã®ç´ä»ã
ãããã®ãã©ã¼ã ãããããã®ã¤ãã³ãã»ã¿ã¹ã¯ã¨çµã³ã¤ããããã«ãBPMNã³ã³ãã¼ãã³ããé¸æè¢ãå³ã¡ãã¥ã¼ã®Forms
ã¿ãã«ããForm Key
ã¨ããé
ç®ã«ã対å¿ãããã©ã¼ã ã®ãã¡ã¤ã«ãã¹ãembedded:app:
ã«ç¶ãã¦å
¥åãã¾ãã
embedded:app:forms/apply-form.html
embedded:app:forms/approve-form.html
embedded:app:forms/confirm-form.html
以ä¸ã§ãã©ã¼ã ã«é¢ããè¨å®ã¯å®äºã§ãã
Exclusive Gatewayã®åå²æ¡ä»¶ã®è¨å®
次ã«ããæ¿èªãã¿ã¹ã¯ã§æ¿èªè ãã¿ã¹ã¯ãCompleteããå¾ã«ãã²ã¼ãã¦ã§ã¤ã«ããã¦æ¿èªæ¸ã¿ãå¦ãã®åå²å¤å®ãå¿ è¦ã«ãªãã¾ãã
ãæ¿èªæ¸ã¿ï¼ãã®Exclusive Gateway
ãã伸ã³ã¦ãããããããã¨ãã¯ããã®ããã¼ã³ã³ãã¼ãã³ãããããã«ããæ¿èªãã¿ã¹ã¯ã§ãã©ã¼ã ã§å
¥åãããapproved
å¤æ°ãç¨ããæ¡ä»¶å¼ãè¨å®ãã¾ãã
ãããããã®åå²
ãã¯ããã®åå²
Service Taskã®å®è£
ãçµè²»è¨é²ãã®ãµã¼ãã¹ã¿ã¹ã¯ã§ã¯ãä»åã¯åç´ã«çµè²»æ å ±ããã°ã«åºåãã¦ã¿ã¾ãããã
Service Task
ã¯å®è£
æ¹æ³ãé¸æããå¿
è¦ãããã®ã§ããçµè²»è¨é²ãã®Service Task
ã®è©³ç´°ã«ãä»åã¯Java Class
ã¨ãã¦ä¸è¨ã®ããã«å
¥åãã¦ããã¾ãã
Javaã®å®è£
ã¨ãã¦ã¯ãçµè²»ç¨®å¥ã®ã©ããªã³ã°ã®ããã®enum Category.java
ã¨ããµã¼ãã¹ã¿ã¹ã¯ ExpenseRecorder.java
ã以ä¸ã®ããã«ä½æãã¾ãã
src/main/java/sample/Category.java
package sample; public enum Category { TRAVEL { @Override public String toString() { return "æ 費交éè²»"; } }, MEAL { @Override public String toString() { return "æ¥å¾ 交éè²»"; } }, EXPENDABLES { @Override public String toString() { return "æ¶èå"; } }, OTHER { @Override public String toString() { return "ãã®ä»"; } } }
src/main/java/sample/service/ExpenseRecorder.java
package sample.service; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; import sample.Category; import java.util.logging.Logger; public class ExpenseRecorder implements JavaDelegate { private final Logger LOGGER = Logger.getLogger(ExpenseRecorder.class.getName()); @Override public void execute(DelegateExecution execution) throws Exception { LOGGER.info("å 容: " + execution.getVariable("detail")); LOGGER.info("éé¡ï¼åï¼: " + execution.getVariable("amount")); LOGGER.info("çµè²»ç¨®å¥: " + Category.valueOf((String)execution.getVariable("expenseCategory"))); LOGGER.info("æ¿èªæ¸ã¿ï¼: " + (((Boolean)execution.getVariable("approved")).booleanValue() ? "ã¯ã" : "ããã")); } }
BPMNã®é åã¨ããã»ã¹è¨å®
ä½æããBPMNã¯src/main/resources
ç´ä¸ã«é
åãã¦ããã¾ãããã
src/main/resources/expense_application.bpmn
次ã«ãsrc/main/resources/META-INF/processes.xml
ãä½æããçµè²»ç³è«BPMNï¼expense_application.bpmnï¼ãããã©ã«ãã§èªã¿è¾¼ãããã«è¨å®ãã¾ãã
<process-application xmlns="http://www.camunda.org/schema/1.0/ProcessApplication" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <process-archive> <process-engine>default</process-engine> <resource>expense_application.bpmn</resource> <properties> <property name="isDeleteUponUndeploy">false</property> <property name="isScanForProcessDefinitions">false</property> </properties> </process-archive> </process-application>
ããã¾ã§ã§BPMNã¯Camundaã§èªåçã«ãã¼ãããå®è¡å¯è½ãªç¶æ ã«ãªãã¾ããã試ãã«Spring BootããCamundaãç«ã¡ä¸ãã¦ã¿ã¾ãããã
$ gradle bootRun
ç«ã¡ä¸ãã£ãã http://localhost:8080/ ã«ã¢ã¯ã»ã¹ããdemo/demoã§ãã°ã¤ã³ãã¾ãã
Applications
é
ç®ã«ããTasklist
ãã¯ãªãã¯ãã¾ãã
Tasklist
ãéããç¾ç¶ã§ã¯ãªã¹ãã¯ç©ºã®ç¶æ
ã§ãã
ãããããããçµè²»ç³è«ããã¼ãåããã¦ã¿ã¾ãããã
çµè²»ç³è«ããã¼ã®ãã¢
ä»åã¯ãæ¿èªè
ãæ¿èªããæ¡ä»¶åå²ã§çµè²»ç³è«ããã¼ã試ãã¦ã¿ã¾ããã¾ããç°¡åã®ããã«ç³è«è
ãæ¿èªè
ãçµç
ã®å½¹å²ã¯ã¯ãã¹ã¦demo
ã¦ã¼ã¶ã¼ã§å®è¡ãã¾ãã
Camundaã«ãããã¤ãããBPMNã®ããã»ã¹ãèµ·åããããã«ãTasklist
ã®å³ä¸ã®ã¡ãã¥ã¼ã«ããStart Process
ãã¯ãªãã¯ãã¾ãã
ãããã¢ããã§ç¾ããã¡ãã¥ã¼ããExpenseApplication
ãã¯ãªãã¯ããã¨ãçµè²»ç³è«ã®ããã»ã¹ãéå§ãã¾ãã
ãã®æç¹ã§ãçµè²»ç³è«ãã©ã¼ã éä¿¡ãã¤ãã³ããããªã¬ã¼ãããã¤ãã³ãã«ç´ã¥ãããããã©ã¼ã ãåºç¾ãã¾ãã
é©å½ãªé åæ¸ã®ç»åãã¡ã¤ã«ãé¸æããå¿
è¦ãªé
ç®ãå
¥åããStart
ãã¿ã³ãæ¼ãã¾ãã
ããã§ä¸æ¦Tasklist
ã®ãã¼ã¸ããªãã¼ãããã¨ãæ¿èª
ã¿ã¹ã¯ãç¾ãã¾ãã
ãã®æ¿èª
ã¿ã¹ã¯ãã¯ãªãã¯ãã¦ã¿ãã¨ãä»åº¦ã¯æ¿èª
ã¿ã¹ã¯ã«ç´ã¥ãããããã©ã¼ã ãåºç¾ãã¾ãã
demo
ã¦ã¼ã¶ã¼ã«ã¢ãµã¤ã³ããããã«ãå³ä¸ã®Claim
ãã¿ã³ãæ¼ãã¨ã
æ¿èª
ã¿ã¹ã¯ãdemo
ã¦ã¼ã¶ã¼æ
å½ã«ãªãã¾ãã
ããã§æ¿èªã§ããããã«ãªã£ãã®ã§ãããããããã¯ã¹ããæ¿èªãã®ã¾ã¾Complete
ãã¿ã³ãæ¼ãã¦ã¿ã¾ãããã
ããã¨ãä»åº¦ã¯Tasklist
ã«çµçæ
å½ã®ç¢ºèª
ã¿ã¹ã¯ãåºç¾ãã¾ãã
以ä¸ã§çµè²»ç³è«ã®ã¯ã¼ã¯ããã¼ãçµçã®ç¢ºèªå¾ ã¡ã¨ããç¶æ ã¾ã§é·ç§»ãã¾ããã
ï¼é話ä¼é¡ï¼Cockpitã§ã®å®è¡ä¸ã®ããã»ã¹ã®ç¢ºèª
ãã¢ã®æä¸ã§ãããããã§ãã£ããCockpitã¨ããæ©è½ãç´¹ä»ãããã¨æãã¾ãã
Camundaã«ã¯Cockpitã¨ããããã·ã¥ãã¼ãæ©è½ãããã©ã«ãã§åãã£ã¦ããããããã¤ãããBPMNããç¾å¨å®è¡ä¸ã®ããã»ã¹ãç¾å¨ã¿ã¹ã¯å®äºå¾ ã¡ã®ã¦ã¼ã¶ã¼ã¿ã¹ã¯ãªã©ã確èªã§ãã¾ãã
試ãã«ä¸è¨ã®ãã¢ã®éä¸ã®ãçµè²»ãæ¿èªå¾ï¼ã¤ã¾ããçµçã®ç¢ºèªå¾ ã¡ã®ç¶æ ï¼ã«ãå®è¡ä¸ã®ããã»ã¹ã®ç¶æ ãCockpitã§ç¢ºèªãã¦ã¿ã¾ãããã
Cockpitã«ã¢ã¯ã»ã¹ããRunning Process Instances
ãã¯ãªãã¯ãã¾ãã
http://localhost:8080/app/cockpit/default/#/dashboard
å®è¡ä¸ã®ããã»ã¹ã表示ãããã®ã§ãExpenseApplication
ãé¸æãã¾ãã
ããã¨ãä¸ã®ããã«ç¾å¨â ããã»ã¹ãã確èªãã¿ã¹ã¯ã®ã¨ããã«ã¨ã©ã¾ã£ã¦ãããã¨ãå¯è¦åããã¾ãã
ãã®ããã«ãCockpitã¯å®è¡ä¸ã®ããã»ã¹ãã¢ãã¿ã¼ããã®ã«ä¾¿å©ãªæ©è½ãæä¾ãã¾ãã
確èªã¿ã¹ã¯ã®å®è¡ã«ããçµè²»è¨é²ã®ãµã¼ãã¹ã¿ã¹ã¯ãããªã¬ã¼
ãã¦ããã¢ã«æ»ãã¾ãã
ä¸ã®Cockpitã§ã確èªã§ããããã«ãæå¾ã«æ®ãã¦ã¼ã¶ã¼ã¿ã¹ã¯ã¯çµçã®ç¢ºèªã®ã¿ã§ããã®ãã¨ã¯ãµã¼ãã¹ã¿ã¹ã¯ã§ããçµè²»è¨é²ï¼ãã®ã³ã°ï¼ãããªã¬ã¼ãããã¯ãã§ãã
ãã£ããã確èªãã¿ã¹ã¯ãå®äºãã¦ã¿ã¾ãããã
Tasklist
ã«æ»ãããæ¿èªãã¿ã¹ã¯ã®å ´åã¨åæ§ã«ã確èªãã¿ã¹ã¯ãClaimããdemo
ã¦ã¼ã¶ã¼ã«ã¢ãµã¤ã³ãã¾ãã
ä»åã®ã¿ã¹ã¯ã¯ç¢ºèªããã®ã¿ãªã®ã§ãç¹ã«ä½ãç·¨éããå¿
è¦ãªãã«Complete
ãã¿ã³ãæ¼ãã¾ãã
ã確èªãã¿ã¹ã¯ãComplete
ããã¨ããã«ãçµè²»è¨é²ãã®ãµã¼ãã¹ã¿ã¹ã¯ãå®è¡ãããã®ã§ãSpring Bootã®ãã°ã確èªãã¦ã¿ã¾ãããã
2018-01-16 15:41:35.131 INFO 16948 --- [io-8080-exec-10] sample.service.ExpenseRecorder : å 容: Scalaé¢è¥¿ã®äº¤éè²» 2018-01-16 15:41:35.131 INFO 16948 --- [io-8080-exec-10] sample.service.ExpenseRecorder : éé¡ï¼åï¼: 28000.0 2018-01-16 15:41:35.140 INFO 16948 --- [io-8080-exec-10] sample.service.ExpenseRecorder : çµè²»ç¨®å¥: æ 費交éè²» 2018-01-16 15:41:35.140 INFO 16948 --- [io-8080-exec-10] sample.service.ExpenseRecorder : æ¿èªæ¸ã¿ï¼: ã¯ã
è¦äºãã°ãåºåããã¾ãããï¼
ä»åã¯ç°¡åãªãã¢ã®ããã«ãã°åºåã¨ãã¾ãããããµã¼ãã¹ã¿ã¹ã¯ã®å®è£ ã¯Javaã®ã¯ã©ã¹ã§è¡ããã¦ããã®ã§ãå¤é¨ã®APIãå©ããããããã¼ã¿ãã¼ã¹ã«ã¹ãã¢ããããããã¡ãã»ã¼ã¸ãã¥ã¼ã«éä¿¡ãããããããªãã§ãã§ãã¾ãã
以ä¸ã§ä»åã®çµè²»ç³è«ãã¢ã¯å®äºã§ããä»åã®è¨äºã§å®è£ ããããã¸ã§ã¯ãã¯ãã¡ãã«ãªãã¾ãã
çããã®æå ã§ããæ¿èªããå´ä¸ãã«ãªãåå²ãå®è¡ãã¦ã¿ããããå´ä¸ãã®å ´åã®æ å ±ãåºåãããµã¼ãã¹ã¿ã¹ã¯ã追å ãã¦å®è¡ãã¦ã¿ãããéãã§ã¿ã¦ãã ããã
æ¥åã¯ã¼ã¯ããã¼ãBPMNã¨ã³ã¸ã³ã§å®è£ ããã¡ãªãã
Camundaã®ãããªBPMNã¯ã¼ã¯ããã¼ã¨ã³ã¸ã³ãå©ç¨ããã¡ãªããã¨ãã¦ãç§å人ã¨ãã¦ä¸çªå¤§ããã¨æã£ã¦ããã®ã¯ãã¯ã¼ã¯ããã¼ã®ãç¶æ é·ç§»ããããã¯ã¨ã³ãã®å®è£ ã¨åé¢ãããã¨ãã§ããã¨ããã§ããBPMNã§ã¢ãã«åã§ãããããªæ¥åããã¼ãããã¯ã¨ã³ããµã¼ãã¹ã¨ãã¦ããã ã¹ã¯ã©ããã§å®è£ ãããã¨ããã¨ãã©ããã¦ãã¹ãã¼ããã·ã³ã®ãããªãã¸ãã¯ãå®è£ ããå¿ è¦ãã§ã¦ãã¾ããæåã§å®è£ ããã¹ãã¼ããã·ã³ã¯çµæ§æ¥½ãããã§ãããæ¥åè¦ä»¶ã«å¤æ´ãå ãã£ãéã«çãåãã¾ããããç¶æ ããä»ã®ç¶æ ã¸é·ç§»ããéä¸ã«æ°ããç¶æ ãåå²ãå¿ è¦ã¨ãªã£ãå ´åãå½±é¿ç¯å²ã®èª¿æ»ããªããªãå³ããã§ãããå®è£ ã®å¤æ´å·¥æ°ã¯ãã¨ãããã¹ãã®å·¥æ°ãããã¿ã¾ããããã«ããã¨æ¬çªç°å¢ã§ã¹ãã¼ããã·ã³ããå¤ããä¾å¤çãªç¶æ é·ç§»ãå®è¡ããå¿ è¦ãåºã¦ããã¨ãã«ãããããµããããããªããªãã¨ããæ²ãã¿ãæ±ãããã¨ã«ãªãã¾ãï¼çµé¨è«ï¼ã
BPMNã¯ã¼ã¯ããã¼ã¨ã³ã¸ã³ãç¨ãã¦ç¶æ é·ç§»ãBPMNã®ã¢ãã«ã«éç´ããããã«ããã¨ãç¶æ é·ç§»ã®ãã¸ãã¯ã¯åé¢ãããããã¯ã¨ã³ãã®å®è£ ã¯æ å ±ã®ã¹ãã¢ï¼CRUDï¼ãã¡ãã»ã¼ã¸ã³ã°ã«å°å¿µãããã¨ãã§ãã¾ããBPMNã¢ãã«ãã®ãã®ãæ¥åè¦ä»¶ã表ç¾ãã¦ããã®ã§ãå¤æ´ã®å½±é¿ç¯å²ã¯å¯è¦åããã¾ããæ°ããç¶æ ãé·ç§»ãã追å ããã«ã¯BPMNã®ã¢ãã«å´ãå¤æ´ããã°ãããç¶æ ãæ å ±ããã®ãã®ã¯ãµã¼ãã¹ã¿ã¹ã¯ãç¨ãã¦ããã¯ã¨ã³ãã«ã¹ãã¢ãããããªå½¢ã«ãªãã§ããããããã¯ã¨ã³ãå´ã«é·ç§»ãã¸ãã¯ãå ¥ãè¾¼ã¾ãªããã¨ã§ãå¤æ´ã«ä¼´ãç¶æ ã®çç¾ã®ãããªãã°ãå ¥ãè¾¼ãä½å°ããªããªããã¢ã¸ã£ã¤ã«ã§æè»ãã¤ããã¹ããªã·ã¹ãã éçºãå®ç¾ã§ããã®ã§ã¯ãªããã¨èãã¦ãã¾ãã
ããã«ãããã¯ã¨ã³ãã®æ å ±ã¹ãã¢ã«é¢ãã¦ã¯ãReladomoã®ããã«å±¥æ´ç®¡çã容æãªãã¼ã¿ã¢ã¯ã»ã¹ã¬ã¤ã¤ã¼ãå©ç¨ã§ããã¨æ¥åã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦ã¯ããã«ããããé¢ç½ããã¨ãã§ããã§ãããããã®è¾ºã¯ãã¤ãå¥ã®ããã°ã§æ¸ããã¨è¯ããªã¨æãã¾ãã
BPMNã«å¤æ´ãå ããéã®ãããã¤ã®æ¹æ³è«ã«é¢ãã¦ã¯ããããæ¤è¨¼ãå¿ è¦ã ã¨æãã¾ããããããã¤åã«ã¯ã¼ã¯ããã¼ã®ä¸éç¶æ ã®ããã»ã¹ãæé¤ï¼å ¨ã¦çµäºã¾ã§æã£ã¦ããããå ¨ã¦ãå§ç¹ã«æ»ãçï¼ãããããªæ½çãå¿ è¦ã«ãªã£ã¦ããããªã¨æãã¾ãã
第ä¸åã®ã¾ã¨ã
ä»åã¯BPMNã§ã¢ãã«åããçµè²»ç³è«ããã¼ãç¨ãã¦ãCamundaä¸ã§å®è¡ãããã®ã«å¿ è¦ãªãã©ã¼ã å®è£ ã¨ãµã¼ãã¹ã¿ã¹ã¯å®è£ ãBPMNã®è¨å®ãè¡ãã¾ããã第ä¸åã第ä¸åã¾ã§ã®æºåã»ã¢ããªã³ã°ã»å®è£ ããã»ã¹ã ãã§å®éã«åä½ããæ¥åã¢ããªã±ã¼ã·ã§ã³ãå®æãã¾ããã
ãããã ã£ãã§ãããããæãã®ã»ãç°¡åã«ã¢ããªã³ã°ã§ããããã¢ããªã±ã¼ã·ã§ã³ã®å®è£ ãé常ã«ã·ã³ãã«ã§ãï¼å®è£ ã®ã»ã¨ãã©ã¯ãã©ã¼ã å´ã§ãããã¯ã¨ã³ãã«ç¸å½ããJavaã®ã³ã¼ãã¯ä»åã¯ã»ã¨ãã©æ¸ãã¦ã¾ããwï¼ã
ããã¾ã§ã§Camundaã®æã¤ã¢ããªã³ã°é§åã®éçºã®å¯è½æ§ã¨ãã¯ã¼ã¯ããã¼ã¨ã³ã¸ã³ã¨ããã¯ã¨ã³ãã¹ãã¢ã®è²¬ååé¢ã®å¼·åãããªãã¨ãªãæãã¦ããããã幸ãã§ãã
次åã¯ãBPMNåç¬ã§ã¯ãªããªãã¢ããªã³ã°ãé£ãããææ決å®ã®ããã®ã¢ããªã³ã°è¨æ³ã§ããDMNãå¦ãã§ã¿ã¾ããããä»åã¾ã§ã«ä½æããçµè²»ç³è«ã¯ã¼ã¯ããã¼ãæ¡å¼µããææ決å®ããã»ã¹ãå°å ¥ãã¦ã¿ã¾ããã楽ãã¿ã«ï¼