ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ื”ืขืœื, ื”ืื‘ืจ! ืื™ืš ืคืึธืจืฉื˜ืขืœืŸ ืฆื• ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜ ืึท ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ "ื ื™ืฆืŸ Camunda ื•ื•ื™ ืึทืŸ ื’ืจื™ื ื’-ืฆื•-ื ื•ืฆืŸ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืžืึธื˜ืึธืจ (ืึธืŸ ืจื™ืจื ื“ื™ืง Java)" ื“ื•ืจืš Bernd Rรผcker.

07.07.2020/XNUMX/XNUMX, ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืึทืจื˜ื™ืงืœ Bernd Rรผcker

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ืื™ืš ืึธืคื˜ ื“ื™ืกืงื•ื˜ื™ืจืŸ ืžื™ืงืจืึธืกืขืจื•ื•ื™ืก ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืžื™ื˜ ื ื™ื˜-ื“ื–ืฉืึทื•ื•ืึท ืžืขื ื˜ืฉืŸ: C #, Node.JS/JavaScript ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืึธื“ืขืจ Golang ืขื ื˜ื•ื–ื™ืึทืกืฅ. ืึทืœืข ืคื•ืŸ โ€‹โ€‹ื–ื™ื™ ื–ืขื ืขืŸ ืคื™ื™ืกื˜ ืžื™ื˜ ื“ื™ ืคืึทืงื˜ ืึทื– ื–ื™ื™ ื“ืึทืจืคึฟืŸ ืึทืŸ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืžืึธื˜ืึธืจ ืื™ืŸ ืึท ืžื™ืงืจืึธืกืขืจื•ื•ื™ืก ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืึธื“ืขืจ ื ืึธืจ ืึท ื’ืขืฆื™ื™ึทื’ ืฆื• ืึทืคึผื˜ืึทืžื™ื™ื– ื“ื™ ื•ื•ืึธืจืงืคืœืึธื•ื• ืื•ืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืกื“ืจ, ืฉืขืคึผืŸ ื˜ื™ื™ืžืึทื•ืฅ, ืกืึทื’ืึท ืื•ืŸ ืงืึทืžืคึผืึทื ืกื™ื™ื˜ื™ื ื’ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–.

BPM ืคึผืœืึทื˜ืคืึธืจืžืข ืžื™ื˜ ืขืคึฟืขื ืขืŸ ืžืงื•ืจ ืคึฟื•ืŸ Camunda ื’ืจื•ื™ืก ืคึฟืึทืจ ืึทื–ืึท ื˜ืึทืกืงืก. ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคืจื™ื™ื ื“ืœืขื›ืงื™ื™ื˜ ืื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืคื•ืŸ ื“ื™ ืคึผืจืึธื“ื•ืงื˜. ืึธื‘ืขืจ ืื•ื™ื‘ ืื™ืจ ืงื•ืง ืื™ืŸ ื–ื™ื™ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, ืื™ืจ ืงืขืŸ ื‘ืึทืงื•ืžืขืŸ ื“ืขื ืจื•ืฉื ืึทื– Camunda ืก ืคืจื™ื™ึทื ื“ืœืขื›ืงื™ื™ึทื˜ ืื™ื– ื“ืขืจ ื”ื•ื™ืคึผื˜ ืึทื™ืžืขื“ ืฆื• Java ื“ืขื•ื•ืขืœืึธืคึผืขืจืก. ื“ื™ ืคึผืœืึทื˜ืคืึธืจืžืข ื’ื™ื˜ ืคื™ืœืข ืึทืคึผืขืจื˜ื•ื ืึทื˜ื™ื– ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืคืึทื ื’ืงืฉืึทื ื– ืื•ืŸ ื™ืงืกื˜ืขื ืฉืึทื ื–, ืึธื‘ืขืจ ื“ืึธืก ืื™ื– ืึทืœืข ื’ืขื˜ืืŸ ืื™ืŸ Java. ืื™ื– ืขืก ื˜ืึทืงืข?

ื ื™ื™ืŸ! ืื™ืŸ ืคืึทืงื˜, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ืœื•ื™ืคืŸ Camunda ืึธืŸ ืงื™ื™ืŸ Java ื•ื•ื™ืกืŸ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืฆื• ืงืึธื“ ืื™ืŸ ืงื™ื™ืŸ ืฉืคึผืจืึทืš ืคื•ืŸ ื“ื™ื™ืŸ ื‘ืจื™ืจื”. ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ:

  • ื™ืงืขืจื“ื™ืง ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ;
  • REST API;
  • ืขืฆื” ืื•ื™ืฃ ื™ื’ื–ื™ืกื˜ื™ื ื’ ืงืœื™ืขื ื˜ ืœื™ื™ื‘ืจืขืจื™ื– ืคึฟืึทืจ ืื ื“ืขืจืข ืฉืคึผืจืึทื›ืŸ ื•ื•ื™ Java;
  • ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื ื™ืฆืŸ C # ืื•ืŸ Node.JS;
  • ื•ื•ืขื’ืŸ ืฆื• ืœื•ื™ืคืŸ ืงืึทืžื•ื ื“ืึท ืกืขืจื•ื•ืขืจ (ื“ืึธืงืงืขืจ ืึธื“ืขืจ ื˜ืึธืžืงืึทื˜).

ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ

Camunda ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ Java ืื•ืŸ ืจื™ืงื•ื•ื™ื™ืขืจื– ืึท Java Virtual Machine (JVM) ืฆื• ืœื•ื™ืคืŸ. Camunda ื’ื™ื˜ ืึท REST API ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ืงื™ื™ืŸ ืฉืคึผืจืึทืš ืื™ืจ ื•ื•ื™ืœื˜ ืื•ืŸ ื ื•ืฆืŸ REST ืžื™ื˜ Camunda:

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ื•ื•ืึธืจืงืคืœืึธื•ื•ืก ืื™ืŸ ืงืึทืžื•ื ื“ืึท ื–ืขื ืขืŸ ื“ื™ืคื™ื™ื ื“ ืื™ืŸ BPMN, ื•ื•ืึธืก ืื™ื– ื‘ื™ื™ืกื™ืงืœื™ ืึท ืงืกืžืœ ื˜ืขืงืข. ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืžืึธื“ืขืœืขื“ ื ื™ืฆืŸ ืงืึทืžื•ื ื“ืึท ืžืึธื“ืขืœืขืจ.

ืคืœื™ืกื ื“ื™ืง ืงืึทืžื•ื ื“ืึท ื“ื•ืจืš ืึท ืคืึทืจ-ื’ืขื‘ื•ื™ื˜ ื“ืึธืงืงืขืจ ื‘ื™ืœื“

ื“ื™ ื™ื–ื™ืึทืกื˜ ื•ื•ืขื’ ืฆื• ืœื•ื™ืคืŸ Camunda ืื™ื– ืฆื• ื ื•ืฆืŸ Docker. ืึทืœื˜ืขืจื ืึทื˜ื™ื•ื•ืข ื•ื•ืขื’ืŸ ืฆื• ืœื•ื™ืคืŸ Camunda ื–ืขื ืขืŸ ื“ื™ืกืงืจื™ื™ื‘ื“ ืฉืคึผืขื˜ืขืจ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ.

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ืื™ืŸ ื“ืขื ืคืึทืœ, ื ืึธืจ ืœื•ื™ืคืŸ:

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

ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื• ื–ืึธืจื’ ื•ื•ืขื’ืŸ ืœื™ื ื•ืงืก, ื–'ืื‘ื ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืึธื“ืขืจ ื˜ืึธืžืงืึทืฅ. ื“ืึธืงืงืขืจืคื™ืœืขืก ืื•ืŸ ื™ืงืขืจื“ื™ืง ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ (ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืคึฟืึทืจ ืงืึทื ืขืงื˜ื™ื ื’ ืฆื• ื“ื™ ืคืืจืœืื ื’ื˜ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื–) ื–ืขื ืขืŸ ื‘ื ื™ืžืฆื ืื™ืŸ ื’ื™ื˜ื”ื•ื‘.

ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืœื•ื™ืคืŸ Camunda Enterprise Edition, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ื˜ื•ื™ืฉืŸ dockerfile.

ืึธื‘ืขืจ, ืขืก ืื™ื– ืื™ื™ืŸ ื“ืึทื•ื ืกื™ื™ื“ ืฆื• ืœื•ื™ืคืŸ ืงืึทืžื•ื ื“ืึท ื ื™ืฆืŸ ื“ืึธืงืงืขืจ: ืื™ืจ ื•ื•ืขื˜ ืกื•ืฃ ืึทืจื•ื™ืฃ ืžื™ื˜ ืึท ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹Tomcat ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ืฉื˜ืขื ื“ื™ืง ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื“ื™ ืœืขืฆื˜ืข ืคื™ืงืกื™ื–. ืฆื• ืขืคืขืก ื‘ืึทืงื•ืžืขืŸ ืึทืจื•ื ื“ืขื, ืื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ืึท ื“ืึธืงืงืขืจ ื‘ื™ืœื“ ื–ื™ืš ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ืขืจ ื’ืขื•ื•ืืœื˜ Tomcat ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’, ื•ื•ื™ ื’ืขื•ื•ื™ื–ืŸ ืื™ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ, ืึธื“ืขืจ ื ื•ืฆืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืกืึทืœื•ืฉืึทื ื– ื“ื™ืกืงืจื™ื™ื‘ื“ ืื•ื ื˜ืŸ.

ื“ื™ืคึผืœื™ื™ื™ื ื’ ืึท ืคึผืจืึธืฆืขืก ืžืึธื“ืขืœ

ืœืึธืžื™ืจ ื–ืขืŸ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืžื™ื˜ ื“ื™ ืกืึทื’ืึท ืžื•ืกื˜ืขืจ ืคึฟืึทืจ ืึท ืงืœืึทืกื™ืฉ ืจื™ื™ื–ืข ื‘ื•ืงื™ื ื’ ื•ื•ื• ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืฆื™ื ื’ืœ ื“ืจื™ื™ ืึทืงืฉืึทื ื– ืื™ืŸ ืึท ืจื•ื“ืขืจืŸ ืื•ืŸ ื’ืจืึทืฆื™ืขื– ืคืึทืจื’ื™ื˜ื™ืงืŸ ื’ืขืจืึธื˜ืŸ ืึทืงืฉืึทื ื– ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืฉืคึผืขื˜ืขืจ ื“ื•ืจื›ืคืึทืœ. ื“ืขืจืœืื ื’ื˜ ืื™ืŸ BPMN ืคืึธืจืขื, ืขืก ืงื•ืงื˜ ื•ื•ื™ ื“ืึธืก:

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ืื™ืฆื˜ ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ 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

ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ื˜ืฉื™ืงืึทื•ื•ืข ืงืฉื™ื ืื™ื– ื•ื•ื™ ืงืึทืžื•ื ื“ืึท ืฆื™ื ื’ืœ ืคึผืจืึธื•ืกื™ื“ื–ืฉืขืจื– ื•ื•ื™ ื‘ื•ืงื™ื ื’ ืึท ืžืึทืฉื™ืŸ? ืงืึทืžื•ื ื“ืึท ืงืขื ืขืŸ ื ื™ื˜ ื‘ืœื•ื™ื– ื’ืœื™ื™ืš ืจื•ืคืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก (ืคึผื•ืฉ-ืคึผืจื™ื ืกื™ืคึผืœืข), ื ื™ืฆืŸ ืขื˜ืœืขื›ืข ื’ืขื‘ื•ื™ื˜-ืื™ืŸ ืงืึทื ืขืงื˜ืขืจื–, ืึธื‘ืขืจ ืื•ื™ืš ืฉื˜ืขืœืŸ ืึทืจื‘ืขื˜ ื–ืื›ืŸ ืื™ืŸ ืึท ืžื™ืŸ ืคื•ืŸ ื’ืขื‘ื•ื™ื˜-ืื™ืŸ ืจื™ื™. ื“ืขืจ ืึทืจื‘ืขื˜ืขืจ ืงืขื ืขืŸ ื“ืขืจื ืึธืš ื‘ืึทืงื•ืžืขืŸ ืึทืจื‘ืขื˜ ื–ืื›ืŸ ื“ื•ืจืš REST, ื“ื•ืจื›ืคื™ืจืŸ ื“ื™ ืึทืจื‘ืขื˜ ืื•ืŸ ื‘ืึทืจื™ื›ื˜ ืงืึทืžืคึผืœื™ืฉืึทืŸ ืฆื• Camunda (Pull-Principle).

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ืึทื–ื•ื™ ืขืจืฉื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ืึธืŸ 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

ื“ืขืจื™ื‘ืขืจ ื–ืึธื’ืŸ ืงืึทืžื•ื ื“ืึท ืึทื– ืืจื‘ืขื˜ืขืจ ื”ืื˜ ืคืืจืขื ื“ื™ืงื˜ ืื™ืจ ืืจื‘ืขื˜ (ื‘ืึทืžืขืจืงื•ื ื’ ืึทื– ืื™ืจ ืžื•ื–ืŸ ืึทืจื™ื™ึทืŸ ื“ื™ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืึทืจื‘ืขื˜ ืฉื™ื™ึทืŸ ื‘ืืงื•ืžืขืŸ ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื‘ืขื˜ืŸ):

  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();

ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื•ื™ืฃ ื“ืขื ื•ื•ืขื‘ื–ื™ื™ื˜ืœ github.com

ืึทืœื˜ืขืจื ืึทื˜ื™ื•ื•ืข ื•ื•ืขื’ืŸ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืงืึทืžื•ื ื“ืึท

ืžื ื”ื’ ื“ืึธืงืงืขืจ ื‘ื™ืœื“ ืžื™ื˜ "Camunda ืกื˜ืึทื ื“ืึทืœืึธื ืข WAR"

ื•ื•ื™ ืึทืŸ ืึธืœื˜ืขืจื ืึทื˜ื™ื•ื• ืฆื• ื“ื™ ืคืึทืจ-ื’ืขื‘ื•ื™ื˜ ื“ืึธืงืงืขืจ ื‘ื™ืœื“ ืคึฟื•ืŸ ืงืึทืžื•ื ื“ืึท, ืื™ืจ ืงืขื ืขืŸ ืฆื•ื’ืจื™ื™ื˜ืŸ Tomcat ื–ื™ืš (ืœืžืฉืœ, ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ื‘ืึทืึทืžื˜ืขืจ ื“ืึธืงืงืขืจ ื˜ืึธืžืงืึทื˜ ื‘ื™ืœื“ืขืจ) ืื•ืŸ ื ืึธื›ืžืึทื›ืŸ ืงืึทืžื•ื ื“ืึท ืื™ืŸ ืขืก ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืึทื–ื•ื™-ื’ืขืจื•ืคึฟืŸ WAR ื˜ืขืงืขืก.

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ืคื™ืœืข ื ืึธืš ืจืขืงื•ื•ื™ืจืขืžืขื ืฅ ืื•ืŸ ืงืขื ืขืŸ ืงืึทืกื˜ืึทืžื™ื™ื– ืึท Java ื‘ื•ื™ืขืŸ ืกื•ื•ื™ื•ื•ืข, ืื™ืจ ืงืขื ืขืŸ ืื•ื™ืš ืงืึทื ืคื™ื’ื™ืขืจ Camunda ืกื˜ืึทื ื“ืึทืœืึธื ืข ืžืœื—ืžื”. ืฉื˜ืขืœืŸ ืึท ืžืึทื•ื•ืขืŸ ื‘ื•ื™ืขืŸ ื•ื•ื™ ืื™ืŸ ื“ื™ ื‘ื™ื™ืฉืคื™ืœืŸ: ื‘ื•ื™ืขืŸ ืžืึทื•ื•ืขืŸ ืžื™ื˜ ืžืœื—ืžื” ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืึธื“ืขืจ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืžืึทื•ื•ืขืŸ ืžื™ื˜ ืึธื•ื•ื•ืขืจืœื™ื™.

ืœืึธื ื˜ืฉื™ื ื’ ื“ื™ Camunda Tomcat ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’

ืืŸ ืื ื“ืขืจ ืึธืคึผืฆื™ืข ืื™ื– ืฆื• ืคืฉื•ื˜ ืืจืืคืงืืคื™ืข ื“ื™ Camunda Tomcat ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’, ืึทื ื–ื™ืคึผ ืขืก ืื•ืŸ ืœื•ื™ืคืŸ ืขืก. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ื“ื™ Java Runtime Environment (JRE) ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื™ืฃ ื“ื™ื™ืŸ ืงืึธืžืคึผื™ื•ื˜ืขืจ. ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื™ื›ื˜ ืึธืคึผืœืึธื“ื™ืจืŸ ืคื•ืŸ ื“ืึธ.

ื ื™ืฆืŸ Camunda ืคึฟืึทืจ ื’ืจื™ื ื’ REST-ื‘ืื–ื™ืจื˜ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืื•ืŸ ื•ื•ืึธืจืงืคืœืึธื•ื• ืขื ื’ื™ื ืข (ืงื™ื™ืŸ ื–'ืื‘ื)

ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืึธื“ืขืจ ื˜ืึธืŸ ืขืคึผืขืก ืึทื ื“ืขืจืฉ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ Tomcat ื•ื•ื™ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ. ืื™ืš ื•ื•ื™ืกืŸ ืึทื– Tomcat ืงืขืŸ ื•ื™ืกืงื•ืžืขืŸ ืงืึธืžืคึผืœื™ืฆื™ืจื˜, ืึธื‘ืขืจ ืขืก ืื™ื– ืคืืงื˜ื™ืฉ ื–ื™ื™ืขืจ ืคึผืฉื•ื˜. ืื•ืŸ Google ื”ืื˜ ื“ื™ ืขื ื˜ืคึฟืขืจืก ืฆื• ืึทืœืฅ ืื™ืจ ืงืขืŸ ื“ืึทืจืคึฟืŸ ืื™ืŸ ื“ืขื ืคึผืจืึธืฆืขืก.

ืคืœื™ืกื ื“ื™ืง ืงืึทืžื•ื ื“ืึท ื ื™ืฆืŸ Tomcat

ื“ื™ ืœืขืฆื˜ืข ืื ื“ืขืจ ื‘ืจื™ืจื” ืื™ื– ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ Tomcat ื–ื™ืš ืื•ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ Camunda ืื™ืŸ ืขืก, ื ืึธืš ื“ื™ ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’. ื“ืึธืก ื•ื•ืขื˜ ื’ืขื‘ืŸ ืื™ืจ ื“ื™ ื’ืขืœืขื’ื ื”ื™ื™ื˜ ืฆื• ื ื•ืฆืŸ ืงื™ื™ืŸ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹Tomcat ืื™ืจ ื‘ืขืกืขืจ ื•ื•ืขืœืŸ, ืึธื“ืขืจ, ืœืžืฉืœ, ื™ื ืกื˜ืึทืœื™ืจืŸ ืขืก ื•ื•ื™ ืึท Windows ื“ื™ื ืกื˜.

ืงืึทื•ื ื“ืึท ืื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข

ื˜ื™ืคึผื™ืงืึทืœืœื™, ื“ืึธืก ื•ื•ืขื˜ ื“ืึทืจืคืŸ ืื™ืจ ืฆื• ื˜ืึธืŸ ืขื˜ืœืขื›ืข ืœืขืฆื˜ ืกืขื˜ืึทืคึผ ืฆื• ื‘ืึทืงื•ืžืขืŸ Camunda ืคืœื™ืกื ื“ื™ืง. ืงืึทืžื•ื ื“ืึท ื”ืื˜ ื’ื™ื™ื“ืœื™ื™ื ื– ื•ื•ืึธืก ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ืขื ืื™ืŸ ื’ืจื•ื™ืก ื“ืขื˜ืึทืœ, ืึธื‘ืขืจ ืื™ืš ื•ื•ืขืœ ื ื™ืฉื˜ ืึธื ืจื™ืจืŸ ื–ื™ื™ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ - ืื™ืš ื•ื•ืขืœ ื ืึธืจ ื’ืขื‘ืŸ ืื™ื™ืŸ ื‘ื™ื™ืฉืคึผื™ืœ: ื“ื™ REST API ืคื•ืŸ ื“ื™ ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ ืื™ื– ื ื™ืฉื˜ ืงืึทื ืคื™ื’ื™ืขืจื“ ืคึฟืึทืจ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜. ืื™ืจ ื–ืืœ ื•ื•ืขืœืŸ ืฆื• ื˜ื•ื™ืฉืŸ ื“ืขื.

ืกื•ืžืžื™ื ื’-ืึทืจื•ื™ืฃ

ื•ื•ื™ ืื™ืจ ืงืขืŸ ื”ืึธื‘ืŸ ื‘ืืžืขืจืงื˜, ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ Camunda ืื™ื– ื–ื™ื™ืขืจ ื’ืจื™ื ื’, ืจืึทื’ืึทืจื“ืœืึทืก ืคื•ืŸ ื“ื™ ืฉืคึผืจืึทืš ืื™ืจ ื ื•ืฆืŸ. ื“ืขืจ ืฉืœื™ืกืœ ืคื•ื ื˜ ืื™ื– ืึทื– ืึทืœืข ืงืึธืžื•ื ื™ืงืึทืฆื™ืข ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ื“ื•ืจืš ื“ื™ REST API. ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืื™ื– ืื•ื™ืš ื’ืึทื ืฅ ืคึผืฉื•ื˜, ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ืื™ืจ ื ื•ืฆืŸ ื“ืึธืงืขืจ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’