เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

Hey Habr! เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ™เปเบฒโ€‹เบชเบฐโ€‹เป€เบซเบ™เบตโ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบเบฒเบ™โ€‹เปเบ›โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบ‚เบญเบ‡โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เป„เบ”เป‰โ€‹ "เปƒเบŠเป‰ Camunda เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡ orchestration REST เบ—เบตเปˆเบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เปƒเบŠเป‰เปเบฅเบฐเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ (เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเปเบฒเบœเบฑเบ”เบเบฑเบš Java)" เป‚เบ”เบ Bernd Rรผcker.

เบงเบฑเบ™เบ—เบต 07.07.2020/XNUMX/XNUMX, เบเบฒเบ™เปเบ› เบšเบปเบ”เบ„เบงเบฒเบก Bernd Rucker

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

เบ‚เป‰เบญเบเบกเบฑเบเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ microservice เบเบฑเบšเบ„เบปเบ™เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ Java: เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ C#, Node.JS/JavaScript developers, เบซเบผเบท Golang aficionados. เบžเบงเบเป€เบ‚เบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ›เบฐเป€เบŠเบตเบ™เบซเบ™เป‰เบฒเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบปเบ™เป„เบเบเบฒเบ™ orchestration เปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบˆเบธเบฅเบฐเบžเบฒเบ, เบซเบผเบทเบžเบฝเบ‡เปเบ•เปˆเป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเบฑเปˆเบ‡, เบˆเบฑเบ”เบเบฒเบ™เป€เบงเบฅเบฒเบซเบกเบปเบ”เป€เบงเบฅเบฒ, Saga เปเบฅเบฐเบเบฒเบ™เบŠเบปเบ”เป€เบŠเบตเบเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ.

เป€เบงเบ—เบต BPM เบเบฑเบš เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบˆเบฒเบ Camunda เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆเบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง. เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบกเบดเบ”เบเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบกเปˆเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™. เปเบ•เปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบ›เบฐเบ—เบฑเบšเปƒเบˆเบ—เบตเปˆเบงเปˆเบฒ "เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบกเบดเบ”" เบ‚เบญเบ‡ Camunda เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เปเบ™เปƒเบชเปˆเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Java. เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบกเบชเบฐเบซเบ™เบญเบ‡เป‚เบญเบเบฒเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ, เปเบ•เปˆเบกเบฑเบ™เป€เบฎเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ Java. เปเบกเปˆเบ™เปเบ—เป‰เบšเป?

เบšเปเปˆ! เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Camunda เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเป‚เบ”เบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบฎเบนเป‰ Java เปเบฅเบฐเบ•เบฑเป‰เบ‡เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เปƒเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบฅเบทเบญเบ. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡:

  • เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบžเบทเป‰เบ™เบ–เบฒเบ™;
  • REST API
  • เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเปˆเบฝเบงเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆเบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบ Java;
  • เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบŠเป‰ C# เปเบฅเบฐ Node.JS;
  • เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Camunda (Docker เบซเบผเบท Tomcat).

เบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐ

Camunda เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ Java เปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™ Java Virtual Machine (JVM) เป€เบžเบทเปˆเบญเปเบฅเปˆเบ™. Camunda เปƒเบซเป‰ REST API เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบ‚เบฝเบ™เปƒเบ™เบžเบฒเบชเบฒเปƒเบ”เบเปเป„เบ”เป‰เบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบฑเบ เปเบฅเบฐเปƒเบŠเป‰ REST เบเบฑเบš Camunda:

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

Workflows เปƒเบ™ Camunda เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปƒเบ™ BPMN, เป€เบŠเบดเปˆเบ‡เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบงเปเบกเปˆเบ™เป„เบŸเบฅเปŒ XML. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบ”เป‰เบงเบ เบ™เบฒเบเปเบšเบš Camunda.

เปเบฅเปˆเบ™ Camunda เบœเปˆเบฒเบ™เบฎเบนเบš Docker เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบเปˆเบญเบ™

เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Camunda เปเบกเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰ Docker. เบงเบดเบ—เบตเบเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Camunda เปเบกเปˆเบ™เป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ•เปเปˆเบกเบฒเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ™เบตเป‰, เบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™:

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

เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบฑเบ‡เบงเบปเบ™เบเปˆเบฝเบงเบเบฑเบš Linux, JVMs เบซเบผเบท Tomcats. Dockerfiles เปเบฅเบฐเป€เบญเบเบฐเบชเบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™) เปเบกเปˆเบ™เบกเบตเบขเบนเปˆ GitHub.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Camunda Enterprise Edition เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ dockerfile.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบเบฒเบ™เปเบฅเปˆเบ™ Camunda เบเบฑเบš Docker เบกเบตเบ‚เปเป‰เป€เบชเบเบซเบ™เบถเปˆเบ‡: เบ—เปˆเบฒเบ™เบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเบชเบฐเบšเบฑเบšเบ‚เบญเบ‡ Tomcat เบ—เบตเปˆเบšเปเปˆเบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบซเบฅเป‰เบฒเบชเบธเบ”. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš Docker เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เปเบˆเบเบขเบฒเบ Tomcat เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰, เบซเบผเบทเปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ•เบปเบงเปเบšเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™

เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบกเปˆเปเบšเบš Saga เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบญเบ‡เบเบฒเบ™เป€เบ”เบตเบ™เบ—เบฒเบ‡เปเบšเบšเบ„เบฅเบฒเบชเบชเบดเบเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบเบฐเบ•เบธเป‰เบ™เบชเบฒเบกเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เปเปˆเบเบฑเบ™เปเบฅเบฐ gracefully เบŠเบปเบ”เป€เบŠเบตเบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเบ•เปเปˆเบกเบฒ. เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เปƒเบ™เบฎเบนเบšเปเบšเบš BPMN, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ 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 เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ›เบ‚เบญเบ‡ workflow instance:

  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) เป‚เบ”เบเปƒเบŠเป‰เบšเบฒเบ‡เบ•เบปเบงเปƒเบ™ เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เปเบ•เปˆเบเบฑเบ‡เป€เบญเบปเบฒเบฅเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบฐเบ™เบฑเบเบ‡เบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เบถเบ‡เป€เบญเบปเบฒเบฅเบฒเบเบเบฒเบ™เบงเบฝเบเบœเปˆเบฒเบ™ REST, เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™, เปเบฅเบฐเบšเบญเบ Camunda เปƒเบซเป‰เบชเปเบฒเป€เบฅเบฑเบ” (Pull-Principle).

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปเบฒเบญเบดเบ”เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” fetchAndLock (เป€เบžเบฒเบฐเบงเปˆเบฒเบ„เบปเบ™เบ‡เบฒเบ™เบญเบทเปˆเบ™เป†เบชเบฒเบกเบฒเบ”เบฎเบฑเบšเบงเบฝเบเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบฅเบฐเบšเบปเบš):

  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 เบงเปˆเบฒ เบ„เบปเบ™โ€‹เบ‡เบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹ (เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เปƒเบชเปˆ ID เบงเบฝเบเบžเบฒเบเบ™เบญเบเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เปเบฒเบญเบดเบ”):

  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 เปเบฅเบฐ Java, เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบนเบเบ„เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ Camunda เป€เบญเบ‡. เบขเปˆเบฒเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบˆเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ” REST API เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ Camunda. เบžเบฝเบ‡เปเบ•เปˆเบเป‰เบญเบ™เบงเปˆเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบšเปเปˆเบชเบฐเบซเบ™เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เบšเปเปˆเป„เบ”เป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡ Camunda's 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();

เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒ githubcom

เบงเบดเบ—เบตเบเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Camunda

เบฎเบนเบšเบžเบฒเบš Docker เปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡เบเบฑเบš "Camunda standalone WAR"

เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเบžเบฒเบš Docker เบ—เบตเปˆเบชเป‰เบฒเบ‡เป„เบงเป‰เบเปˆเบญเบ™เบˆเบฒเบ Camunda, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบฐเบเบฝเบก Tomcat เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบญเบตเบ‡เบ•เบฒเบกเบฎเบนเบšเบžเบฒเบš Docker Tomcat เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™) เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ„เบฑเบ”เบฅเบญเบ Camunda เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™เป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เป„เบŸเบฅเปŒ WAR เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ Java, เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเบปเบ‡เบ„เบฒเบก Camunda Standalone. เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ Maven เป€เบŠเบฑเปˆเบ™เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰: เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ Maven เบเบฑเบš config เบชเบปเบ‡เบ„เบฒเบก เบซเบผเบทเบเบฒเบ™เบ›เบฐเบเบญเบš Maven เบเบฑเบš Overlay.

เป€เบฅเบตเปˆเบกเบเบฒเบ™เปเบˆเบเบขเบฒเบ Camunda Tomcat

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบ”เบฒเบงเบ™เปŒเป‚เบซเบฅเบ”เบเบฒเบ™เปเบˆเบเบขเบฒเบ Camunda Tomcat, unzip เบกเบฑเบ™, เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบกเบฑเบ™. เบญเบฑเบ™เบ™เบตเป‰เบ•เป‰เบญเบ‡เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆ Java Runtime Environment (JRE) เบ—เบตเปˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ เบ”เบฒเบงโ€‹เบ™โ€‹เปŒโ€‹เป‚เบซเบฅเบ”โ€‹เบˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Camunda เบชเปเบฒเบฅเบฑเบš orchestration เบ‡เปˆเบฒเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ REST เปเบฅเบฐ Workflow Engine (เบšเปเปˆเบกเบต Java)

เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบทเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบญเบทเปˆเบ™เปƒเบ”, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡ configure Tomcat เบ„เบท เบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™. เบ‚เป‰เบญเบเบฎเบนเป‰เบงเปˆเบฒ Tomcat เบญเบฒเบ”เบˆเบฐเบชเบฑเบšเบชเบปเบ™, เปเบ•เปˆเบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบกเบฑเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ. เปเบฅเบฐ Google เบฎเบนเป‰เบ„เปเบฒเบ•เบญเบšเบ‚เบญเบ‡เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™.

เปเบฅเปˆเบ™ Camunda เปƒเบŠเป‰ Tomcat

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Tomcat เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ Camunda เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™, เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡. เบ™เบตเป‰เบˆเบฐเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ Tomcat เบฅเบธเป‰เบ™เปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™, เบซเบผเบทเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เป€เบ›เบฑเบ™เบšเปเบฅเบดเบเบฒเบ™ Windows, เบ•เบปเบงเบขเปˆเบฒเบ‡.

เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Camunda เปƒเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”

เบ›เบปเบเบเบฐเบ•เบดเบญเบฑเบ™เบ™เบตเป‰เบˆเบฐเบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบฑเป‰เบ™เบชเบธเบ”เบ—เป‰เบฒเบเป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰ Camunda. เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™ Camunda เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ, เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบžเบงเบเบกเบฑเบ™เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰ - เบ‚เป‰เบญเบเบˆเบฐเบ•เบฑเป‰เบ‡เบŠเบทเปˆเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡: REST API เบ‚เบญเบ‡เบเบฒเบ™เปเบˆเบเบขเบฒเบเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบชเบนเบ”เบขเบทเบ™เบขเบฑเบ™เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ™เบตเป‰.

Summing up

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบกเบฑเบ™เบ‡เปˆเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฑเบš Camunda, เป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบžเบฒเบชเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰. เบˆเบธเบ”เบชเปเบฒเบ„เบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบœเปˆเบฒเบ™ REST API. เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบเปเปˆเบ‡เปˆเบฒเบเบซเบผเบฒเบ, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป€เบกเบทเปˆเบญเปƒเบŠเป‰ Docker.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™