ืืขืื, ืืืืจ! ืืื ืคืึธืจืฉืืขืื ืฆื ืืืื ืืคืืขืจืงืืึทืืงืืึทื ืึท ืืืืขืจืืขืฆืื ื ืคืื ืืขื ืึทืจืืืงื
07.07.2020/XNUMX/XNUMX, ืืืืขืจืืขืฆืื ื
ืืื ืึธืคื ืืืกืงืืืืจื ืืืงืจืึธืกืขืจืืืืก ืึทืจืงืึทืืขืงืืฉืขืจ ืืื ื ืื-ืืืฉืึทืืืึท ืืขื ืืฉื: C #, Node.JS/JavaScript ืืขืืืขืืึธืคึผืขืจืก ืึธืืขืจ Golang ืขื ืืืืืึทืกืฅ. ืึทืืข ืคืื โโืืื ืืขื ืขื ืคืืืกื ืืื ืื ืคืึทืงื ืึทื ืืื ืืึทืจืคึฟื ืึทื ืึธืจืงืขืกืืจืึทืืืึธื ืืึธืืึธืจ ืืื ืึท ืืืงืจืึธืกืขืจืืืืก ืึทืจืงืึทืืขืงืืฉืขืจ ืึธืืขืจ ื ืึธืจ ืึท ืืขืฆืืึทื ืฆื ืึทืคึผืืึทืืืื ืื ืืืึธืจืงืคืืึธืื ืืื ืืึทืงืืืขื ืื ืคืืืืงืืื ืฆื ืกืืจ, ืฉืขืคึผื ืืืืืึทืืฅ, ืกืึทืืึท ืืื ืงืึทืืคึผืึทื ืกืืืืื ื ืืจืึทื ืืึทืงืฉืึทื ื.
BPM ืคึผืืึทืืคืึธืจืืข ืืื
ื ืืื! ืืื ืคืึทืงื, ืืืจ ืงืขื ืขื ืืืืื ืืืืคื Camunda ืึธื ืงืืื Java ืืืืกื ืืื ืงืึทื ืคืืืืขืจ ืื ืึทืจืงืึทืืขืงืืฉืขืจ ืฆื ืงืึธื ืืื ืงืืื ืฉืคึผืจืึทื ืคืื ืืืื ืืจืืจื. ืืื ืืขื ืึทืจืืืงื ืืืจ ืืืขืื ืงืืงื ืืื:
- ืืงืขืจืืืง ืึทืจืงืึทืืขืงืืฉืขืจ;
- REST API;
- ืขืฆื ืืืืฃ ืืืืืกืืื ื ืงืืืขื ื ืืืืืจืขืจืื ืคึฟืึทืจ ืื ืืขืจืข ืฉืคึผืจืึทืื ืืื Java;
- ืืืึทืฉืคึผืื ืคืื ื ืืฆื C # ืืื Node.JS;
- ืืืขืื ืฆื ืืืืคื ืงืึทืืื ืืึท ืกืขืจืืืขืจ (ืืึธืงืงืขืจ ืึธืืขืจ ืืึธืืงืึทื).
ืึทืจืงืึทืืขืงืืฉืขืจ
Camunda ืืื ืืขืฉืจืืื ืืื Java ืืื ืจืืงืืืืืขืจื ืึท Java Virtual Machine (JVM) ืฆื ืืืืคื. Camunda ืืื ืึท REST API ืืืึธืก ืึทืืึทืื ืืืจ ืฆื ืฉืจืืึทืื ืืื ืงืืื ืฉืคึผืจืึทื ืืืจ ืืืืื ืืื ื ืืฆื REST ืืื Camunda:
ืืืึธืจืงืคืืึธืืืก ืืื ืงืึทืืื ืืึท ืืขื ืขื ืืืคืืื ื ืืื BPMN, ืืืึธืก ืืื ืืืืกืืงืื ืึท ืงืกืื ืืขืงืข. ืขืก ืงืขื ืขื ืืืื ืืึธืืขืืขื ื ืืฆื
ืคืืืกื ืืืง ืงืึทืืื ืืึท ืืืจื ืึท ืคืึทืจ-ืืขืืืื ืืึธืงืงืขืจ ืืืื
ืื ืืืืึทืกื ืืืขื ืฆื ืืืืคื Camunda ืืื ืฆื ื ืืฆื Docker. ืึทืืืขืจื ืึทืืืืืข ืืืขืื ืฆื ืืืืคื Camunda ืืขื ืขื ืืืกืงืจืืืื ืฉืคึผืขืืขืจ ืืื ืืขื ืึทืจืืืงื.
ืืื ืืขื ืคืึทื, ื ืึธืจ ืืืืคื:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
ืืืจ ืืึธื ื ืื ืืึธืื ืฆื ืืึธืจื ืืืขืื ืืื ืืงืก, ื'ืืื ืืืืจืืืึทื ืืืฉืื ืขื ืึธืืขืจ ืืึธืืงืึทืฅ. ืืึธืงืงืขืจืคืืืขืก ืืื ืืงืขืจืืืง ืืึทืงืืืืขื ืืืืฉืึทื (ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืื ืกืืจืึทืงืฉืึทื ื ืคึฟืึทืจ ืงืึทื ืขืงืืื ื ืฆื ืื ืคืืจืืื ืื ืืึทืืึทืืืืกืื) ืืขื ืขื ืื ืืืฆื ืืื
ืืืื ืืืจ ืืืืื ืฆื ืืืืคื Camunda Enterprise Edition, ืืืจ ืงืขื ืขื ืืืืื ืืืืฉื
ืึธืืขืจ, ืขืก ืืื ืืืื ืืึทืื ืกืืื ืฆื ืืืืคื ืงืึทืืื ืืึท ื ืืฆื ืืึธืงืงืขืจ: ืืืจ ืืืขื ืกืืฃ ืึทืจืืืฃ ืืื ืึท ืืืขืจืกืืข ืคืื โโTomcat ืืืึธืก ืืื ื ืืฉื ืฉืืขื ืืืง ืึทืจืืึทื ื ืขืืขื ืื ืืขืฆืืข ืคืืงืกืื. ืฆื ืขืคืขืก ืืึทืงืืืขื ืึทืจืื ืืขื, ืืืจ ืงืขื ืขื ืืึทืื ืึท ืืึธืงืงืขืจ ืืืื ืืื ืืืืืจื ืืืืฃ ืืขืจ ืืขืืืืื Tomcat ืคืึทืจืฉืคึผืจืืืืื ื, ืืื ืืขืืืืื ืืื ืืขื ืืืึทืฉืคึผืื, ืึธืืขืจ ื ืืฆื ืืืื ืขืจ ืคืื ืื ืกืึทืืืฉืึทื ื ืืืกืงืจืืืื ืืื ืื.
ืืืคึผืืืืื ื ืึท ืคึผืจืึธืฆืขืก ืืึธืืขื
ืืึธืืืจ ืืขื ืึท ืืืืฉืคึผืื ืืื ืื ืกืึทืืึท ืืืกืืขืจ ืคึฟืึทืจ ืึท ืงืืึทืกืืฉ ืจืืืืข ืืืงืื ื ืืื ืืืจ ืืืืื ืฆื ืฆืื ืื ืืจืื ืึทืงืฉืึทื ื ืืื ืึท ืจืืืขืจื ืืื ืืจืึทืฆืืขื ืคืึทืจืืืืืงื ืืขืจืึธืื ืึทืงืฉืึทื ื ืืื ืคืึทื ืคืื ืฉืคึผืขืืขืจ ืืืจืืคืึทื. ืืขืจืืื ืื ืืื 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
ืืขืจ ืืืืึทืืขืจ ืืฉืืงืึทืืืข ืงืฉืื ืืื ืืื ืงืึทืืื ืืึท ืฆืื ืื ืคึผืจืึธืืกืืืืฉืขืจื ืืื ืืืงืื ื ืึท ืืึทืฉืื? ืงืึทืืื ืืึท ืงืขื ืขื ื ืื ืืืืื ืืืืื ืจืืคื ืืึทืืื ืื ืืก (ืคึผืืฉ-ืคึผืจืื ืกืืคึผืืข), ื ืืฆื ืขืืืขืืข ืืขืืืื-ืืื
ืึทืืื ืขืจืฉืืขืจ ืืืจ ืืึทืจืคึฟื ืฆื ืืึธื
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
ืึทื ืก ืขืก - ืืืจ ืืึธื ื ืืฉื ืืืจืฃ ืงืืื Java ืืื ืืืฆื, ืจืขืื? ืืื ืืึธืก ืืื ืืขื ืื ืฆื ืึธื ืืืืื!
ืงืืืขื ื ืืืืจืึทืจืืขืก
ืจืืคื ืื REST API ืืื ืืจืื ื ืืื ืงืืื ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทื. ืืื ืืืฉืึทืืืึทืกืงืจืืคึผื ืขืก ืืื ืืึทืงืืืขื ืฆื ืืึธื ืืึธืก ืืื JQuery, ืืื ืืื C # ืืืจ ืงืขื ืขื ื ืืฆื System.Net.Http ืืื Newtonsoft.Json. ืึธืืขืจ ืืึธืก ืืืขื ื ืขืืขื ืฆืืื. ืึทืืื ืืืจ ืงืขื ืขื ื ืึธืจ ื ืืฆื ืขืืืขืืข ืงืืืขื ื ืืืืืืึธืืขืง.
ืขืก ืืขื ืขื ืืขืจืืืืึทื ืขืืืขืืข ืคืึทืจืืืง ืงืืืขื ื ืืืืืจืขืจืื ืื ืืืฆื:
- ืืืฉืึทืืืึทืกืงืจืืคึผื:
ืจืื ื . ืืขืฉืืืฆื ืืืจื ืงืึทืืื ืืึท; - Java:
ืจืื ื . ืืขืฉืืืฆื ืืืจื ืงืึทืืื ืืึท; - C #:
ืจืื ื ะธืจืื ื . ืื ืืืืืข ืคืจืืืขืงืื ืืขื ืขื ืืื ื ืฆืืืืฉื ืฆืืฉืืื ื ืืื ืืืื ืืืขื ื ืืฉื ืงืืื ืืงืืืืืืืขื, ืืืขืจ ืงืขื ืขื ืืื ืขื ืืืก ื ืืืื ืื ืืืื-ืคืื ืงื; - ืคืคึผ:
ืจืื ื ืืื ื ืืฉื ืึท ืืืืขืจ ืคืืืฉืืขื ืืืง ืืืืืืึธืืขืง ืืื ืืื ื ืืฉื ืึทืจืืึทื ื ืขืืขื ืื ืืขืฆืืข ืึทืคึผื ืขื ืืขืจืื ืืขื, ืึธืืขืจ ืืื ืืืืกื ืคืื ืคึผืจืึทืืืฉืขืงืก ืืืึธืก ื ืืฆื ืขืก.
ืืื ืื ืืืกื ืขื ืคืื ืืืฉืึทืืืึทืกืงืจืืคึผื ืืื ืืืฉืึทืืืึท, ืงืืืขื ื ืืืืืจืขืจืื ืืขื ืขื ื ืืฉื ืืืื ืคืื ืื ืงืึทืืื ืืึท ืคึผืจืึธืืืงื ืืื. ืื ืืืืกื ื ืืฉื ืืขืจืืืึทืจืื ืึทื ืืื ืฉืืืฆื ืึทืืข ืื 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 ืกืืึทื ืืึทืืึธื ืข WAR"
ืืื ืึทื ืึธืืืขืจื ืึทืืืื ืฆื ืื ืคืึทืจ-ืืขืืืื ืืึธืงืงืขืจ ืืืื ืคึฟืื ืงืึทืืื ืืึท, ืืืจ ืงืขื ืขื ืฆืืืจืืืื Tomcat ืืื (ืืืฉื, ืืืืืจื ืืืืฃ ืื ืืึทืึทืืืขืจ ืืึธืงืงืขืจ ืืึธืืงืึทื ืืืืืขืจ) ืืื ื ืึธืืืึทืื ืงืึทืืื ืืึท ืืื ืขืก ืืื ืืืื ืขืจ ืคืื ืื ืึทืืื-ืืขืจืืคึฟื WAR ืืขืงืขืก.
ืืืื ืืืจ ืืึธืื ืคืืืข ื ืึธื ืจืขืงืืืืจืขืืขื ืฅ ืืื ืงืขื ืขื ืงืึทืกืืึทืืืื ืึท Java ืืืืขื ืกืืืืืืข, ืืืจ ืงืขื ืขื ืืืื ืงืึทื ืคืืืืขืจ Camunda ืกืืึทื ืืึทืืึธื ืข ืืืืื. ืฉืืขืื ืึท ืืึทืืืขื ืืืืขื ืืื ืืื ืื ืืืืฉืคืืื: ืืืืขื
ืืึธื ืืฉืื ื ืื Camunda Tomcat ืคืึทืจืฉืคึผืจืืืืื ื
ืื ืื ืืขืจ ืึธืคึผืฆืืข ืืื ืฆื ืคืฉืื ืืจืืคืงืืคืืข ืื Camunda Tomcat ืคืึทืจืฉืคึผืจืืืืื ื, ืึทื ืืืคึผ ืขืก ืืื ืืืืคื ืขืก. ืฆื ืืึธื ืืึธืก, ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืื Java Runtime Environment (JRE) ืืื ืกืืึทืืืจื ืืืืฃ ืืืื ืงืึธืืคึผืืืืขืจ. ืขืก ืงืขื ืขื ืืืื ืืืืื
ืฆื ืืืืฉื ืื ืืึทืืึทืืืืก ืึธืืขืจ ืืึธื ืขืคึผืขืก ืึทื ืืขืจืฉ ืืืจ ืืึทืจืคึฟื ืฆื ืงืึทื ืคืืืืขืจ Tomcat ืืื
ืคืืืกื ืืืง ืงืึทืืื ืืึท ื ืืฆื Tomcat
ืื ืืขืฆืืข ืื ืืขืจ ืืจืืจื ืืื ืฆื ืงืึทื ืคืืืืขืจ Tomcat ืืื ืืื ืื ืกืืึทืืืจื Camunda ืืื ืขืก,
ืงืึทืื ืืึท ืืื ืคึผืจืึธืืืงืฆืืข
ืืืคึผืืงืึทืืื, ืืึธืก ืืืขื ืืึทืจืคื ืืืจ ืฆื ืืึธื ืขืืืขืืข ืืขืฆื ืกืขืืึทืคึผ ืฆื ืืึทืงืืืขื Camunda ืคืืืกื ืืืง. ืงืึทืืื ืืึท ืืื ืืืืืืืื ื ืืืึธืก ืืึทืฉืจืืึทืื ืืขื ืืื ืืจืืืก ืืขืืึทื, ืึธืืขืจ ืืื ืืืขื ื ืืฉื ืึธื ืจืืจื ืืื ืืื ืืขื ืึทืจืืืงื - ืืื ืืืขื ื ืึธืจ ืืขืื ืืืื ืืืืฉืคึผืื: ืื REST API ืคืื ืื ืคืึทืจืฉืคึผืจืืืืื ื ืืื ื ืืฉื ืงืึทื ืคืืืืขืจื ืคึฟืึทืจ ืึธืืขื ืืึทืงืืืฉืึทื ืืืจื ืคืขืืืงืืึทื. ืืืจ ืืื ืืืขืื ืฆื ืืืืฉื ืืขื.
ืกืืืืื ื-ืึทืจืืืฃ
ืืื ืืืจ ืงืขื ืืึธืื ืืืืขืจืงื, ืฆื ืึธื ืืืืื ืืื Camunda ืืื ืืืืขืจ ืืจืื ื, ืจืึทืืึทืจืืืึทืก ืคืื ืื ืฉืคึผืจืึทื ืืืจ ื ืืฆื. ืืขืจ ืฉืืืกื ืคืื ื ืืื ืึทื ืึทืืข ืงืึธืืื ืืงืึทืฆืืข ืืื ืืืจืืืขืงืึธืื ืืืจื ืื REST API. ืื ืกืืึทืืืจืื ื ืืื ืืืื ืืึทื ืฅ ืคึผืฉืื, ืกืคึผืขืฆืืขื ืืืขื ืืืจ ื ืืฆื ืืึธืงืขืจ.
ืืงืืจ: www.habr.com