diff --git a/webapp/src/main/java/com/box/l10n/mojito/quartz/QuartzPollableJob.java b/webapp/src/main/java/com/box/l10n/mojito/quartz/QuartzPollableJob.java index b5ba1040e2..7c7b56f06c 100644 --- a/webapp/src/main/java/com/box/l10n/mojito/quartz/QuartzPollableJob.java +++ b/webapp/src/main/java/com/box/l10n/mojito/quartz/QuartzPollableJob.java @@ -46,33 +46,40 @@ public void execute(JobExecutionContext context) throws JobExecutionException { Long pollableTaskId = context.getMergedJobDataMap().getLong(POLLABLE_TASK_ID); currentPollableTask = pollableTaskService.getPollableTask(pollableTaskId); - ExceptionHolder exceptionHolder = new ExceptionHolder(currentPollableTask); - - try { - I callInput; - - String inputStringFromJob = context.getMergedJobDataMap().getString(INPUT); - - if (inputStringFromJob != null) { - logger.debug("Inlined data, read from job data"); - callInput = - (I) objectMapper.readValueUnchecked(inputStringFromJob, typeTokenInput.getRawType()); - } else { - logger.debug("No inlined data, read from blob storage"); - callInput = - (I) pollableTaskBlobStorage.getInput(pollableTaskId, typeTokenInput.getRawType()); - } - - O callOutput = call(callInput); - - if (!typeTokenOutput.getRawType().equals(Void.class)) { - pollableTaskBlobStorage.saveOutput(pollableTaskId, callOutput); + if (currentPollableTask.getFinishedDate() != null) { + logger.error( + "PollableTask is already finished. Suspected invalid retry (potential scheduler shutdown " + + "after pollable was marked finished but befre Quartz job was recorded as finished)"); + } else { + ExceptionHolder exceptionHolder = new ExceptionHolder(currentPollableTask); + + try { + I callInput; + + String inputStringFromJob = context.getMergedJobDataMap().getString(INPUT); + + if (inputStringFromJob != null) { + logger.debug("Inlined data, read from job data"); + callInput = + (I) objectMapper.readValueUnchecked(inputStringFromJob, typeTokenInput.getRawType()); + } else { + logger.debug("No inlined data, read from blob storage"); + callInput = + (I) pollableTaskBlobStorage.getInput(pollableTaskId, typeTokenInput.getRawType()); + } + + O callOutput = call(callInput); + + if (!typeTokenOutput.getRawType().equals(Void.class)) { + pollableTaskBlobStorage.saveOutput(pollableTaskId, callOutput); + } + } catch (Throwable t) { + pollableTaskExceptionUtils.processException(t, exceptionHolder); + } finally { + currentPollableTask = + pollableTaskService.finishTask( + currentPollableTask.getId(), null, exceptionHolder, null); } - } catch (Throwable t) { - pollableTaskExceptionUtils.processException(t, exceptionHolder); - } finally { - currentPollableTask = - pollableTaskService.finishTask(currentPollableTask.getId(), null, exceptionHolder, null); } }