public Result onFailure(Operation... operation) { if (this == PARTIAL) { run(operation); } return this; }
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()); } }
@Test public void getStatusShouldReturnFailedWhenRunPartially() throws Exception { CountDownLatch latch = new CountDownLatch(1); TaskId taskId = memoryTaskManager.submit( () -> Task.Result.PARTIAL, countDownCallback(latch)); latch.await(); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.FAILED); }
@Test public void getStatusShouldReturnWaitingWhenNotYetProcessed() { CountDownLatch task1Latch = new CountDownLatch(1); memoryTaskManager.submit(() -> { await(task1Latch); return Task.Result.COMPLETED; }); TaskId taskId = memoryTaskManager.submit(() -> Task.Result.COMPLETED); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.WAITING); }
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 failed(TaskExecutionDetails started, Consumer<Logger> logOperation) { if (!wasCancelled(started.getTaskId())) { idToExecutionDetails.put(started.getTaskId(), started.failed()); logOperation.accept(LOGGER); } }
private void success(TaskExecutionDetails started) { if (!wasCancelled(started.getTaskId())) { idToExecutionDetails.put(started.getTaskId(), started.completed()); LOGGER.info("Task success"); } }
@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; }
@Override public TaskId submit(Task task) { return submit(task, id -> { }); }
public String getType() { return executionDetails.getType(); }
public Optional<TaskExecutionDetails.AdditionalInformation> getAdditionalInformation() { return executionDetails.getAdditionalInformation(); }
public Optional<AdditionalInformation> getAdditionalInformation() { return task.details(); }
public String getType() { return task.type(); }
@Test public void getStatusShouldReturnCompletedWhenRunSuccessfully() throws Exception { CountDownLatch latch = new CountDownLatch(1); TaskId taskId = memoryTaskManager.submit( () -> Task.Result.COMPLETED, countDownCallback(latch)); latch.await(); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.COMPLETED); }
@Test public void getStatusShouldReturnWaitingWhenNotYetProcessed() { CountDownLatch task1Latch = new CountDownLatch(1); memoryTaskManager.submit(() -> { await(task1Latch); return Task.Result.COMPLETED; }); TaskId taskId = memoryTaskManager.submit(() -> Task.Result.COMPLETED); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.WAITING); }
public Result onComplete(Operation... operation) { try { if (this == COMPLETED) { run(operation); } return this; } catch (Exception e) { LOGGER.error("Error while executing operation", e); return PARTIAL; } }
@Test public void getStatusShouldReturnCompletedWhenRunSuccessfully() throws Exception { CountDownLatch latch = new CountDownLatch(1); TaskId taskId = memoryTaskManager.submit( () -> Task.Result.COMPLETED, countDownCallback(latch)); latch.await(); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.COMPLETED); }
@Test public void getStatusShouldReturnFailedWhenRunPartially() throws Exception { CountDownLatch latch = new CountDownLatch(1); TaskId taskId = memoryTaskManager.submit( () -> Task.Result.PARTIAL, countDownCallback(latch)); latch.await(); assertThat(memoryTaskManager.getExecutionDetails(taskId).getStatus()) .isEqualTo(TaskManager.Status.FAILED); }