áá±áž áá¬á! áá±á¬ááºážáá«ážáá²á· áá¬áá¬ááŒááºáá»ááºááᯠáááºážáá²á·á¡á¬áá¯á¶ááᯠáá«áááºááŒáááºá
áá/á/ááááá áá¬áá¬ááŒááº
áá»áœááºá¯ááºááẠJava ááá¯ááºáá±á¬áá°áá»á¬ážááŸáá·áº microservice áááºáá±á¬ááºáá¯á¶ááᯠáááŒá¬áá ááœá±ážááœá±ážáá±á·ááŸááááº- C# developerá Node.JS/JavaScript developer ááá¯á·ááá¯áẠGolang aficionadosá áááºážááá¯á·á¡á¬ážáá¯á¶ážááẠááá¯ááºáááá¯áááºáá±á¬ááºááŸá¯áááá¯áá¬ááœáẠá á¯á ááºážááŸá¯ááá¹ááá¬ážáá áºáᯠááá¯á¡ááºááẠááá¯á·ááá¯áẠá¡áá¯ááºá¡ááœá¬ážá¡áá¬ááᯠáá»á±á¬ááœá±á·á á±ááŒá®áž á¡áááá·áºáá±ážááŒááºážá á¡áá»áááºáá¯ááºááŒááºážáá»á¬ážááᯠááá¯ááºááœááºááá¯ááºááŒááºážá Saga ááŸáá·áº áá»á±á¬áºááŒá±ážáá±ážááá·áº á¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºááŒááºážááá¯á·ááᯠáá¯ááºáá±á¬ááºááá¯ááºááá·áº áááááá¬áá áºáá¯áá»áŸáᬠááá¯á¡ááºáááºáá°áá±á¬á¡áá»ááºááŸáá·áº áááºááá¯ááºáá±ááŒááááºá
BPM ááááºáá±á¬ááºážááŸáá·áºá¡áá°
ááá¯ááºáá°áž! ááááºáá±á¬á·á áááºááẠáááºááá·áº Java á¡ááááá¬á០áááŸááá² Camunda ááᯠá¡ááœááºááá° á¡áá¯á¶ážááŒá¯ááá¯ááºááŒá®áž áááºááŸá áºáááºáᬠáá¬áá¬á áá¬ážááŒáá·áº áá¯ááºá¡ááœáẠáááá¯áá¬áááºáá¬ááᯠáááºáá±á¬ááºááá¯ááºáááºá á€áá±á¬ááºážáá«ážááá»áœááºá¯ááºááá¯á·áááºááŒáá·áºááŸá¯áá«áááº:
- á¡ááŒá±áá¶áááá¯áá¬á
- REST API
- Java ááŸááœá²á á¡ááŒá¬ážáá¬áá¬á áá¬ážáá»á¬ážá¡ááœáẠááŸáááŒá®ážáá¬áž client libraries áá»á¬ážááá¯ááºáᬠá¡ááŒá¶áá¬ááºáá»á¬ážá
- á¥ááᬠC# ááŸáá·áº Node.JS ááá¯á¡áá¯á¶ážááŒá¯áááºá
- Camunda áá¬áᬠ(Docker ááá¯á·ááá¯áẠTomcat) á áááºááẠáááºážáááºážáá»á¬ážá
áááá¯áá¬á¡áááºááá¬
Camunda ááᯠJava ááŒáá·áºáá±ážáá¬ážáá¬ážááŒá®áž run ááẠJava Virtual Machine (JVM) ááá¯á¡ááºáá«áááºá Camunda ááẠáááºááŸá áºáááºáá±á¬ áááºááá·áºáá¬áá¬á áá¬ážááŒáá·áºáááᯠáá±ážáá¬ážááá¯ááºááŒá®áž Camunda ááŒáá·áº REST ááᯠá¡áá¯á¶ážááŒá¯ááẠááœáá·áºááŒá¯ááá·áº REST API ááᯠáá¶á·ááá¯ážáá±ážáááº-
Camunda ááŸá á¡áá¯ááºá¡ááœá¬ážá¡áá¬áá»á¬ážááᯠá¡ááŒá±áá¶á¡á¬ážááŒáá·áº XML ááá¯ááºááŒá
áºááá·áº BPMN ááœáẠáááºááŸááºáá¬ážáááºá ááŒáá·áº áá¯á¶áá±á¬áºááá¯ááºáá«áááºá
ááŒáá¯áááºáááºáá±á¬ááºáá¬ážáá±á¬ Docker áá¯á¶ááŸáááá·áº Camunda ááᯠáá¯ááºáá±á¬ááºááŒááºážá
Camunda ááᯠrun ááẠá¡ááœááºáá¯á¶ážáááºážáááºážááŸá¬ Docker ááá¯áá¯á¶ážáááºááŒá áºáááºá Camunda ááá¯ááœáá·áºááẠá¡ááŒá¬ážáááºážáááºážáá»á¬ážááᯠá€áá±á¬ááºážáá«ážááœáẠáá±á¬ááºááá¯ááºážááœáẠáá±á¬áºááŒáá¬ážáá«áááºá
á€ááá á¹á ááœááºá ááá¯ážááŸááºážá áœá¬ run áá«á
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Linuxá JVM ááá¯á·ááá¯áẠTomcats á¡ááœáẠá
áááºáá°á
áá¬áááá¯áá«á Dockerfiles ááŸáá·áº á¡ááŒá±áá¶á
á¬ááœááºá
á¬áááºážáá»á¬áž (á¥ááá¬á ááá¯á¡ááºáá±á¬áá±áá¬áá±á·á
áºáá»á¬ážááá¯á· áá»áááºáááºáááºá¡ááœáẠáááºážááœáŸááºáá»ááºáá»á¬áž) ááᯠááœááºáááá¯ááºáááºá
Camunda Enterprise Edition ááᯠá¡áá¯á¶ážááŒá¯ááá¯áá«á á¡ááœááºááá° ááŒá±á¬ááºážáá²ááá¯ááºáá«áááºá
ááá¯á·áá±á¬áºá Docker ááŒáá·áº Camunda ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááœáẠá¡á¬ážáááºážáá»ááºáá áºáá¯ááŸááááº- áááºá¡ááŒá²áááºážáá±á¬ááºáá¯á¶ážááŒááºáááºááŸá¯áá»á¬ážááá«áááºááá·áº Tomcat áá¬ážááŸááºážáá áºáá¯ááŒáá·áº á¡áá¯á¶ážáááºáááºááŒá áºáááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá¡ááœáẠáááºááẠá€á¥ááá¬ááœááºááŒáá¬ážááá·áºá¡ááá¯ááºáž á¡ááá¯ááŸááá±á¬ Tomcat ááŒáá·áºááŒá°ážááŸá¯á¡áá±á«áºá¡ááŒá±áá¶á ááá·áºááá¯ááºááá¯áẠDocker áá¯á¶ááᯠáááºáá®ážááá¯ááºáááºá ááá¯á·ááá¯áẠá¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ ááŒá±ááŸááºážáá»ááºáá áºáá¯á¡á¬áž á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá¯ááºáááºážá ááºáá¯á¶á ᶠááŒáá·áºáá»ááºááŒááºážá
áááºáá¯ááºáá±á¬ááºááŸá¯ áá¯á¶ážáá¯ááᯠáááºááá¯ááºáá¯ááºáá±á¬ááºáááºááŸáá·áº áá±á¬ááºááá¯ááºážáá»ááŸá¯á¶ážááŸá¯áá áºáá¯ááœáẠá¡á±á¬ááºááŒááºáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááŸáá áœá¬áá»á±á¬áºááŒá±ážáá±ážááá¯ááá·áº ááá¹ááááºááá®ážááœá¬ážááœááºáááºá¡ááœáẠ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
ááá¯ááẠrun ááá¯ááºáááºá
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 á áá¬ážáá
áºá
á®ážááŒáá¯áááºá
á¬áááºážááœááºážááŒááºážááá¯áá»áá¯áž áá¯ááºáááºážá
ááºááœá±ááᯠáááºááá¯áá±á«áºáá¬áá²á Camunda ááẠá¡áá»áá¯á·áá±á¬ built-in ááá¯á¡áá¯á¶ážááŒá¯á áááºáá±á¬ááºááŸá¯áá»á¬áž (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
ááŒá®ážááẠCamunda ááá¯ááŒá±á¬ááŒáá«á
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- -->
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete
áá«áá² - áááºáž Java áááá¯á¡ááºáá±ážáá«áá°áž áá¯ááºáááºááá¬áž á á áááºáááºáá¯á¶áá±á¬ááºáá«áááºá
ááá¯ááºážá á¬ááŒáá·áºááá¯ááºáá»á¬áž
REST API ááá¯áá±á«áºááá¯ááŒááºážááẠáááºááá·áºáááá¯ááááºážáááºážáá¬áá¬á áá¬ážááŒáá·áºáááᯠááœááºáá°áá«áááºá JavaScript ááœááºá áááºážááᯠJQuery ááá¯á¡áá¯á¶ážááŒá¯á C# ááœááºá System.Net.Http ááŸáá·áº Newtonsoft.Json ááá¯á¡áá¯á¶ážááŒá¯á á¡áááºááŒá±á áœá¬áá¯ááºáá±á¬ááºááá¯ááºáááºá áá«áá±ááá·áº áá«á á¡áá»áááºáá°ááááá·áºáááºá ááá¯á·ááŒá±á¬áá·áº áááºááẠá¡áá»áá¯á·áá±á¬ client á á¬ááŒáá·áºááá¯ááºááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá±á¬áá±á¬áááºááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ áá±á¬ááºááẠáá áºáá»á áºááá¯ááºáá»á¬ážá áœá¬ááᯠáááá¯ááºáááº-
- JavaScript-
link ááᯠ. Camunda ááŸáá¶á·ááá¯ážáá°áá®áááº; - áá»á¬áá¬áž:
link ááᯠ. Camunda ááŸáá¶á·ááá¯ážáá°áá®áááº; - C #:
link ááᯠОlink ááᯠ. á€ááá±á¬áá»ááºááŸá áºáá¯á áá¯á¶ážááẠá¡áááºá¡áááºá¡ááŒá±á¡áá±ááœááºááŸáááŒá®áž áááºááœá±á·á¡á¬ážááŒáá·áº ááŒáááºáá±áá±á¬áºáááºáž áá±á¬ááºážááœááºáá±á¬á¡á ááŸááºá¡ááŒá Ạáá¯ááºáá±á¬ááºááá¯ááºáááºá - PHP ááá¯:
link ááᯠ- ááááºááŒá®ážááŒáá·áºá á¯á¶ááœááºážááŒá®áž áá±á¬ááºáá¯á¶áž API á¡ááŒá±á¬ááºážá¡áá²ááœá± ááá«áááºáá±ááá·áº á¡á²áá«ááᯠá¡áá¯á¶ážááŒá¯áá²á· ááá±á¬áá»ááºááœá±ááᯠáááá«áááºá
JavaScript ááŸáá·áº Java ááŸááœá²á áá¯á¶ážá áœá²áá°á á¬ááŒáá·áºááá¯ááºáá»á¬ážááẠCamunda áá¯ááºáá¯ááºááá¯ááºááá¯ááºá០ááá«áááºáá«á Camunda á REST API á¡ááºá¹áá«áááºá¡á¬ážáá¯á¶ážááᯠáá¶á·ááá¯ážáá±ážááẠáááºážááá¯á·ááᯠááá»áŸá±á¬áºááá·áºáá«ááŸáá·áºá áá áºáá»á áºááá¯ááºáá áºáá¯ááẠá¡áá»áá¯á·áá±á¬áá¯ááºáá±á¬ááºáá»ááºááᯠáá¶á·ááá¯ážááá±ážáá±á¬ááŒá±á¬áá·áº áááºážááẠááá¯áá±áá¬ááœááºáááŸááᯠáááá¯ááá¯áá«á Camunda á REST API ááᯠá¡ááŒá²á á áºáá±ážáá«á á¡ááá¯ážá¡áá¬ážááá±á¬áá»ááºáá»á¬ážááẠá á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠá ááŸááºááŸáá·áº áá¯á¶á á¶ááœááºá¡ááŒá Ạá¡áá¯á¶ážááŒá¯áááºá
C# á¥ááá¬
á¡áááºáá±á¬áºááŒáá« client á á¬ááŒáá·áºááá¯ááºááᯠá¡áá¯á¶ážááŒá¯á ááá¯ážááá¯ážááŸááºážááŸááºáž áá±ážáá¬ážááá¯ááºáááº-
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();
ááá¯ááá¯ááááŸáááá¯áá«á website ááœááºááŸá¬ááœá±á·ááá¯ááºáá«áááºá
Camunda ááᯠá áááºááẠá¡ááŒá¬ážáááºážáááºážáá»á¬áž
"Camunda standalone WAR" ááŒáá·áº á áááºááŒáá¯áẠDocker áá¯á¶
Camunda ááŸááŒáá¯áááºáááºáá±á¬ááºáá¬ážáá±á¬ Docker áá¯ááºáá¯á¶á¡ááœáẠá¡ááŒá¬ážááœá±ážáá»ááºá áá¬á¡ááŒá áºá áááºááẠTomcat ááᯠáááºááá¯ááºááá¯áẠááŒááºáááºááá¯ááºááẠ(á¥ááá¬á ááá¬ážááẠDocker Tomcat áá¯á¶áá»á¬ážááᯠá¡ááŒá±áá¶á) ááá¯á·áá±á¬áẠCamunda áá¯áá±á«áºáá±á¬ WAR ááá¯ááºáá»á¬ážáá²á០áá áºáá¯á¡ááŒá Ạáááºážááᯠáá°ážáá°ááá¯ááºáááºá
ááá·áºááœáẠáá±á¬ááºáááºááá¯á¡ááºáá»ááºáá»á¬ážá
áœá¬ááŸáááŒá®áž Java áááºáá±á¬ááºááŸá¯áááºáááºážáá»ááºááᯠáááºááŸááºááá¯ááºáá«áá áááºááẠCamunda Standalone á
á
áºááœá²ááá¯áááºáž ááá·áºááœááºážááá¯ááºáááºá á€á¥ááá¬áá»á¬ážááœááºáá²á·ááá¯á· Maven áááºáá±á¬ááºááŸá¯ááᯠáááºááŸááºáá«- build
Camunda Tomcat ááŒáá·áºááŒá°ážááŸá¯ááᯠá áááºááŒááºážá
á¡ááŒá¬ážááœá±ážáá»ááºá
áá¬ááŸá¬ Camunda Tomcat ááŒáá·áºááŒá°ážááŸá¯ááᯠáá±á«ááºážáá¯ááºáá¯ááºáᬠáá
áºááœáá·áºááŒá®áž áááºážááᯠáá¯ááºáá±á¬ááºáááºááŒá
áºáááºá áááºážááẠááá·áºááœááºáá»á°áá¬áá±á«áºááœáẠááá·áºááœááºážáá¬ážáá±á¬ Java Runtime Environment (JRE) ááá¯áᬠááá¯á¡ááºáááºá á¡ááœááºááá°ááŒá
áºááá¯ááºáá«áááºá
áá±áá¬áá±á·á
áºááá¯ááŒá±á¬ááºážááẠááá¯á·ááá¯áẠá¡ááŒá¬ážáááºááá·áºá¡áá¬áááá¯áá¯ááºáááºá¡ááœáẠTomcat áá²á·ááá¯á· configure áá¯ááºááẠááá¯á¡ááºáááºá
Tomcat ááᯠá¡áá¯á¶ážááŒá¯á Camunda ááᯠáá¯ááºáá±á¬ááºááŒááºážá
áá±á¬ááºáá¯á¶ážáááºážáááºážááŸá¬ Tomcat ááᯠáááºááá¯ááºááá¯ááºáááºáá±á¬ááºááŒá®áž Camunda ááœáẠááá·áºááœááºážáááºááŒá
áºáááºá
Camunda ááᯠáá¯ááºáá¯ááºááŸá¯á¡ááŒá Ạá áááºááá¯ááºáá«á
áááºážááẠCamunda ááá¯áááºáááºáááºá¡ááœáẠáá±á¬ááºáá¯á¶ážá¡ááá·áºáááºááŸááºááŸá¯á¡áá»áá¯á· ááá¯á¡ááºáá«áááºá áá«ááᯠá¡áá±ážá áááºáá±á¬áºááŒáá¬ážáá²á· Camunda ááŸá¬ áááºážááœáŸááºáá»ááºááœá± ááŸááá«áááºá áá«áá±ááá·áº áá®áá±á¬ááºážáá«ážááŸá¬ áá»áœááºáá±á¬áº ááá«áá«áá°áž - á¥ááá¬áá áºáá¯áᬠáá±á¬áºááŒáá«áááº- ááŒáá·áºááŒá°ážááŸá¯á REST API ááᯠáá°áááºážá¡ááá¯ááºáž á á áºááŸááºááŒá±á¬ááºážá¡áááºááŒá¯áááºá¡ááœáẠááŒááºáááºááá¬ážáá«á áá«ááᯠááẠááŒá±á¬ááºážáá»ááºááá¯ááºáááºá
áááºááá»áŒážááŒá¯áá»
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºáž áááºá¡áá¯á¶ážááŒá¯áá±ááá·áºáá¬áá¬á áá¬ážááᯠáááœá²ááŒá¬ážáá² Camunda ááŸáá·áº á áááºááẠá¡ááœááºááœááºáá°áá«áááºá á¡áááá¡áá»ááºááŸá¬ á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯á¡á¬ážáá¯á¶ážááᯠREST API ááŸáá áºááá·áº áá¯ááºáá±á¬ááºááŒááºážááŒá áºáááºá á¡áá°ážáááŒáá·áº Docker ááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«ááœááºááá·áºááœááºážááŒááºážáááºá¡ááœááºááœááºáá°áááºá
source: www.habr.com