ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€! ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«Use Camunda as an easy-to-use REST-based orchestration and workflow engine (without touching Java)Β» Π°Π²Ρ‚ΠΎΡ€Π° Bernd RΓΌcker.

07.07.2020 Π³., ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Bernd RΓΌcker

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Π― часто ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽ ΠΌΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ с людьми, Π΄Π°Π»Π΅ΠΊΠΈΠΌΠΈ ΠΎΡ‚ Java: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ C#, Node.JS/JavaScript ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ²Π΅Ρ€ΠΆΠ΅Π½Ρ†Π°ΠΌΠΈ Golang. ВсС ΠΎΠ½ΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ оркСстровки Π² микросСрвисной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ΠΈΠ»ΠΈ просто инструмСнт для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ процСсса ΠΈ получСния возмоТности упорядочСния, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ², Saga ΠΈ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

BPM-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ Camunda ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡. Π”Ρ€ΡƒΠΆΠ΅Π»ΡŽΠ±ΠΈΠ΅ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ β€” ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… особСнностСй ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. Но Ссли Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² основном Β«Π΄Ρ€ΡƒΠΆΠ΅Π»ΡŽΠ±ΠΈΠ΅Β» Camunda Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ Π½Π° Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° прСдоставляСт мноТСство возмоТностСй для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ собствСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, Π½ΠΎ всС это дСлаСтся Π½Π° Java. Π’Π°ΠΊ Π»ΠΈ это Π½Π° самом Π΄Π΅Π»Π΅?

НСт! На самом Π΄Π΅Π»Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Camunda Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π·Π½Π°Π½ΠΈΠΉ Java ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ для ΠΊΠΎΠ΄Π° Π½Π° любом языкС, ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€Ρƒ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим:

  • Π±Π°Π·ΠΎΠ²ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ;
  • REST API;
  • совСты ΠΏΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ клиСнтским Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ для языков, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ Java;
  • ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования C # ΠΈ Node.JS;
  • способы запуска сСрвСра Camunda (Docker ΠΈΠ»ΠΈ Tomcat).

АрхитСктура

Camunda написана Π½Π° Java ΠΈ для запуска нуТдаСтся Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Java (JVM). Camunda прСдоставляСт REST API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° любом языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ нравится, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ REST с Camunda:

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы Π² Camunda ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² BPMN, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² основном прСдставляСт собой XML-Ρ„Π°ΠΉΠ». Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Camunda Modeler.

Запуск Camunda Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ созданный ΠΎΠ±Ρ€Π°Π· Docker

Π‘Π°ΠΌΡ‹ΠΉ простой способ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Camunda β€” это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Docker. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ способы запуска Camunda описаны Π΄Π°Π»Π΅Π΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Π’ этом случаС достаточно просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

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

Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ»Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎ Linux, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Java ΠΈΠ»ΠΈ Tomcats. Dockerfiles ΠΈ основная докумСнтация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, инструкция ΠΏΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ ΠΊ Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…) доступны Π½Π° Github.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Camunda Enterprise Edition, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Dockerfile.

Однако Ρƒ запуска Camunda с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Docker Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ нСдостаток: Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ Tomcat, которая Π½Π΅ всСгда Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ послСдниС исправлСния. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π· Π½Π° основС Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ дистрибутива Tomcat, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π»ΠΈΠ±ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, описанных Π½ΠΈΠΆΠ΅.

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ процСсса

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ шаблон Saga для классичСского бронирования ΠΏΠΎΠ΅Π·Π΄ΠΎΠΊ, Π³Π΄Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ дСйствия подряд ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ дСйствия Π² случаС Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ сбоя. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ΅ BPMN ΠΎΠ½ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ REST API для развСртывания ΠΌΠΎΠ΄Π΅Π»ΠΈ процСсса. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ сохранили Π΅Π³ΠΎ с ΠΈΠΌΠ΅Π½Π΅ΠΌ trip.bpmn ΠΈ запустили Camunda Ρ‡Π΅Ρ€Π΅Π· Docker, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» доступСн Π½Π° 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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ экзСмпляры Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ процСсса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ REST API ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² качСствС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… экзСмпляра Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ процСсса:

  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), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСнныС ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, Π½ΠΎ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ элСмСнты Π² своСго Ρ€ΠΎΠ΄Π° Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΡΡ‚ΡŒ. ПослС Ρ‡Π΅Π³ΠΎ worker ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ элСмСнты Ρ‡Π΅Ρ€Π΅Π· REST, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Camunda ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ (Pull-Principle).

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Π˜Ρ‚Π°ΠΊ, сначала Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ fetchAndLock (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ worker ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ для ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ систСмы):

  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, Ρ‡Ρ‚ΠΎ worker Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ввСсти ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ external task, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ запросС):

  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;
  • Java: ссылка. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ Camunda;
  • C#:ссылка ΠΈ ссылка. Оба этих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° находятся Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΌ состоянии ΠΈ практичСски Π±Π΅Π·Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ;
  • PHP: ссылка β€” Π½Π΅ слишком полная ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ послСдниС измСнСния API Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π½ΠΎ я знаю ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Ρ‘.

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ JavaScript ΠΈ Java, клиСнтскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ самого ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Camunda. НС ΠΎΠΆΠΈΠ΄Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС возмоТности REST API Camunda. Если Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ прСдоставляСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΅Π΅ Ρ‚Π°ΠΌ Π½Π΅Ρ‚, всСгда провСряйтС REST API Camunda. Π’ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² качСствС ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ шаблона.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с 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();

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° сайтС github.com

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ способы запуска Camunda

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±Ρ€Π°Π· Docker с Β«Camunda standalone WARΒ»

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π·Ρƒ Docker ΠΈΠ· Camunda Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Tomcat (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° основС ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker Tomcat), Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ Camunda ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… WAR-Ρ„Π°ΠΉΠ»ΠΎΠ².

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Если Ρƒ вас имССтся ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ срСду сборки Java, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Camunda Standalone war. НастройтС сборку Maven ΠΊΠ°ΠΊ Π² этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…: сборка Maven с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ war ΠΈΠ»ΠΈ сборка Maven с Overlay.

Запуск дистрибутива Camunda Tomcat

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” просто ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ дистрибутив Camunda Tomcat, Ρ€Π°Π·Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Для этого потрСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Java Runtime Environment (JRE), установлСнная Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Π•Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΎΡ‚ΡΡŽΠ΄Π°.

ИспользованиС Camunda для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ оркСстровки Π½Π° основС REST ΠΈ Workflow Engine (Π±Π΅Π· Java)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Tomcat, ΠΊΠ°ΠΊ описано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π― знаю, Ρ‡Ρ‚ΠΎ Tomcat ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТным, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это ΠΎΡ‡Π΅Π½ΡŒ просто. И Google Π·Π½Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² процСссС.

Запуск Camunda с использованиСм Tomcat

ПослСдняя Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° β€” это ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Tomcat ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ Camunda, слСдуя описанию установки. Π­Ρ‚ΠΎ даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Tomcat, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅, ΠΈΠ»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ Π² качСствС слуТбы Windows.

Запуск Camunda Π² производство

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, для этого Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ настройки для запуска Camunda. Π’ Camunda Π΅ΡΡ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ это ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅, Π½ΠΎ я Π½Π΅ стану Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€” Π½Π°Π·ΠΎΠ²Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: REST API дистрибутива ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ настроСн Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ подлинности. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это.

ПодвСдСниС ΠΈΡ‚ΠΎΠ³ΠΎΠ²

Как Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Camunda ΠΎΡ‡Π΅Π½ΡŒ просто, нСзависимо ΠΎΡ‚ языка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС взаимодСйствиС осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· REST API. Установка Ρ‚ΠΎΠΆΠ΅ довольно проста, особСнно ΠΏΡ€ΠΈ использовании Docker.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com