private boolean wasCancelled(TaskId taskId) { return idToExecutionDetails.get(taskId).getStatus() == Status.CANCELLED; }
public Optional<TaskExecutionDetails.AdditionalInformation> getAdditionalInformation() { return executionDetails.getAdditionalInformation(); }
private void runWithMdc(TaskExecutionDetails executionDetails, Task task, Consumer<TaskId> callback) { MDCBuilder.withMdc( MDCBuilder.create() .addContext(Task.TASK_ID, executionDetails.getTaskId()) .addContext(Task.TASK_TYPE, executionDetails.getType()) .addContext(Task.TASK_DETAILS, executionDetails.getAdditionalInformation()), () -> run(executionDetails, task, callback)); }
private void run(TaskExecutionDetails executionDetails, Task task, Consumer<TaskId> callback) { TaskExecutionDetails started = executionDetails.start(); idToExecutionDetails.put(started.getTaskId(), started); try { task.run() .onComplete(() -> success(started)) .onFailure(() -> failed(started, logger -> logger.info("Task was partially performed. Check logs for more details"))); } catch (Exception e) { failed(started, logger -> logger.error("Error while running task", executionDetails, e)); } finally { idToFuture.remove(executionDetails.getTaskId()); callback.accept(executionDetails.getTaskId()); } }
public UUID getTaskId() { return executionDetails.getTaskId().getValue(); }
public String getType() { return executionDetails.getType(); }
public TaskExecutionDetails completed() { Preconditions.checkState(status == TaskManager.Status.IN_PROGRESS); return new TaskExecutionDetails( taskId, task, TaskManager.Status.COMPLETED, submitDate, startedDate, Optional.of(ZonedDateTime.now()), Optional.empty(), Optional.empty()); }
@Override public void cancel(TaskId id) { Optional.ofNullable(idToFuture.get(id)) .ifPresent(future -> { TaskExecutionDetails executionDetails = idToExecutionDetails.get(id); idToExecutionDetails.put(id, executionDetails.cancel()); future.cancel(INTERRUPT_IF_RUNNING); idToFuture.remove(id); }); }
@VisibleForTesting TaskId submit(Task task, Consumer<TaskId> callback) { TaskId taskId = TaskId.generateTaskId(); TaskExecutionDetails executionDetails = TaskExecutionDetails.from(task, taskId); idToExecutionDetails.put(taskId, executionDetails); idToFuture.put(taskId, executor.submit(() -> runWithMdc(executionDetails, task, callback))); return taskId; }
public TaskExecutionDetails failed() { Preconditions.checkState(status == TaskManager.Status.IN_PROGRESS); return new TaskExecutionDetails( taskId, task, TaskManager.Status.FAILED, submitDate, startedDate, Optional.empty(), Optional.empty(), Optional.of(ZonedDateTime.now())); }
public String getStatus() { return executionDetails.getStatus().getValue(); }
public static TaskExecutionDetails from(Task task, TaskId id) { return new TaskExecutionDetails( id, task, TaskManager.Status.WAITING, Optional.of(ZonedDateTime.now()), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); }
@Override public List<TaskExecutionDetails> list(Status status) { return idToExecutionDetails.values() .stream() .filter(details -> details.getStatus().equals(status)) .collect(Guavate.toImmutableList()); }
public TaskExecutionDetails start() { Preconditions.checkState(status == TaskManager.Status.WAITING); return new TaskExecutionDetails( taskId, task, TaskManager.Status.IN_PROGRESS, submitDate, Optional.of(ZonedDateTime.now()), Optional.empty(), Optional.empty(), Optional.empty()); }
@Test public void getStatusShouldReturnInProgressWhenProcessingIsInProgress() throws Exception { CountDownLatch latch1 = new CountDownLatch(1); CountDownLatch latch2 = new CountDownLatch(1); TaskId taskId = memoryTaskManager.submit(() -> { latch2.countDown(); await(latch1); return Task.Result.COMPLETED; }); latch2.await(); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.IN_PROGRESS); }
public TaskExecutionDetails cancel() { Preconditions.checkState(status == TaskManager.Status.IN_PROGRESS || status == TaskManager.Status.WAITING); return new TaskExecutionDetails( taskId, task, TaskManager.Status.CANCELLED, submitDate, startedDate, Optional.empty(), Optional.of(ZonedDateTime.now()), Optional.empty()); } }