рдХреИрдореБрдВрдбрд╛ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп - рд▓рдЪреАрд▓рд╛ рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг

рдЫрд╡рд┐

рдЯрд┐рдВрдХрдСрдлрд╝ рдореЗрдВ , рд╣рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдореБрдВрдбрд╛ + рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рд╣рдо рдлреНрд▓реЛрдЪрд╛рд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ BPMN (рдмрд┐рдЬрдиреЗрд╕ рдкреНрд░реЛрд╕реЗрд╕ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдиреЛрдЯреЗрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ ред

рд╣рдорд╛рд░реЗ рдЖрд░реЗрдЦреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрддреНрд╡ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп (рдЧрд┐рдпрд░ рдЖрдпрдд) рд╣реИред рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдореБрдВрдбрд╛ рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ :

  1. рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
  2. рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдмрдирд╛рдирд╛ред

рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдХреИрдореБрдбрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпрд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХрд╛рдо рд╕реМрдВрдкрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЫрд╡рд┐
рдЙрджрд╛рд╣рд░рдг BPMN рдЖрд░реЗрдЦ

рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдЖрдк рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рддрд░реНрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛ рдЬрдм рдЖрдк microservice рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдХрдиреАрдХреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛, рдЬреИрд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдирд╛ рдпрд╛ рдореЗрд▓ рдХрд░рдирд╛ред

рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде, рдПрдХ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдПрдХ рд╕реНрдХреЗрд▓реЗрдмрд▓, рд▓рдЪреАрд▓рд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмреАрдкреАрдПрдордПрди рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрддрд░реЛрдВ рдкрд░ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдмреАрдкреАрдПрдордПрди рдореЗрдВ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп


рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдкреИрдЯрд░реНрди рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐:

  1. , ┬л┬╗ , ┬л┬╗.
  2. camunda , , .
  3. camunda (/).

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрд░реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЬреНрдЮрд╛рдкрди рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ 2 рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдкрдгрди рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдХреЗ рдмрд╛рдж рдЖрд╡реЗрджрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░, рдпрджрд┐ 10 рд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рдореЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдмрдврд╝рд╛рдПрдВред

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдХреИрдореБрдВрдбрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛ , рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдИрдореЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдкреИрдЯрд░реНрди рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рдмрд╕ рдПрдХ рдИрдореЗрд▓ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдХрд╛рд░реНрдп рдмрдирд╛рдКрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реВрдБрдЧрд╛ред

рдЖрд░реЗрдЦ рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  1. рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдмрдирд╛рдПрдБ ред
  2. рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп рдореЗрдВ рдмрджрд▓реЗрдВ ред
  3. рдмрд╛рд╣рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗрдЯ рдХрд░реЗрдВ ред
  4. рд╡рд┐рд╖рдп рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ ред

рдЫрд╡рд┐

рдЯреЙрдкрд┐рдХ рдХрддрд╛рд░ рдХрд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдЧрд╛ред

рдЕрдм рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рд╣реИ , рддреЛ рдЖрдк рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХрд░реНрдореА


рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдкреИрдЯрд░реНрди рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдЯрд╛рд╕реНрдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ HTTP рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреИрдореБрдВрдбрд╛ рдмреНрд▓реЙрдЧ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рдПрдХ рдмрд╛рд╣рд░реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рд░ 20 рд╕реЗрдХрдВрдб рдореЗрдВ, рдХреИрдордХреБрдВрдбрд╛ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ ред рдпрджрд┐ рдХрд╛рд░реНрдп рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрдВрдХреБрдВрдбрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ ред

const baseUrl = 'http://localhost:8080/my-app/rest';
const workerSettings = {
 workerId: 'worker01', // some unique name for the current worker instance
 maxTasks: 5,
 topics: [
   {
     topicName: 'sendEmail',
     lockDuration: 10000, // How much time the worker thinks he needs to process the task
     variables: ['video'] // Which variables should be returned in the response (to avoid additional REST calls to read data)
   }]};
const requestParams = {method: 'POST', headers: {contentType: 'application/json'}};

function pollExternalTasks() {
 return fetch(`${baseUrl}/external-task/fetchAndLock`, {
   ...requestParams,
   body: JSON.stringify(workerSettings)
 })
}

function processExternalTask(result = []) {
 return Promise.all(result.map(externalTask => {
   sendEmail(externalTask); // Here the actual work would be done

   return fetch(`${baseUrl}/external-task/${externalTask.id}/complete`, {
     ...requestParams,
     body: JSON.stringify({workerId: workerSettings.workerId}),
   })
 }));
}

setInterval(() => {
 pollExternalTasks().then(processExternalTask)
}, 20000);

рдЖрдк рдКрдкрд░ рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рддрд░реАрдХреЛрдВ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ рд╣реИрдВ fetchAndLock рдФрд░ рдкреВрд░рд╛ ред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрди рджреЛ рддрд░реАрдХреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рднреА рд╣реИрдВ, рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

рдХреИрдордВрдбрд╛ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХреНрд▓рд╛рдЗрдВрдЯ


рдЫрд╡рд┐

рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрдордХреБрдВрдбрд╛ рдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬреЛ рдЖрдкрдХреЛ рдХреБрдЫ рд╣реА рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЧрд╛рдЗрдб рднреА рд╣реИ рдЬреЛ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ - рдлрд┐рд░ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде ред

рдПрдХ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ ExternalTaskClient :

public class App {
   public static void main(String... args) {
       // bootstrap the client
       ExternalTaskClient client = ExternalTaskClient.create()
           .baseUrl("http://localhost:8080/engine-rest")
           .asyncResponseTimeout(1000)
           .build();

       // subscribe to the topic
       client.subscribe("sendEmail").handler((externalTask, externalTaskService) -> {
           try {
               String result = sendEmail(externalTask)
               Map<String, Object> variables = new HashMap<>();

               variables.put("result", result);
               externalTaskService.complete(externalTask, variables);
               System.out.println("The External Task " + externalTask.getId() + " has been completed!");
           } catch (e: Exception) {
               externalTaskService.handleFailure(externalTask, e.message, e.stackTrace.toString())
           }
       }).open();
   }
}

рдпрджрд┐ рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рдордХрд╛рд▓рд┐рдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдорд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдХреЗ :

@Service
class EmailWorker(
   private val runtimeService: RuntimeService
) {
   val builder = ExternalTaskClientBuilderImpl().baseUrl("http://localhost:8080").workerId("myWorker")
   val taskClient = builder.build()
   val engineClient = (builder as ExternalTaskClientBuilderImpl).engineClient

   @PostConstruct
   fun init() {
       taskClient
           .subscribe("sendEmail")
           .lockDuration(10000)
           .handler { externalTask, externalService ->
               runtimeService.startProcessInstanceByKey(
                   "SendEmailProcess",
                   externalTask.getVariable("emailId"),
                   mapOf(
                       "text" to externalTask.getVariable("text"),
                       "email" to externalTask.getVariable("email")
                   )
               )
           }
           .open()
   }


   @PreDestroy
   fun destroy() {
       taskClient.stop()
   }
}

// Delegate from SendEmailProcess process
@Component
class EmailResultDelegate(private val emailWorker: EmailWorker) {
   fun doExecute(execution: DelegateExecution) {
       emailWorker.engineClient.complete(
           execution.readVar(EXTERNAL_TASK_ID),
           mapOf("result" to "Success")
       )
   }
}

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рд╣реИрдВрдбрд▓рд░ ( EmailWorker ) SendEmailProcess рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ ред

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддреА рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ EmailResultDelegate , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ ред

рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХреЗ рд╡рд╛рд╕реНрддреБ рд▓рд╛рдн


рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдХреИрдореБрдВрдбрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ: POST: / rest / process-definition / key / $ {id} / start

рдЬрдм рдЖрдк REST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд▓реЗрди-рджреЗрди рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо REST рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рднреА рдХрд░рддреЗ рд╣реИрдВ , рдлрд┐рд░ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ? рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдХреБрдЫ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рдПрдХ рдХрд╛рд░реНрдп рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдм рдЙрд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдХреИрдордХреБрдВрдбрд╛ рдХреА рддрд░рдл



рдЫрд╡рд┐

рдПрдХ рдХрд╛рд░реНрдп рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рд▓реЗрдХрд┐рди рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ: рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрдВрдХреБрдВрдбрд╛ рдореЗрдВ рдПрдХ рд╕рдордпрдмрд╛рд╣реНрдп рд╣реИ рдЬрд┐рд╕рд╕реЗ рдХрд╛рд░реНрдп рдлрд┐рд░ рд╕реЗ рдХрддрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдЖрдЗрдП рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦреЗрдВ рдЬрдм рдПрдХ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рдиреЗ рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рдЙрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛, рдФрд░ рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ , рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рдЕрдм рдЖрдк рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдореЗрдВ рдкреВрд░рд╛ рд╣реБрдЖ рдерд╛ рдпрд╛ рдирд╣реАрдВред рдЖрдк рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрдиреА рд░рд╣реЗрдВрдЧреАред



рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╕рдорд╕реНрдпрд╛ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрд╛рд░реНрдп рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдп рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдмрд╛рд╣рд░реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреЗрд░реЛрдЬрдЧрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП businessKey ред

рдЙрдЪреНрдЪ рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╛рд╣рд░реА рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рдкреИрдЯрд░реНрди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдирдХреА рд╕реНрдерд┐рд░рддрд╛ рдмрдврд╝реЗред рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдп рдХреЗ

рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА : https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/ https://docs.camunda.org/manual/latest/reference/rest=exex -task / https://docs.camunda.org/manual/latest/user-guide/ext-client/



All Articles