αα½ααααΈ α αΆα! αααα»αααΌααααα αΆαααΌαα’αααααΌαααΆαααααααα’ααααα
ααααααΈ 07.07.2020/XNUMX/XNUMX, ααΆααααααα
ααΆααΏαααααα»ααα·ααΆααααΆα’αααΈααααΆααααααααααΈααααΌααααΆααααααΆαα½αααα»αααααααα·ααααααΆα αΆαααΆα C# α’αααα’αα·αααααα Node.JS/JavaScript α¬α’ααααααα αΌαα α·ααα Golang α αα½αααααΆααα’ααααααΌαααααααα»αααΉαααΆααα·ααααααΆαα½αααααααΌαααΆααααΆαααΈα orchestration αα αααα»αααααΆααααααααααΈααααΌααααΆαααα α¬ααααΆααααααΆα§αααααααΎααααΈαααααΎαααααα·αααααΆαααα αΌαααΆαααΆα αα·αααα½αααΆααααααααΆααααα»αααΆααααααΆαα·α αααααααΆαααΆαα’ααααα Saga αα·αααααα·ααααα·ααΆαααΌααΆααααααα
αααα·ααΆ BPM ααΆαα½α
αα! ααΆααΆααα·α α’αααα’αΆα ααααΎαααΆα Camunda αααΆαααΆααααα½αααααα·αα αΆαααΆα αααΆαα ααααααΉα Java αα·αααααααα ααΆααααααααααααΆαααααααααα ααΆααΌαααΆααΆααΆααΆαα½ααααααααΎαααααα’αααα αα αααα»αα’ααααααααααΎαααΉααα·αα·αααααΎα:
- ααααΆααααααααααΌαααααΆα;
- REST API;
- ααααΌααααΆαααΎαααααΆαααα’αα·αα·αααααααΆαααααΆαααααααΆααααΆααΆααααααααα ααΈ Java;
- α§ααΆα αααααααΆαααααΎααααΆαα C# αα·α Node.JS;
- αα·ααΈααΎααααΈααααΎαααΆααααΆαααΈααα Camunda (Docker α¬ Tomcat) α
ααααΆαααααααα
Camunda ααααΌαβααΆαβαααααβααΆβααΆααΆ Java α αΎαβαααααΌαβα±ααβααΆα Java Virtual Machine (JVM) ααΎααααΈβααααΎαααΆαα Camunda ααααα REST API αααα’αα»ααααΆαα±ααα’ααααααααααΆααΆααΆααΆαα½ααααα’αααα αΌαα α·ααα αα·αααααΎ REST ααΆαα½α Camundaα
ααα αΌαααΆαααΆααα
αααα»α Camunda ααααΌαααΆαααααααα
αααα»α BPMN αααααΆα―αααΆα XML ααΆααΌαααααΆαα ααΆα’αΆα
ααααΌαααΆαααααΎααααΌαααααααΎ
αααα»αααααΎαααΆα Camunda ααΆααααααΌαααΆα Docker ααααααααΎαααΆαα»α
αααααααΆαααΆααααα½ααααα»αααΎααααΈααααΎαααΆα Camunda ααΊααααΌαααααΎ Docker α αα·ααΈαααα½αααΎααααΈααααΎαααΆα Camunda ααααΌαααΆααα·αααααΆαα αααααααααα αααα»αα’ααααααααα
αααα»αααααΈαααααααΆαααααααα
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
α’ααααα·αα
αΆαααΆα
ααααα½αααΆααααα’αααΈ Linux, Java Virtual Machines α¬ Tomcats ααα Dockerfiles αα·αα―αααΆαααΌαααααΆα (α§ααΆα ααα ααΆαααααΆααααααΆααααααΆαααα
ααΌαααααΆααα·αααααααααααααΌαααΆα) ααΆααα
ααααα·αααΎα’αααα
ααααααΎαααΆα 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 ααααβα±ααβααΆαβααΈαα·αα·ααΈβααΌα
βααΆαβαααβααααααβαααΆαβααΌα
βααααα
? 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
αα½α
βααααΆαα 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 α ααα»αααααααααΉαααααΌαααΆααααααααΆα ααΌα αααα α’αααααααΆααααα’αΆα ααααΎαααααΆαααα’αα·αα·αααα½αα ααα½αααα»αααααα
αα αα α»ααααααααΆααααααΆαααα’αα·αα·αααααααααααα½α ααΆααααα ααΆα αααΎααααα’αΆα ααααΆαα
- JavaScriptα
ααα . ααΆααααααα Camunda; - α
αΆαααΆα
ααα . ααΆααααααα Camunda; - C #:
ααα ΠΈααα . ααααααααΆααααΈαααααααα·ααααα»αααααΆαααΆαααααα α αΎαααααΎαααααααΆααααααααΆα ααα»ααααα’αΆα αααααΎααΆα ααα»α α αΆααααααΎαααααα’α - αααααα·ααΈ PHP:
ααα αα·αβαααβααΆβαααααΆαααβααααααβαα α αΎαβαα·αβαα½αβαααα αΌαβααΆαβααααΆααααααΌα API α α»ααααααβαααα’ααβαααβαα ααα»ααααβαααα»αβααΉαβα’αααΈβααααααβαααβααααΎβααΆα
ααΆαα½αααΉαααααΈααΎαααααα JavaScript αα·α Java αααααΆαααα’αα·αα·αααα·ααααααΆαααααααααα·ααα Camunda αααα½αα―ααααααα αα»αααααΉαααΆαα½αααααΉαααΆαααααα»αααΆα REST API ααΆααα’αααααα Camunda α αααααΆααααααΆααααα·αααααααα»αααΆαααΆααααΆαααα·αααΆααααααΆααΆαα·ααα ααΈααααα ααΌααα·αα·αααααΎα Camunda REST API ααΆαα·α αα α ααααααααααααΆααααΎαααααΆαααααΆα ααα»α α αΆααααααΎα αα·αααααΌα
α§ααΆα αααααΆαα½α 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 standalone WAR"
ααΆαααααΎααα½ααααααΆααααΌαααΆα Docker ααααααααΎααα»αααΈ Camunda α’αααα’αΆα αααα α Tomcat ααααααα½αα―α (α§ααΆα ααα αααααα’ααααΎααΌαααΆα Docker Tomcat ααααΌαααΆα) α αΎααααααΆααααα αααα Camunda α αΌααα αααα»αααΆααΆααααααα½αααα’αααΈαααααα α ααΆα―αααΆα WAR α
ααααα·αααΎα’αααααΆααααααΌαααΆαααααααααΆα
αααΎα α αΎαα’αΆα
ααααΌαααα·ααΆααΆααααααΎα Java ααΆααααα α’αααααα’αΆα
ααααααα
ααΆαααααααα Camunda Standalone war αααααα αααα
α Maven build ααΌα
αααα»αα§ααΆα αααααΆαααααα build
ααΎαααααΎαααΆαααΆαα ααα αΆα Camunda Tomcat
αααααΎααα½ααααααΊααααΆααααααΆαααααΆαα
ααα
αΆα Camunda Tomcat αα½α
αααααΆααΆ α αΎαααααΎαααΆαααΆα ααΎααααΈααααΎααΌα
αααα’αααααααΆααααααααΌαααΆα Java Runtime Environment (JRE) αααααΆαααα‘αΎααα
ααΎαα»αααααΌαααααααα’αααα ααΆα’αΆα
ααΆαααΆαααΆααααα½α
ααΎααααΈααααΆααααααΌαααΌαααααΆααα·αααααα α¬ααααΎα’αααΈαααααααα α’αααααααΌαααααααα
ααΆαααααααα Tomcat ααΌα
ααααΎαααΆα Camunda αααααααΎ Tomcat
αααααΎαα
α»ααααααααΊααααααα
ααΆαααααααα Tomcat ααααααα½αα―α α αΎαααα‘αΎα Camunda αα
αααα»αααΆ
ααΆαβα αΆααβααααΎαβααα·αβαααα Camunda
ααΆααααααΆ ααΆααΉααααααΌαα±ααα’αααααααΎααΆαααα‘αΎαα α»αααααααα½αα ααα½α ααΎααααΈααααΎαααΆα Camunda α Camunda ααΆαααΆαααααΆαααααα·αααααΆα’αααΈααΏαααααααΆααααα’α·α ααα»αααααααα»αααΉααα·αααααα½αααΆαα αααα»αα’αααααααααα - αααα»αααΉααααααα§ααΆα ααααα½αα REST API ααααΆαα ααα αΆααα·αααααΌαααΆαααααααααααΆααααΆααααααααααΆααααΆαααααΆαααΎαααα α’ααααααα ααααΆα ααααααΆααααααΌαααΆα
αααααα
ααΌα αααα’ααααααα ααααΆααΆαααααααααΆαα ααΆαα αΆααααααΎαααΆαα½α Camunda ααΊααΆααααα½αααΆαα ααααα·ααα·αααΈααΆααΆαααα’αααααααΎα α ααα»α ααααΆααααΊααΆααααΆααααααααΆααα’ααααααΌαααΆαααααΎααΆαααα REST API α ααΆαααα‘αΎαααααΆααααααααα ααΆαα·ααααα αααααααΎ Docker α
ααααα: www.habr.com