There is a task to call Camunda processes in Api Rest style. In zeebe there is instrument startprocessWithresult. I tried to reproduce it with following node.js code:
axios.post( Camundaurl + '/process-definition/key/' + ProcessKey + '/start',
{variables: vars, businessKey: sequenceId},
{httpAgent: httpagent, httpsAgent: httpsagent, timeout: timeout, auth: authCamunda})
.then(response => {
data = response.data;
status = "ACTIVE";
result = {processKey: ProcessKey, processId: data.id, status: status, data: data, id: sequenceId };
logger.log({level: 'info', message: {type: "RESPONSE", cluster: 'Camunda', method: 'processStart',
url: '/process-definition/key/' + ProcessKey + '/start', result: result, responsetime: Date.now() - beginreq, sequenceId: sequenceId}});
if (withresult == false || Date.now() - begintime > timeout) {
callback (res, {result: result});
return;
}
var delay = 16;
setTimeout(waitforresult, delay, res, result, delay, begintime + timeout, begintime, callback);
})
async function waitforresult (res, result, delay, endtime, begintime, callback) {
try {
const response = await axios.get(Camundaurl + '/history/process-instance/' + result.processId, { httpAgent: httpagent, httpsAgent: httpsagent, timeout: 20000, auth: authCamunda });
if (response.data.endTime || response.data.state !== 'ACTIVE') {
result.status = response.data.state;
const response2 = await axios.get(Camundaurl + '/history/variable-instance?processInstanceId=' + result.processId, { httpAgent: httpagent, httpsAgent: httpsagent, timeout: 20000, auth: authCamunda });
const vars = response2.data;
var obj = {};
for ( var i = 0; i < vars.length; i++) {
obj[vars[i].name] = vars[i].value;
}
result.data.variables = obj;
logger.log({level: 'info', message: {type: "RESPONSE", cluster: 'Camunda', method: 'processStart',
url: '/process-definition/key/' + result.processKey + '/start', result: logresult, responsetime: Date.now() - begintime, sequenceId: result.id}});
callback (res, {result: result});
return;
}
else {
if (delay > 250) {
delay = delay * 1.2;
}
else {
delay = delay * 2;
}
if (delay > 1000) {delay = 1000};
if (Date.now () > endtime) {
callback (res, {result: result});
return;
}
setTimeout(waitforresult, delay, res, result, delay, endtime, begintime, callback);
}
}
catch (error) {
console.log(error);
logger.log({level: 'error', message: {type: "RESPONSE", cluster: 'Camunda', method: 'processStart',
url: '/process-definition/key/' + result.processKey + '/start', error: error, responsetime: Date.now() - begintime, sequenceId: result.id}});
callback (res, {error: {error: error, id: result.id}});
}
}
I used method to check history data with some timeout. But I want to find way do it async. Is there some event in camunda Engine, to subscribe. I checked ExecutorListener, but it works while process still running, and I dont want to check all EndEvents in every Camunda Process to find out that state is reached.
Is there other way?