If you want the task id, it’s probably better to use a Task Listener than an execution listener because the execution listener will run before the task comes into existence.
public class test implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
//get the id of the current task
delegateTask.getId();
}
}
Hello,
because currently Camunda Modeler supports only Execution Listener template, not Task Listener, I faced the same problem.
I thought about it and today one idea came into my mind - Threads… Aaaand? It works! Finally!
package com.yourcompany.example;
import org.camunda.bpm.engine.ProcessEngineServices;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.task.Task;
public class MyExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution delegateExecution) throws Exception {
class RunnableTask implements Runnable {
ProcessEngineServices processEngineServices;
String processInstanceId;
String executionId;
RunnableTask(ProcessEngineServices processEngineServices, String processInstanceId, String executionId) {
this.processEngineServices = processEngineServices;
this.processInstanceId = processInstanceId;
this.executionId = executionId;
}
public void run() {
while(processEngineServices.getTaskService().createTaskQuery().processInstanceId(processInstanceId).executionId(executionId).singleResult() == null) {
// do nothing, wait for task instantiation
}
// get the task
Task task = processEngineServices.getTaskService().createTaskQuery().processInstanceId(processInstanceId).executionId(executionId).singleResult();
// just make sure that task really exists
if(task != null) {
// YOUR (TaskListener) CODE
}
}
}
// since the delegateExecution instance is destroyed after Execution Listener end,
// at least these three objects below can be useful ;)
Thread thread = new Thread(
new RunnableTask(
delegateExecution.getProcessEngineServices(),
delegateExecution.getProcessInstanceId(),
delegateExecution.getId()));
thread.start();
}
}
EDIT: If you want to get or set (local) variable(s) use:
processEngineServices.getRuntimeService() or
processEngineServices.getTaskService()
As I say normally, I hope it will help to somebody
But at this point the task is still not started. For example I want to start child tasks for this one but I am not able since the task is not started. Is it possible to have a listener after the task is started and then to get the task id?