Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

Hey Habr! M na-egosi gị ntụgharị asụsụ nke akụkọ ahụ "Jiri Camunda dị ka ngwa nhịahụ dabeere na REST dị mfe iji na-arụ ọrụ (na-emetụghị Java aka)" nke Bernd Rücker dere.

07.07.2020/XNUMX/XNUMX, ntụgharị asụsụ edemede Bernd Rucker

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

M na-esokarị ndị na-abụghị Java na-ekwurịta ihe owuwu microservice: ndị mmepe C #, ndị mmepe Node.JS/JavaScript, ma ọ bụ Golang aficionados. Ha niile na-eche ihu n'eziokwu na ha chọrọ usoro nhazi n'ime ụlọ ọrụ microservice, ma ọ bụ naanị ngwá ọrụ iji mee ka usoro ọrụ dị mfe ma nweta ikike ịtụ, njikwa oge, Saga na ịkwụ ụgwọ azụmahịa.

BPM ikpo okwu nwere isi mmalite sitere na Camunda dị mma maka ọrụ ndị dị otú ahụ. Ọdịnihu onye nrụpụta bụ otu n'ime njirimara dị mkpa nke ngwaahịa a. Mana ọ bụrụ n'ileba anya na akwụkwọ ya, ị nwere ike nweta echiche na "enyi na enyi" Camunda bụ nke kachasị na ndị mmepe Java. Ikpo okwu na-enye ọtụtụ nhọrọ maka ijikọ ọrụ na ndọtị nke gị, mana a na-eme ya na Java. Ọ bụ n'ezie?

Mba! N'ezie, ị nwere ike na-agba ọsọ Camunda na-enweghị ihe ọmụma Java ọ bụla ma guzobe ụkpụrụ ụlọ maka koodu n'asụsụ ọ bụla ị họọrọ. N'isiokwu a, anyị ga-ele anya:

  • ụkpụrụ ụkpụrụ ụlọ;
  • API REST
  • Ndụmọdụ na ọba akwụkwọ ndị ahịa dị ugbu a maka asụsụ ndị ọzọ karịa Java;
  • ihe atụ iji C # na Node.JS;
  • ụzọ isi malite ihe nkesa Camunda (Docker ma ọ bụ Tomcat).

ije

Edere Camunda na Java ma chọọ igwe Java Virtual Machine (JVM) iji na-agba ọsọ. Camunda na-enye API REST nke na-enye gị ohere ide n'asụsụ ọ bụla masịrị gị wee jiri REST na Camunda:

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

A kọwapụtara usoro ọrụ na Camunda na BPMN, nke bụ isi faịlụ XML. Enwere ike iji ya mee ihe atụ Camunda Modeler.

Na-agba ọsọ Camunda site na onyonyo Docker ewuruburu

Ụzọ kachasị mfe iji mee Camunda bụ iji Docker. A kọwapụtara ụzọ ndị ọzọ iji malite Camunda n'ime akụkọ a.

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

N'okwu a, gbaa ọsọ:

  docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest

Ịkwesighi ichegbu onwe gị maka Linux, JVM ma ọ bụ Tomcats. Dockerfiles na akwụkwọ ndị bụ isi (dịka ọmụmaatụ, ntuziaka maka ijikọ na ọdụ data achọrọ) dị na Github.

Ọ bụrụ na ịchọrọ ịgba ọsọ Camunda Enterprise Edition ị nwere ike ịgbanwe ngwa ngwa dockerfile.

Agbanyeghị, iji Docker na-agba Camunda nwere otu ọdịda: ị ga-ejedebe na ụdị Tomcat nke anaghị agụnye ndozi kachasị ọhụrụ mgbe niile. Iji rụọ ọrụ na nke a, ị nwere ike ịmepụta ihe oyiyi Docker nke gị dabere na nkesa Tomcat chọrọ, dị ka egosiri na ihe atụ a, ma ọ bụ jiri otu n'ime ngwọta akọwara n'okpuru.

Nleba anya usoro

Ka anyị leba anya n'ihe atụ site na iji template Saga maka ntinye akwụkwọ njem mara mma ebe ịchọrọ ịkpalite omume atọ n'usoro wee jiri amara kwụọ ụgwọ maka omume emechara nke ọma ma ọ bụrụ na ọdịda emechara. Anọchitere anya ya n'ụdị BPMN, ọ dị ka nke a:

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

Ugbu a ị nwere ike iji API REST maka ibunye ụdị usoro. Ka anyị kwuo na ị chekwaa ya ka njem.bpmn wee gbaa Camunda site na Docker ka ọ dị na localhost:8080:

  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

Ugbu a ị nwere ike ịgba ọsọ ọhụrụ usoro ọrụ iji API REST wee nyefee data ịchọrọ ịhụ dị ka mgbanwe atụ ọrụ:

  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

Ajụjụ na-adọrọ mmasị na-esote bụ: kedu ka Camunda si akpọ usoro dị ka ntinye akwụkwọ ụgbọ ala? Camunda enweghị ike ịkpọ ọrụ ozugbo (Push-Principle) site na iji ụfọdụ arụnyere n'ime ya njikọ, ma tinyekwa ihe ọrụ n'ụdị arụnyere n'usoro. Onye ọrụ ahụ nwere ike weta ihe ọrụ site na REST, rụọ ọrụ ahụ, ma gwa Camunda ka ọ mezue (Pull-Principle).

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

Yabụ na mbụ ị ga-emerịrị bute naLock (n'ihi na ndị ọrụ ndị ọzọ nwere ike ịnata ọrụ n'otu oge iji tụọ usoro ahụ):

  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

Mgbe ahụ gwa Camunda nke ahụ onye ọrụ rụchara ọrụ (Rịba ama na ị ga-etinyerịrị id ọrụ mpụga enwetara na arịrịọ mbụ):

  curl 
-H "Content-Type: application/json" 
-X POST 
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- --> 
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete

Nke ahụ bụ - ị ka na-achọghị Java ọ bụla, nri? Ma nke ahụ ezuola ịmalite!

Ụlọ akwụkwọ ndị ahịa

Ịkpọ API REST dị mfe n'asụsụ mmemme ọ bụla. Na Javascript, a na-eme nke a nke ọma site na iji JQuery, yana na C #, na-eji System.Net.Http na Newtonsoft.Json. Ma nke a ga-ewe oge. Yabụ ị nwere ike iji ụfọdụ ọba akwụkwọ ndị ahịa.

N'oge a, ọtụtụ ọba akwụkwọ ndị ahịa emebere dị:

  • Javascript: ngalaba. Camunda kwadoro;
  • Java: ngalaba. Camunda kwadoro;
  • C #:ngalaba и ngalaba. Ọrụ abụọ a dị na steeti etiti na ọ fọrọ nke nta ka ọ bụrụ ụra, mana ha nwere ike bụrụ ebe mmalite dị mma;
  • PHP: ngalaba - ezughị oke ma anaghị agụnye mgbanwe API ọhụrụ, mana amaara m ọrụ ndị na-eji ya.

Ewezuga Javascript na Java, ọba akwụkwọ ndị ahịa abụghị akụkụ nke ngwaahịa Camunda n'onwe ya. Atụla anya na ha ga-akwado atụmatụ API nke Camunda REST API niile. Naanị n'ihi na ọbá akwụkwọ anaghị enye ụfọdụ ọrụ apụtaghị na ọ nọghị ebe ahụ, lelee Camunda's REST API mgbe niile. Ọrụ nrụtụ aka na-eji ụlọ akwụkwọ dị ka mmalite na ndebiri.

Ọmụmaatụ C#

N'iji ọba akwụkwọ ndị ahịa dị n'elu, anyị nwere ike dee:

  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", "..." }
    });

Enwere ike ịchọta koodu isi mmalite na-arụ ọrụ na ntanetị: ngalaba. Ihe atụ ọzọ dị na ngalaba.

Ọmụmaatụ na 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();

Enwere ike ịchọta ozi ndị ọzọ na webụsaịtị github.com

Ụzọ ndị ọzọ iji malite Camunda

Foto Docker nke omenala nwere "Camunda standalone WAR"

Dị ka ihe ọzọ na ihe oyiyi Docker nke ewuruburu site na Camunda, ị nwere ike ịkwadebe Tomcat n'onwe gị (dịka ọmụmaatụ, dabere na ihe oyiyi Docker Tomcat) wee detuo Camunda n'ime ya dị ka otu n'ime ihe a na-akpọ faịlụ WAR.

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

Ọ bụrụ na ị nwere ọtụtụ ihe ndị ọzọ a chọrọ ma nwee ike melite ebe obibi Java, ị nwekwara ike ịtọ Camunda Standalone agha. Hazie ihe owuwu Maven dịka ọmụmaatụ ndị a: wuo Maven nwere nhazi agha ma ọ bụ mgbakọ Maven nwere ihe mkpuchi.

Malite nkesa Camunda Tomcat

Nhọrọ ọzọ bụ naanị ibudata nkesa Camunda Tomcat, wepụ ya, wee mee ya. Nke a chọrọ naanị Java Runtime Environment (JRE) arụnyere na kọmputa gị. Ọ nwere ike ịdị mfe download si ebe a.

Iji Camunda maka orchestration dị mfe dabere na REST na Workflow Engine (enweghị Java)

Iji gbanwee nchekwa data ma ọ bụ mee ihe ọ bụla ọzọ ịchọrọ ịhazi Tomcat dị ka kọwara na akwụkwọ. Ama m na Tomcat nwere ike ịdị mgbagwoju anya, mana ọ dị nnọọ mfe. Na Google maara azịza nke ihe niile enwere ike ịchọrọ na usoro a.

Na-agba ọsọ Camunda site na iji Tomcat

Nhọrọ ikpeazụ bụ ịtọ Tomcat n'onwe gị wee tinye Camunda n'ime ya, na-eso nkọwa nwụnye. Nke a ga-enye gị nhọrọ iji ụdị Tomcat ọ bụla masịrị gị, ma ọ bụ wụnye ya dị ka ọrụ Windows, dịka ọmụmaatụ.

Ewelite Camunda n'ime mmepụta

Nke a ga-achọkarị nhazi ikpeazụ iji mee Camunda. Enwere ntuziaka na Camunda nke na-akọwa nke a n'ụzọ zuru oke, mana agaghị m abanye n'ime ha n'isiokwu a - Aga m akpọ aha naanị otu ọmụmaatụ: ahazighị REST API nkesa maka nyocha na ndabara. Ị nwere ike ịchọ ịgbanwe nke a.

Na-agbakọta elu

Dịka ị na-ahụ, ọ dị mfe ịmalite na Camunda, n'agbanyeghị asụsụ ị na-eji. Isi ihe bụ na a na-eme mkparịta ụka niile site na API REST. Nwụnye dịkwa mfe, ọkachasị mgbe ị na-eji Docker.

isi: www.habr.com

Tinye a comment