@Override public boolean isLastExecutionFinished(ScheduledTask task, long now) { EntityManager em = persistence.getEntityManager(); Query query = em.createQuery( "select e.finishTime from sys$ScheduledExecution e where e.task.id = ?1 and e.startTime = ?2"); query.setParameter(1, task.getId()); query.setParameter(2, task.getLastStartTime()); List list = query.getResultList(); if (list.isEmpty() || list.get(0) == null) { // Execution finish was not registered for some reason, so using timeout value or just return false boolean result = task.getTimeout() != null && (task.getLastStart() + task.getTimeout() * 1000) <= now; if (result) log.trace(task + ": considered finished because of timeout"); else log.trace(task + ": not finished and not timed out"); return result; } Date date = (Date) list.get(0); log.trace("{} : finished at {}", task, date.getTime()); return true; }
protected void runSingletonTask(ScheduledTask task, long now, String server) throws LoginException { boolean finished = true; if (task.getLastStart() > 0 && lastServerWasNotMe(task, server)) { // Check whether the task is finished if the last execution was from another server finished = coordinator.isLastExecutionFinished(task, now); } if (finished) { task.setLastStartTime(new Date(now)); task.setLastStartServer(server); runner.runTask(task, now, getUserSession(task)); } else log.trace("{}\n not finished", task); }
long currentStart; if (SchedulingType.FIXED_DELAY == task.getSchedulingType()) { currentStart = calculateNextDelayDate(task, task.getLastStart(), coordinator.getLastFinished(task), now, frame, period); } else if (SchedulingType.CRON == task.getSchedulingType()) { currentStart = calculateNextCronDate(task, task.getLastStart(), now, frame); } else { currentStart = calculateNextPeriodDate(task, task.getLastStart(), now, frame, period); if (needToStartInTimeFrame(now, frame, task.getLastStart(), currentStart)) { runSingletonTask(task, now, me); } else { task, now, task.getLastStart(), task.getLastStartServer(), shouldSwitch, giveChanceToPreviousHost); if (task.getLastStart() == 0 || shouldSwitch) { runSingletonTask(task, now, me); } else { if (SchedulingType.FIXED_DELAY == task.getSchedulingType()) { long lastFinish = coordinator.getLastFinished(task); if ((task.getLastStart() < lastFinish || !lastFinishCache.containsKey(task)) && lastFinish + delay < now) { runSingletonTask(task, now, me); } else { log.trace("{}\n time has not come and we shouldn't switch", task); } else if (task.getLastStart() + delay <= now) { runSingletonTask(task, now, me); } else {