cancel
Showing results for 
Search instead for 
Did you mean: 

Does 'taskVariableValueEquals' method does not work?

aitor
Champ in-the-making
Champ in-the-making
Tested in version 5.13:

My BPMN Process (simpleprocess.bpmn):


<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="UserTask1"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="UserTask2"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
</definitions>


My JUnit Test:

public class ProcessTestMyProcess {
   private String filename = "simpleprocess.bpmn";

   @Rule
   public ActivitiRule activitiRule = new ActivitiRule();

   @Test
   public void startProcess() throws Exception {
      RepositoryService repositoryService = activitiRule.getRepositoryService();
      repositoryService.createDeployment().addInputStream("myProcess.bpmn20.xml",
            new FileInputStream(filename)).deploy();
      RuntimeService runtimeService = activitiRule.getRuntimeService();
      Map<String, Object> variableMap = new HashMap<String, Object>();
      variableMap.put("name", "Activiti");
      ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", variableMap);
      assertNotNull(processInstance.getId());
      System.out.println("id " + processInstance.getId() + " " + processInstance.getProcessDefinitionId());
      
      // Get Task
      TaskService taskService = activitiRule.getTaskService();
      Task task = taskService.createTaskQuery().taskUnassigned().singleResult();
      assertNotNull(task.getId());
      System.out.println("Task 1 id " + task.getId());
      
      // Set Variable
      taskService.setVariable(task.getId(), "var_name", "var_value");
      
      // Get Task by variable
      Task task2 = taskService.createTaskQuery().taskVariableValueEquals("var_name", "var_value").singleResult();
      assertNotNull(task2.getId());
      System.out.println("Task 2 id " + task2.getId());
   }
}


The result is FAIL!!!???

Thanks.
2 REPLIES 2

trademak
Star Contributor
Star Contributor
When you do the query on a task variable (which is a local scoped variable) you should use setVariableLocal instead of setVariable.

Best regards,

aitor
Champ in-the-making
Champ in-the-making
Thanks trademak!!

With <code>taskService.setVariableLocal(task.getId(), "var_name", "var_value");</code> the result is OK. Smiley Happy

I add my JUnit to test the scope of variables (in case anyone finds it of interest):

<code>

TaskService taskService = activitiRule.getTaskService();
RuntimeService runtimeService = activitiRule.getRuntimeService();

// Get Task
Task task = taskService.createTaskQuery().singleResult();
assertNotNull(task.getId());

String executionId = task.getExecutionId();
String taskId = task.getId();

// Task Variable Scope:
// Global –> Execution Level (parentId == executionId)
// Local –> Task Level (parentId == taskId)

// Set Variables
runtimeService.setVariable(executionId, "var_exec_global", "var_value"); // (parentId == executionId)
runtimeService.setVariableLocal(executionId, "var_exec_local", "var_value"); // (parentId == executionId)
taskService.setVariable(taskId, "var_task_global", "var_value"); // (parentId == executionId)
taskService.setVariableLocal(taskId, "var_task_local", "var_value"); // (parentId == taskId)

// Get Execution by variable
Execution exec = runtimeService.createExecutionQuery().variableValueEquals("var_exec_global", "var_value").singleResult();
assertNotNull(exec); 
exec = runtimeService.createExecutionQuery().variableValueEquals("var_exec_local", "var_value").singleResult();
assertNotNull(exec);
exec = runtimeService.createExecutionQuery().variableValueEquals("var_task_global", "var_value").singleResult();
assertNotNull(exec);
 
// Get Task by variable
Task task2 = taskService.createTaskQuery().taskVariableValueEquals("var_task_global", "var_value").singleResult();
assertNull(task2); // <==== NULL
task2 = taskService.createTaskQuery().taskVariableValueEquals("var_task_local", "var_value").singleResult();
assertNotNull(task2);

// Get global variables with RuntimeService
Object value = runtimeService.getVariable(executionId, "var_exec_global");
assertNotNull(value);
value = runtimeService.getVariableLocal(executionId, "var_exec_global");
assertNotNull(value);
value = runtimeService.getVariable(executionId, "var_exec_local");
assertNotNull(value);
value = runtimeService.getVariableLocal(executionId, "var_exec_local");
assertNotNull(value);
value = runtimeService.getVariable(executionId, "var_task_global");
assertNotNull(value);
value = runtimeService.getVariableLocal(executionId, "var_task_global");
assertNotNull(value);

// Get global variables with TaskService
value = taskService.getVariable(taskId, "var_exec_global");
assertNotNull(value);
value = taskService.getVariable(taskId, "var_exec_local");
assertNotNull(value);
value = taskService.getVariable(taskId, "var_task_global");
assertNotNull(value);

// Get Local Task variables
value = taskService.getVariableLocal(taskId, "var_task_local");
assertNotNull(value);

</code>

Have a nice day.