Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

Aloha, Habr! Ke hāʻawi aku nei au iā ʻoe i kahi unuhi o ka ʻatikala "E hoʻohana iā Camunda ma ke ʻano he mea hoʻohana maʻalahi e hoʻohana i ka orchestration a me ka ʻenekini hana holoʻokoʻa (me ka hoʻopā ʻole iā Java)" na Bernd Rücker.

07.07.2020/XNUMX/XNUMX, unuhi nāʻatikala Bernd Rücker

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

Kūkākūkā pinepine au i ka hoʻolālā microservice me nā poʻe ʻaʻole Java: C#, Node.JS/JavaScript developers, a i ʻole Golang enthusiasts. Ke alo nei lākou a pau i ka ʻoiaʻiʻo e pono ai lākou i kahi ʻenekini orchestration i kahi hoʻolālā microservice a i ʻole kahi mea hana e hoʻomaikaʻi ai i ka workflow a loaʻa i ka hiki ke kauoha, mālama i nā manawa manawa, Saga a me ka uku uku.

kahua BPM me wehe kumu mai Camunda nui no ia mau hana. ʻO ka launa mea hoʻomohala kekahi o nā hiʻohiʻona nui o ka huahana. Akā inā ʻoe e nānā i kāna palapala, e loaʻa paha iā ʻoe ka manaʻo e pili nui ana ke aloha o Camunda i nā mea hoʻomohala Java. Hāʻawi ka paepae i nā manawa he nui e hoʻopili i kāu mau hana ponoʻī a me nā hoʻonui, akā ua hana ʻia ma Java. He oiaio anei?

ʻAʻole! ʻO ka ʻoiaʻiʻo, hiki iā ʻoe ke holo maʻalahi iā Camunda me ka ʻole o ka ʻike Java a hoʻonohonoho i ka hoʻolālā e hoʻopaʻa inoa i kekahi ʻōlelo āu e koho ai. Ma kēia ʻatikala e nānā mākou:

  • kumu hoʻolālā;
  • API hoomaha;
  • 'ōlelo aʻo e pili ana i nā hale waihona puke o nā mea kūʻai aku no nā ʻōlelo ʻē aʻe ma Java;
  • laʻana o ka hoʻohana ʻana iā C# a me Node.JS;
  • nā ala e holo ai i ka server Camunda (Docker a i ʻole Tomcat).

kuhikuhipuʻuone

Ua kākau ʻia ʻo Camunda ma Java a koi aku i kahi Java Virtual Machine (JVM) e holo. Hāʻawi ʻo Camunda i kahi REST API e hiki ai iā ʻoe ke kākau i kekahi ʻōlelo āu e makemake ai a hoʻohana iā REST me Camunda:

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

Ua wehewehe ʻia nā kahe hana ma Camunda ma BPMN, ʻo ia ka faila XML. Hiki ke hoʻohālike me ka hoʻohana ʻana Mea Hoʻohālike ʻo Camunda.

Ke holo nei ʻo Camunda ma o kahi kiʻi Docker i kūkulu mua ʻia

ʻO ke ala maʻalahi e holo ai iā Camunda ʻo ka hoʻohana ʻana iā Docker. ʻO nā ala ʻē aʻe e holo ai iā Camunda e wehewehe ʻia ma hope o kēia ʻatikala.

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

I kēia hihia, e holo wale:

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

ʻAʻole ʻoe hopohopo e pili ana i Linux, Java Virtual Machines a i ʻole Tomcats. Loaʻa nā Dockerfiles a me nā palapala kumu (no ka laʻana, nā ʻōlelo aʻoaʻo no ka hoʻopili ʻana i nā ʻikepili i koi ʻia) ma Github.

Inā makemake ʻoe e holo i ka Camunda Enterprise Edition, hiki iā ʻoe ke hoʻololi maʻalahi dockerfile.

Eia nō naʻe, aia kekahi ʻaoʻao i ka holo ʻana iā Camunda me ka hoʻohana ʻana iā Docker: e hoʻopau ʻoe me kahi mana o Tomcat ʻaʻole i hoʻokomo mau i nā hoʻoponopono hou. No ka hoʻopuni ʻana i kēia, hiki iā ʻoe ke hana i kahi kiʻi Docker iā ʻoe iho e pili ana i ka hoʻoili Tomcat i makemake ʻia, e like me ka hōʻike ʻana ma kēia hiʻohiʻona, a i ʻole e hoʻohana i kekahi o nā hopena i wehewehe ʻia ma lalo nei.

Ke hoʻolālā nei i kahi kumu hoʻohālike

E nānā kākou i kahi laʻana e hoʻohana ana i ka laʻana Saga no kahi puke huakaʻi maʻamau kahi āu e makemake ai e hoʻomaka i ʻekolu mau hana i ka lālani a e uku maikaʻi i nā hana kūleʻa i ka wā o ka hāʻule ʻana ma hope. Hōʻike ʻia ma ke ʻano BPMN, e like me kēia:

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

I kēia manawa hiki iā ʻoe ke hoʻohana REST API no ke kaʻina hana hoʻohālike. E ʻōlelo mākou ua mālama ʻoe iā trip.bpmn a holo iā Camunda ma o Docker i loaʻa iā ia ma 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

I kēia manawa hiki iā ʻoe ke holo nā manawa hana hou me ka hoʻohana ʻana i ka REST API a me ka hāʻawi ʻana i ka ʻikepili āu e makemake ai e ʻike ma ke ʻano he mau ʻano hoʻololi o ka workflow:

  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

ʻO ka nīnau hoihoi hou aʻe pehea e hoʻomaka ai ʻo Camunda i nā kaʻina hana e like me ka hoʻopaʻa ʻana i kahi kaʻa? ʻAʻole hiki iā Camunda ke kāhea koke i nā lawelawe (Push-Principle), me ka hoʻohana ʻana i kekahi mau mea i kūkulu ʻia nā mea hoʻohui, akā e hoʻokomo pū i nā mea hana i kahi ʻano laina i kūkulu ʻia. Hiki i ka mea hana ke loaʻa nā mea hana ma o REST, hana i ka hana, a hōʻike i ka pau ʻana iā Camunda (Pull-Principle).

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

No laila pono ʻoe e hana mua fetchAndLock (no ka mea hiki i nā limahana ʻē aʻe ke loaʻa nā hana i ka manawa like e hoʻonui i ka ʻōnaehana):

  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

A laila e haʻi iā Camunda i kēlā ua hoʻopau ka mea hana i kāna hana (e hoʻomaopopo pono ʻoe e komo i ka ID hana waho i loaʻa i ka noi mua):

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

ʻO ia - ʻaʻole pono ʻoe i Java i kēia manawa, ʻeā? A ua lawa ia e hoʻomaka ai!

Hale Waihona Puke

He maʻalahi ke kāhea ʻana i ka REST API ma kekahi ʻōlelo papahana. Ma JavaScript he mea maʻalahi ke hana i kēia me ka hoʻohana ʻana iā JQuery, a ma C# hiki iā ʻoe ke hoʻohana iā System.Net.Http a me Newtonsoft.Json. Akā e lōʻihi ka manawa. No laila hiki iā ʻoe ke hoʻohana i kahi waihona mea kūʻai aku.

Aia kekahi mau hale waihona puke mea kūʻai aku i mākaukau i kēia manawa:

  • javascript: loulou. Kākoʻo ʻia e Camunda;
  • Java: loulou. Kākoʻo ʻia e Camunda;
  • C #:loulou и loulou. Aia kēia mau papahana ʻelua ma kahi kūlana waena a ʻaneʻane ʻaʻohe hana, akā hiki ke lilo i wahi hoʻomaka maikaʻi;
  • PHP: loulou ʻaʻole ia he hale waihona puke piha loa a ʻaʻole hoʻokomo i nā loli API hou loa, akā ʻike wau i nā papahana e hoʻohana ana.

Me ka ʻokoʻa o JavaScript a me Java, ʻaʻole ʻāpana nā hale waihona puke o ka mea kūʻai aku o ka huahana Camunda ponoʻī. Mai manaʻo e kākoʻo lākou i nā hiʻohiʻona a pau o kā Camunda REST API. No ka hāʻawi ʻole ʻana o kahi waihona i kekahi hiʻohiʻona ʻaʻole ia he manaʻo ʻaʻole ia ma laila, e nānā mau i ka Camunda REST API. Hoʻohana nā papahana maʻamau i nā hale waihona puke ma ke ʻano he hoʻomaka a me ka laʻana.

Laʻana me C#

Ke hoʻohana nei i ka waihona mea kūʻai ma luna, hiki iā mākou ke kākau wale:

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

Hiki ke loaʻa ke code kumu hana piha ma ka pūnaewele: loulou. Loaʻa kekahi laʻana ma loulou.

Laʻana me 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();

Hiki ke loaʻa nā ʻike hou aku ma ka pūnaewele github.com

ʻO nā ala ʻē aʻe e hoʻomaka ai iā Camunda

ʻO ke kiʻi Docker maʻamau me "Camunda standalone WAR"

Ma ke ʻano he ʻokoʻa i ke kiʻi Docker i kūkulu mua ʻia mai Camunda, hiki iā ʻoe ke hoʻomākaukau iā Tomcat iā ʻoe iho (no ka laʻana, e pili ana i nā kiʻi Docker Tomcat mana) a laila kope iā Camunda i loko e like me kekahi o nā faila WAR i kapa ʻia.

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

Inā loaʻa iā ʻoe nā koi hou aʻe a hiki iā ʻoe ke hana i kahi kaiapuni kūkulu Java, hiki iā ʻoe ke hoʻonohonoho i ke kaua ʻo Camunda Standalone. E hoʻonohonoho i kahi kūkulu Maven e like me kēia mau hiʻohiʻona: kūkulu Maven me ka hoʻonohonoho kaua a i ʻole hui Maven me Overlay.

Ke hoʻolaha nei i ka hoʻolaha ʻana o Camunda Tomcat

ʻO kahi koho ʻē aʻe e kiʻi wale i ka hoʻoili ʻana o Camunda Tomcat, wehe iā ia a holo. No ka hana ʻana i kēia, pono ʻoe i ka Java Runtime Environment (JRE) i kau ʻia ma kāu kamepiula. Hiki ke maʻalahi download mai maanei.

Ke hoʻohana nei iā Camunda no ka hoʻokani ʻana i ka REST-based orchestration a me Workflow Engine (ʻaʻohe Java)

No ka hoʻololi i ka waihona a i ʻole e hana i kekahi mea ʻē aʻe e pono ai ʻoe e hoʻonohonoho iā Tomcat like i wehewehe ʻia ma ka palapala. ʻIke wau he paʻakikī paha ʻo Tomcat, akā maʻalahi maoli. A loaʻa iā Google nā ​​pane i nā mea āpau āu e pono ai ma ke kaʻina hana.

Ke holo nei ʻo Camunda me ka hoʻohana ʻana iā Tomcat

ʻO ka koho hope loa e hoʻonohonoho iā Tomcat iā ʻoe iho a hoʻokomo iā Camunda i loko, ma hope o ka wehewehe ʻana. Hāʻawi kēia iā ʻoe i ka manawa e hoʻohana ai i kekahi mana o Tomcat āu e makemake ai, a i ʻole, no ka laʻana, e hoʻokomo iā ia ma ke ʻano he lawelawe Windows.

Hoʻomaka ʻo Camunda i ka hana

ʻO ka maʻamau, e koi kēia iā ʻoe e hana i kahi hoʻonohonoho hope e holo ai ʻo Camunda. Loaʻa iā Camunda nā alakaʻi e wehewehe nui i kēia, akā ʻaʻole wau e hoʻopā iā lākou ma kēia ʻatikala - E hāʻawi wale wau i hoʻokahi hiʻohiʻona: ʻaʻole i hoʻonohonoho ʻia ka REST API o ka hāʻawi ʻana no ka hōʻoia ʻana ma ka paʻamau. Makemake paha ʻoe e hoʻololi i kēia.

Loaʻa i luna

E like me kāu i ʻike ai, maʻalahi loa ka hoʻomaka ʻana me Camunda, me ka ʻole o ka ʻōlelo āu e hoʻohana ai. ʻO ka mea nui e hana ʻia nā kamaʻilio āpau ma o ka REST API. He mea maʻalahi hoʻi ka hoʻonohonoho ʻana, ʻoi aku ka hoʻohana ʻana iā Docker.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka