ืืื ืืืจ! ืื ื ืืฆืื ืืชืฉืืืช ืืื ืืช ืืชืจืืื ืฉื ืืืืืจ
07.07.2020/XNUMX/XNUMX, ืชืจืืื
ืืขืชืื ืงืจืืืืช ืื ื ืื ืืืจืืืืงืืืจืช ืืืงืจื-ืฉืืจืืชืื ืขื ืื ืฉืื ืฉืืื ื ื-Java: ืืคืชืื C#, ืืคืชืื Node.JS/JavaScript ืื ืืืืื Golang. ืืืื ืืชืืืืืื ืขื ืืขืืืื ืฉืื ืฆืจืืืื ืื ืื ืื ืชืืืืจ ืืืจืืืืงืืืจืช ืืืงืจื-ืฉืืจืืชืื, ืื ืกืชื ืืื ืืืืขืื ืืจืืืช ืืขืืืื ืืืงืื ืืช ืืืืืืช ืืืฆืข ืืืื ื, ืืืคืื ืืชืืืื ืืื, ืกืืื ืืขืกืงืืืช ืคืืฆืื.
ืคืืืคืืจืืช BPM ืขื
ืื! ืืืขืฉื, ืืชื ืืืื ืืงืืืช ืืืคืขืื ืืช Camunda ืืื ืื ืืืข ืื'ืืืื ืืืืืืืจ ืืช ืืืจืืืืงืืืจื ืืงืื ืืื ืฉืคื ืฉืชืืืจ. ืืืืืจ ืื ื ืกืชืื ืขื:
- ืืืจืืืืืช ืืกืืกืืช;
- REST API
- ืืืขืืฅ ืืืื ืกืคืจืืืช ืืงืืืืช ืงืืืืืช ืืฉืคืืช ืฉืืื ื Java;
- ืืืืื ืืืืฆืขืืช C# ื-Node.JS;
- ืืจืืื ืืืคืขืื ืืช ืฉืจืช Camunda (Docker ืื Tomcat).
ืืืจืืืืืช
Camunda ืืชืื ื-Java ืืฆืจืื ืืืื ืช Java Virtual Machine (JVM) ืืื ืืคืขืื. Camunda ืืกืคืงืช REST API ืืืืคืฉืจ ืื ืืืชืื ืืื ืฉืคื ืฉืชืจืฆื ืืืืฉืชืืฉ ื-REST ืขื Camunda:
ืืจืืืืช ืขืืืื ืืงืืื ืื ืืืืืจืืช ื-BPMN, ืฉืืื ืืขืฆื ืงืืืฅ XML. ืืคืฉืจ ืืขืฆื ืืืชื
ืืคืขืืช Camunda ืืจื ืชืืื ืช Docker ืื ืืื ืืจืืฉ
ืืืจื ืืงืื ืืืืชืจ ืืืคืขืื ืืช Camunda ืืื ืืืฉืชืืฉ ื-Docker. ืืจืืื ืืืืคืืืช ืืืคืขืืช Camunda ืืชืืืจืืช ืืืืฉื ืืืืจ ืื.
ืืืงืจื ืื, ืคืฉืื ืืคืขื:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
ืืชื ืื ืฆืจืื ืืืืื ืืืื ืืื ืืงืก, JVMs ืื Tomcats. ืงืืฆื Docker ืืชืืขืื ืืกืืกื (ืืืืืื, ืืืจืืืช ืืืืืืจ ืืืกืืกื ืื ืชืื ืื ืื ืืจืฉืื) ืืืื ืื ืืืชืืืช
ืื ืืชื ืจืืฆื ืืืคืขืื ืืช Camunda Enterprise Edition ืืชื ืืืื ืืงืืืช ืืฉื ืืช
ืขื ืืืช, ืืืจืฆืช Camunda ืขื Docker ืืฉ ืืืกืจืื ืืื: ืืกืืคื ืฉื ืืืจ ืชืืื ืื ืืจืกื ืฉื Tomcat ืฉืื ืชืืื ืืืืืช ืืช ืืชืืงืื ืื ืืืืจืื ืื. ืืื ืืขืงืืฃ ืืืช, ืืชื ืืืื ืืืฆืืจ ืชืืื ืช Docker ืืฉืื ืืืชืืกืก ืขื ืืคืฆืช Tomcat ืืจืฆืืื, ืืคื ืฉืืืฆื ืืืืืื ืื, ืื ืืืฉืชืืฉ ืืืื ืืืคืชืจืื ืืช ืืืชืืืจืื ืืืื.
ืคืจืืกืช ืืืื ืชืืืื
ืืื ื ืกืชืื ืขื ืืืืื ืืืืฆืขืืช ืชืื ืืช Saga ืขืืืจ ืืืื ืช ืืืื ืงืืืกืืช ืฉืื ืืชื ืจืืฆื ืืืคืขืื ืฉืืืฉ ืคืขืืืืช ืืจืฆืืคืืช ืืืคืฆืืช ืืื ืขื ืคืขืืืืช ืฉืืืฉืืื ืืืฆืืื ืืืงืจื ืฉื ืืฉื ืืืืืจ ืืืชืจ. ืืืืฆื ืืฆืืจืช BPMN, ืื ื ืจืื ืื:
ืขืืฉืื ืืชื ืืืื ืืืฉืชืืฉ
curl -w "n"
-H "Accept: application/json"
-F "deployment-name=trip"
-F "enable-duplicate-filtering=true"
-F "deploy-changed-only=true"
-F "[email protected]"
http://localhost:8080/engine-rest/deployment/creat
ืขืืฉืื ืืชื ืืืื ืืจืืฅ
curl
-H "Content-Type: application/json"
-X POST
-d '{"variables":{"someData" : {"value" : "someValue", "type": "String"}},"businessKey" : "12345"}}'
http://localhost:8080/engine-rest/<!-- -->process-definition/key/<!-- -->FlowingTripBookingSaga<!-- -->/start
ืืฉืืื ืืืขื ืืื ืช ืืืื ืืื: ืืื ืงืืื ืื ืืื ื ื ืืืื ืืื ืืืื ืช ืจืื? Camunda ืื ืืืื ืจืง ืืืชืงืฉืจ ืืฉืืจืืชืื ืืืืคื ืืืืื (Push-Principle) ืืืืฆืขืืช ืืืง ืืืื ื
ืื ืงืืื ืื ืืชื ืฆืจืื ืืืฆืข
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123","maxTasks":1,"usePriority":true,"topics":[{"topicName": "reserve-car"}, "lockDuration": 10000, "variables": ["someData"]}]}'<!-- -->
http://localhost:8080/engine-rest/external-task/fetchAndLock
ืื ืชืืื ืืช ืื ืืงืืื ืื
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- -->
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete
ืืื - ืขืืืื ืื ืืืืช ืฆืจืื ืฉืื ื'ืืืื, ื ืืื? ืืื ืืกืคืืง ืืื ืืืชืืื!
ืกืคืจืืืช ืืงืืืืช
ืงื ืืงืจืื ื- REST API ืืื ืฉืคืช ืชืื ืืช. ื-JavaScript, ืื ื ืขืฉื ืืฆืืจื ื ืืื ืืืืฆืขืืช JQuery, ืื-C#, ืืืืฆืขืืช System.Net.Http ื- Newtonsoft.Json. ืืื ืื ืืืงื ืืื. ืื ืืชื ืืืื ืคืฉืื ืืืฉืชืืฉ ืืืืื ืกืคืจืืืช ืืงืื.
ืืจืืข, ืืกืคืจ ืกืคืจืืืช ืืงืืืืช ืืืื ืืช ืืืื ืืช:
- javascript:
ืงืฉืจ . ื ืชืื ืขื ืืื Camunda; - Java you
ืงืฉืจ . ื ืชืื ืขื ืืื Camunda; - C #:
ืงืฉืจ ะธืงืฉืจ . ืฉื ื ืืคืจืืืงืืื ืืืื ื ืืฆืืื ืืืฆื ืืื ืืื ืืืืขืฉื ืจืืืืื, ืื ืืืืืื ืืฉืืฉ ืื ืงืืืช ืืชืืื ืืืื; - PHP:
ืงืฉืจ - ืื ืฉืื ืืื ืืืื ื ืืืื ืืช ืืฉืื ืืืื ืืืืจืื ืื ื-API, ืืื ืื ื ืืืืจ ืคืจืืืงืืื ืฉืืฉืชืืฉืื ืื.
ืืืขื JavaScript ื-Java, ืกืคืจืืืช ืืืงืื ืืื ื ืืืง ืืืืฆืจ Camunda ืขืฆืื. ืื ืชืฆืคื ืืื ืืชืืื ืืื ืชืืื ืืช ื-REST API ืฉื Camunda. ืื ืฉืกืคืจืื ืื ืืกืคืงืช ืคืื ืงืฆืื ืืกืืืืช ืื ืืืืจ ืฉืืื ืื ืฉื, ืืืืง ืชืืื ืืช REST API ืฉื Camunda. ืคืจืืืงืื ืขืืื ืืฉืชืืฉืื ืืกืคืจืืืช ืื ืงืืืช ืืชืืื ืืืชืื ืืช.
ืืืืื C#
ืืืืฆืขืืช ืกืคืจืืืช ืืืงืืืืช ืืขืื, ืื ื ืืืืืื ืคืฉืื ืืืชืื:
var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
// Deploy the BPMN XML file from the resources
camunda.RepositoryService.Deploy("trip-booking", new List<object> {
FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
});
// Register workers
registerWorker("reserve-car", externalTask => {
// here you can do the real thing! Like a sysout :-)
Console.WriteLine("Reserving car now...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
registerWorker("cancel-car", externalTask => {
Console.WriteLine("Cancelling car now...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
registerWorker("book-hotel", externalTask => {
Console.WriteLine("Reserving hotel now...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
// Register more workers...
StartPolling();
string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary<string, object>()
{
{"someBookingData", "..." }
});
ืืช ืงืื ืืืงืืจ ืืคืืขื ืืืืืื ื ืืชื ืืืฆืื ืืืื ืืจื ื:
ืืืืื ืขื Node.js
var Workers = require('camunda-worker-node');
var workers = Workers('http://localhost:8080/engine-rest', {
workerId: 'some-worker-id'
});
workers.registerWorker('reserve-car', [ 'someData' ], function(context, callback) {
var someNewData = context.variables.someData + " - added something";
callback(null, {
variables: {
someNewData: someNewData
}
});
});
workers.shutdown();
ืืืืข ื ืืกืฃ ื ืืชื ืืืฆืื ืืืชืจ
ืืจืืื ืืืืคืืืช ืืืคืขืืช Camunda
ืชืืื ืช Docker ืืืชืืืช ืืืฉืืช ืขื "Camunda WAR ืขืฆืืืืช"
ืืืืืคื ืืชืืื ืช Docker ืฉื ืื ืชื ืืจืืฉ ื-Camunda, ืืชื ืืืื ืืืืื ืืช Tomcat ืืขืฆืื (ืืืืืื, ืขื ืกืื ืืชืืื ืืช ืืจืฉืืืืช ืฉื Docker Tomcat) ืืื ืืืขืชืืง ืืช Camunda ืืชืืื ืืืื ืืืงืืฆืื ืฉื ืงืจืืื WAR.
ืื ืืฉ ืื ืืจืืฉืืช ื ืืกืคืืช ืจืืืช ืืืชื ืืืื ืืืืืืจ ืกืืืืช ืื ืืื ืฉื Java, ืืชื ืืืื ืื ืืืืืืจ ืืช Camunda Standalone War. ืืืืจ ืืื ื ืฉื Maven ืืื ืืืืืืืืช ืืืืืช: build
ืืชืืืช ืืคืฆืช Camunda Tomcat
ืืคืฉืจืืช ื ืืกืคืช ืืื ืคืฉืื ืืืืจืื ืืช ืืคืฆืช Camunda Tomcat, ืืคืชืื ืืืชื ืืืืคืขืื ืืืชื. ืื ืืืจืฉ ืจืง ืืช Java Runtime Environment (JRE) ืืืืชืงื ืช ืืืืฉื ืฉืื. ืื ืืืื ืืืืืช ืืงืืืช
ืืื ืืฉื ืืช ืืช ืืกื ืื ืชืื ืื ืื ืืขืฉืืช ืื ืืืจ ืืืจ, ืืชื ืฆืจืื ืืืืืืจ ืืช Tomcat like
ืืคืขืืช Camunda ืืืืฆืขืืช Tomcat
ืืืืืจื ืืืื ืืืืจืื ื ืืื ืืืืืืจ ืืช Tomcat ืืขืฆืื ืืืืชืงืื ืื ืืช Camunda,
ืืฉืงืช ืงืืืื ืื ืืืืฆืืจ
ืื ืืืจื ืืื ืืืจืืฉ ืืืืจื ืกืืคืืช ืืืฉืื ืืื ืืืคืขืื ืืช Camunda. ืืฉื ื ืื ืืืืช ืืงืืื ืื ืฉืืชืืจืืช ืืืช ืืคืืจืื ืจื, ืื ืื ืืื ืก ืืืืื ืืืืืจ ืื โ ืืฆืืื ืจืง ืืืืื ืืืช: REST API ืฉื ืืืคืฆื ืืื ื ืืืืืจ ืืืืืืช ืืืจืืจืช ืืืื. ืืืื ืชืจืฆื ืืฉื ืืช ืืืช.
ืืกืืืื ืฉืื
ืืคื ืฉืืชื ืืืื ืืจืืืช, ืงื ืืืื ืืืชืืื ืขื Camunda, ืืื ืงืฉืจ ืืฉืคื ืฉืื ืืชื ืืฉืชืืฉ. ื ืงืืืช ืืืคืชื ืืื ืฉืื ืืืื ืืจืืงืฆืื ื ืขืฉืืช ืืจื REST API. ืื ืืืชืงื ื ืื ืงืื, ืืืืืื ืืขืช ืฉืืืืฉ ื- Docker.
ืืงืืจ: www.habr.com