public DeciderOutcome decide(Workflow workflow) throws TerminateWorkflowException { //In case of a new workflow the list of tasks will be empty final List<Task> tasks = workflow.getTasks(); //In case of a new workflow the list of executedTasks will also be empty List<Task> executedTasks = tasks.stream() .filter(t -> !t.getStatus().equals(SKIPPED) && !t.getStatus().equals(READY_FOR_RERUN) && !t.isExecuted()) .collect(Collectors.toList()); List<Task> tasksToBeScheduled = new LinkedList<>(); if (executedTasks.isEmpty()) { //this is the flow that the new workflow will go through tasksToBeScheduled = startWorkflow(workflow); if (tasksToBeScheduled == null) { tasksToBeScheduled = new LinkedList<>(); } } return decide(workflow, tasksToBeScheduled); }
@Test public void testFork() throws IOException { InputStream stream = TestDeciderService.class.getResourceAsStream("/test.json"); Workflow workflow = objectMapper.readValue(stream, Workflow.class); DeciderOutcome outcome = deciderService.decide(workflow); assertFalse(outcome.isComplete); assertEquals(5, outcome.tasksToBeScheduled.size()); assertEquals(1, outcome.tasksToBeUpdated.size()); }
@Test public void testWorkflowWithNoTasks() throws Exception { InputStream stream = TestDeciderOutcomes.class.getResourceAsStream("/conditional_flow.json"); WorkflowDef def = objectMapper.readValue(stream, WorkflowDef.class); assertNotNull(def); Workflow workflow = new Workflow(); workflow.setWorkflowDefinition(def); workflow.setStartTime(0); workflow.getInput().put("param1", "nested"); workflow.getInput().put("param2", "one"); DeciderOutcome outcome = deciderService.decide(workflow); assertNotNull(outcome); assertFalse(outcome.isComplete); assertTrue(outcome.tasksToBeUpdated.isEmpty()); assertEquals(3, outcome.tasksToBeScheduled.size()); System.out.println(outcome.tasksToBeScheduled); outcome.tasksToBeScheduled.forEach(t -> t.setStatus(Status.COMPLETED)); workflow.getTasks().addAll(outcome.tasksToBeScheduled); outcome = deciderService.decide(workflow); assertFalse(outcome.isComplete); assertEquals(outcome.tasksToBeUpdated.toString(), 3, outcome.tasksToBeUpdated.size()); assertEquals(1, outcome.tasksToBeScheduled.size()); assertEquals("junit_task_3", outcome.tasksToBeScheduled.get(0).getTaskDefName()); System.out.println(outcome.tasksToBeScheduled); }
DeciderService.DeciderOutcome outcome = deciderService.decide(workflow); if (outcome.isComplete) { completeWorkflow(workflow);
@Test public void testCaseStatement() { WorkflowDef def = createConditionalWF(); Workflow wf = new Workflow(); wf.setWorkflowDefinition(def); wf.setCreateTime(0L); wf.setWorkflowId("a"); wf.setCorrelationId("b"); wf.setStatus(WorkflowStatus.RUNNING); DeciderOutcome outcome = deciderService.decide(wf); List<Task> scheduledTasks = outcome.tasksToBeScheduled; assertNotNull(scheduledTasks); assertEquals(2, scheduledTasks.size()); assertEquals(Status.IN_PROGRESS, scheduledTasks.get(0).getStatus()); assertEquals(Status.SCHEDULED, scheduledTasks.get(1).getStatus()); }
workflow.getInput().put("requestId", 123); workflow.setStartTime(System.currentTimeMillis()); DeciderOutcome outcome = deciderService.decide(workflow); assertNotNull(outcome); workflow.getTasks().addAll(outcome.tasksToBeScheduled); outcome = deciderService.decide(workflow); assertNotNull(outcome); workflow.getInput().put("forkedInputs", forkedInputs); outcome = deciderService.decide(workflow); assertNotNull(outcome); assertEquals(3, outcome.tasksToBeScheduled.size()); outcome = deciderService.decide(workflow); assertTrue(outcome.tasksToBeScheduled.stream().anyMatch(task1 -> task1.getReferenceTaskName().equals("f0")));
workflow.setWorkflowDefinition(def); workflow.setStartTime(System.currentTimeMillis()); DeciderOutcome outcome = deciderService.decide(workflow); assertNotNull(outcome); outcome = deciderService.decide(workflow); assertEquals(2, outcome.tasksToBeScheduled.size()); assertEquals(decide.getTaskReferenceName(), outcome.tasksToBeScheduled.get(0).getReferenceTaskName()); outcome = deciderService.decide(workflow); assertEquals(2, outcome.tasksToBeScheduled.size()); assertEquals(decide.getTaskReferenceName(), outcome.tasksToBeScheduled.get(0).getReferenceTaskName());
new DeciderService(parametersUtils, queueDAO, metadataDAO, externalPayloadStorageUtils, taskMappers).decide(workflow);
@Test public void testDecideFailedTask() { WorkflowDef workflowDef = createLinearWorkflow(); Workflow workflow = new Workflow(); workflow.setWorkflowDefinition(workflowDef); workflow.setStatus(WorkflowStatus.RUNNING); Task task = new Task(); task.setTaskType("junit_task_l1"); task.setReferenceTaskName("s1"); task.setSeq(1); task.setRetried(false); task.setExecuted(false); task.setStatus(Status.FAILED); WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setTaskReferenceName("s1"); workflowTask.setName("junit_task_l1"); workflowTask.setTaskDefinition(new TaskDef("junit_task_l1")); task.setWorkflowTask(workflowTask); workflow.getTasks().add(task); DeciderOutcome deciderOutcome = deciderService.decide(workflow); assertNotNull(deciderOutcome); assertFalse(workflow.getTaskByRefName("s1").isExecuted()); assertTrue(workflow.getTaskByRefName("s1").isRetried()); assertEquals(1, deciderOutcome.tasksToBeUpdated.size()); assertEquals("s1", deciderOutcome.tasksToBeUpdated.get(0).getReferenceTaskName()); assertEquals(1, deciderOutcome.tasksToBeScheduled.size()); assertEquals("s1", deciderOutcome.tasksToBeScheduled.get(0).getReferenceTaskName()); assertEquals(0, deciderOutcome.tasksToBeRequeued.size()); assertFalse(deciderOutcome.isComplete); }
public DeciderOutcome decide(Workflow workflow) throws TerminateWorkflowException { //In case of a new workflow the list of tasks will be empty final List<Task> tasks = workflow.getTasks(); //In case of a new workflow the list of executedTasks will also be empty List<Task> executedTasks = tasks.stream() .filter(t -> !t.getStatus().equals(SKIPPED) && !t.getStatus().equals(READY_FOR_RERUN) && !t.isExecuted()) .collect(Collectors.toList()); List<Task> tasksToBeScheduled = new LinkedList<>(); if (executedTasks.isEmpty()) { //this is the flow that the new workflow will go through tasksToBeScheduled = startWorkflow(workflow); if (tasksToBeScheduled == null) { tasksToBeScheduled = new LinkedList<>(); } } return decide(workflow, tasksToBeScheduled); }
DeciderService.DeciderOutcome outcome = deciderService.decide(workflow); if (outcome.isComplete) { completeWorkflow(workflow);