private void runReadyJobs() { final Iterator<Job> readyJobsIter = readyJobs.iterator(); while (readyJobsIter.hasNext() && !stopping) { final Job job = readyJobsIter.next(); try { transactional.execute(context -> runReadyJob(job)); } catch (TransactionFailureException e) { LOG.warn("Failed to run program {} in schedule {}. Skip running this program.", job.getSchedule().getProgramId(), job.getSchedule().getName(), e); } readyJobsIter.remove(); } }
private void runReadyJobs() { final Iterator<Job> readyJobsIter = readyJobs.iterator(); while (readyJobsIter.hasNext() && !stopping) { final Job job = readyJobsIter.next(); try { transactional.execute(context -> runReadyJob(job)); } catch (TransactionFailureException e) { LOG.warn("Failed to run program {} in schedule {}. Skip running this program.", job.getSchedule().getProgramId(), job.getSchedule().getName(), e); } readyJobsIter.remove(); } }
@Override public ConstraintResult check(ProgramSchedule schedule, ConstraintContext context) { int numRunning = context.getProgramRuns(schedule.getProgramId(), ProgramRunStatus.RUNNING, maxConcurrency).size(); if (numRunning >= maxConcurrency) { LOG.debug("Skipping run of program {} from schedule {} because there are at least {} running runs.", schedule.getProgramId(), schedule.getName(), maxConcurrency); return notSatisfied(context); } int numSuspended = context.getProgramRuns(schedule.getProgramId(), ProgramRunStatus.SUSPENDED, maxConcurrency).size(); if (numRunning + numSuspended >= maxConcurrency) { LOG.debug("Skipping run of program {} from schedule {} because there are at least" + "{} running runs and at least {} suspended runs.", schedule.getProgramId(), schedule.getName(), numRunning, numSuspended); return notSatisfied(context); } return ConstraintResult.SATISFIED; }
@Override public ConstraintResult check(ProgramSchedule schedule, ConstraintContext context) { int numRunning = context.getProgramRuns(schedule.getProgramId(), ProgramRunStatus.RUNNING, maxConcurrency).size(); if (numRunning >= maxConcurrency) { LOG.debug("Skipping run of program {} from schedule {} because there are at least {} running runs.", schedule.getProgramId(), schedule.getName(), maxConcurrency); return notSatisfied(context); } int numSuspended = context.getProgramRuns(schedule.getProgramId(), ProgramRunStatus.SUSPENDED, maxConcurrency).size(); if (numRunning + numSuspended >= maxConcurrency) { LOG.debug("Skipping run of program {} from schedule {} because there are at least" + "{} running runs and at least {} suspended runs.", schedule.getProgramId(), schedule.getName(), numRunning, numSuspended); return notSatisfied(context); } return ConstraintResult.SATISFIED; }
public void addProgramSchedule(ProgramSchedule schedule) throws AlreadyExistsException, SchedulerException { // Verify every trigger does not exist first before adding any of them to Quartz scheduler try { Map<String, TriggerKey> cronTriggerKeyMap = getCronTriggerKeyMap(schedule); for (TriggerKey triggerKey : cronTriggerKeyMap.values()) { assertTriggerDoesNotExist(triggerKey); } ProgramId program = schedule.getProgramId(); SchedulableProgramType programType = program.getType().getSchedulableType(); JobDetail job = addJob(program, programType); for (Map.Entry<String, TriggerKey> entry : cronTriggerKeyMap.entrySet()) { scheduleJob(entry.getValue(), schedule.getName(), entry.getKey(), job); } } catch (org.quartz.SchedulerException e) { throw new SchedulerException(e); } }
public void addProgramSchedule(ProgramSchedule schedule) throws AlreadyExistsException, SchedulerException { // Verify every trigger does not exist first before adding any of them to Quartz scheduler try { Map<String, TriggerKey> cronTriggerKeyMap = getCronTriggerKeyMap(schedule); for (TriggerKey triggerKey : cronTriggerKeyMap.values()) { assertTriggerDoesNotExist(triggerKey); } ProgramId program = schedule.getProgramId(); SchedulableProgramType programType = program.getType().getSchedulableType(); JobDetail job = addJob(program, programType); for (Map.Entry<String, TriggerKey> entry : cronTriggerKeyMap.entrySet()) { scheduleJob(entry.getValue(), schedule.getName(), entry.getKey(), job); } } catch (org.quartz.SchedulerException e) { throw new SchedulerException(e); } }
public void launch(Job job) throws Exception { ProgramSchedule schedule = job.getSchedule(); ProgramId programId = schedule.getProgramId(); Map<String, String> userArgs = Maps.newHashMap(); userArgs.putAll(schedule.getProperties()); userArgs.putAll(propertiesResolver.getUserProperties(Id.Program.fromEntityId(programId))); Map<String, String> systemArgs = Maps.newHashMap(); systemArgs.putAll(propertiesResolver.getSystemProperties(Id.Program.fromEntityId(programId))); // Let the triggers update the arguments first before setting the triggering schedule info ((SatisfiableTrigger) job.getSchedule().getTrigger()).updateLaunchArguments(job.getSchedule(), job.getNotifications(), userArgs, systemArgs); TriggeringScheduleInfo triggeringScheduleInfo = getTriggeringScheduleInfo(job); systemArgs.put(ProgramOptionConstants.TRIGGERING_SCHEDULE_INFO, GSON.toJson(triggeringScheduleInfo)); execute(programId, systemArgs, userArgs); LOG.info("Successfully started program {} in schedule {}.", schedule.getProgramId(), schedule.getName()); }
public void launch(Job job) throws Exception { ProgramSchedule schedule = job.getSchedule(); ProgramId programId = schedule.getProgramId(); Map<String, String> userArgs = Maps.newHashMap(); userArgs.putAll(schedule.getProperties()); userArgs.putAll(propertiesResolver.getUserProperties(Id.Program.fromEntityId(programId))); Map<String, String> systemArgs = Maps.newHashMap(); systemArgs.putAll(propertiesResolver.getSystemProperties(Id.Program.fromEntityId(programId))); // Let the triggers update the arguments first before setting the triggering schedule info ((SatisfiableTrigger) job.getSchedule().getTrigger()).updateLaunchArguments(job.getSchedule(), job.getNotifications(), userArgs, systemArgs); TriggeringScheduleInfo triggeringScheduleInfo = getTriggeringScheduleInfo(job); systemArgs.put(ProgramOptionConstants.TRIGGERING_SCHEDULE_INFO, GSON.toJson(triggeringScheduleInfo)); execute(programId, systemArgs, userArgs); LOG.info("Successfully started program {} in schedule {}.", schedule.getProgramId(), schedule.getName()); }
newProperties.putAll(additionalProperties); return new ProgramSchedule(schedule.getName(), schedule.getDescription(), schedule.getProgramId(), newProperties, schedule.getTrigger(), schedule.getConstraints(), schedule.getTimeoutMillis());
newProperties.putAll(additionalProperties); return new ProgramSchedule(schedule.getName(), schedule.getDescription(), schedule.getProgramId(), newProperties, schedule.getTrigger(), schedule.getConstraints(), schedule.getTimeoutMillis());
String cron = ((TimeTrigger) timeTrigger).getCronExpression(); String triggerName = AbstractTimeSchedulerService.getTriggerName(program, programType, schedule.getName(), cron); cronTriggerKeyMap.put(cron, triggerKeyForName(triggerName)); String triggerName = AbstractTimeSchedulerService.scheduleIdFor(program, programType, schedule.getName()); cronTriggerKeyMap.put(((TimeTrigger) schedule.getTrigger()).getCronExpression(), triggerKeyForName(triggerName)); return cronTriggerKeyMap;
String cron = ((TimeTrigger) timeTrigger).getCronExpression(); String triggerName = AbstractTimeSchedulerService.getTriggerName(program, programType, schedule.getName(), cron); cronTriggerKeyMap.put(cron, triggerKeyForName(triggerName)); String triggerName = AbstractTimeSchedulerService.scheduleIdFor(program, programType, schedule.getName()); cronTriggerKeyMap.put(((TimeTrigger) schedule.getTrigger()).getCronExpression(), triggerKeyForName(triggerName)); return cronTriggerKeyMap;
private TriggeringScheduleInfo getTriggeringScheduleInfo(Job job) { TriggerInfoContext triggerInfoContext = new TriggerInfoContext(job, store); SatisfiableTrigger trigger = ((SatisfiableTrigger) job.getSchedule().getTrigger()); List<TriggerInfo> triggerInfo = trigger.getTriggerInfos(triggerInfoContext); ProgramSchedule schedule = job.getSchedule(); return new DefaultTriggeringScheduleInfo(schedule.getName(), schedule.getDescription(), triggerInfo, schedule.getProperties()); }
private TriggeringScheduleInfo getTriggeringScheduleInfo(Job job) { TriggerInfoContext triggerInfoContext = new TriggerInfoContext(job, store); SatisfiableTrigger trigger = ((SatisfiableTrigger) job.getSchedule().getTrigger()); List<TriggerInfo> triggerInfo = trigger.getTriggerInfos(triggerInfoContext); ProgramSchedule schedule = job.getSchedule(); return new DefaultTriggeringScheduleInfo(schedule.getName(), schedule.getDescription(), triggerInfo, schedule.getProperties()); }
public void deleteProgramSchedule(ProgramSchedule schedule) throws NotFoundException, SchedulerException { try { Collection<TriggerKey> triggerKeys = getGroupedTriggerKeys(schedule); // Must assert all trigger keys exist before processing each trigger key assertTriggerKeysExist(triggerKeys); for (TriggerKey triggerKey : triggerKeys) { Trigger trigger = getTrigger(triggerKey, schedule.getProgramId(), schedule.getName()); scheduler.unscheduleJob(trigger.getKey()); JobKey jobKey = trigger.getJobKey(); if (scheduler.getTriggersOfJob(jobKey).isEmpty()) { scheduler.deleteJob(jobKey); } } } catch (org.quartz.SchedulerException e) { throw new SchedulerException(e); } }
public void deleteProgramSchedule(ProgramSchedule schedule) throws NotFoundException, SchedulerException { try { Collection<TriggerKey> triggerKeys = getGroupedTriggerKeys(schedule); // Must assert all trigger keys exist before processing each trigger key assertTriggerKeysExist(triggerKeys); for (TriggerKey triggerKey : triggerKeys) { Trigger trigger = getTrigger(triggerKey, schedule.getProgramId(), schedule.getName()); scheduler.unscheduleJob(trigger.getKey()); JobKey jobKey = trigger.getJobKey(); if (scheduler.getTriggersOfJob(jobKey).isEmpty()) { scheduler.deleteJob(jobKey); } } } catch (org.quartz.SchedulerException e) { throw new SchedulerException(e); } }
String.format("Must update the schedule '%s' with the same program as '%s'. " + "To change the program in a schedule, please delete the schedule and create a new one.", existing.getName(), existing.getProgramId().toString())); Objects.firstNonNull(scheduleDetail.getConstraints(), existing.getConstraints()); Long timeoutMillis = Objects.firstNonNull(scheduleDetail.getTimeoutMillis(), existing.getTimeoutMillis()); ProgramSchedule updatedSchedule = new ProgramSchedule(existing.getName(), description, programId, properties, trigger, constraints, timeoutMillis); scheduler.updateSchedule(updatedSchedule);
String.format("Must update the schedule '%s' with the same program as '%s'. " + "To change the program in a schedule, please delete the schedule and create a new one.", existing.getName(), existing.getProgramId().toString())); Objects.firstNonNull(scheduleDetail.getConstraints(), existing.getConstraints()); Long timeoutMillis = Objects.firstNonNull(scheduleDetail.getTimeoutMillis(), existing.getTimeoutMillis()); ProgramSchedule updatedSchedule = new ProgramSchedule(existing.getName(), description, programId, properties, trigger, constraints, timeoutMillis); scheduler.updateSchedule(updatedSchedule);
/** * Add a schedule to the store. * * @param schedule the schedule to add * @param status the status of the schedule to add * @param currentTime the current time in milliseconds when adding the schedule * @return the new schedule's last modified timestamp * @throws AlreadyExistsException if the schedule already exists */ private void addScheduleWithStatus(ProgramSchedule schedule, ProgramScheduleStatus status, long currentTime) throws AlreadyExistsException { byte[] scheduleKey = rowKeyBytesForSchedule(schedule.getProgramId().getParent().schedule(schedule.getName())); if (!store.get(new Get(scheduleKey)).isEmpty()) { throw new AlreadyExistsException(schedule.getProgramId().getParent().schedule(schedule.getName())); } Put schedulePut = new Put(scheduleKey); schedulePut.add(SCHEDULE_COLUMN_BYTES, GSON.toJson(schedule)); schedulePut.add(UPDATED_COLUMN_BYTES, currentTime); schedulePut.add(STATUS_COLUMN_BYTES, status.toString()); store.put(schedulePut); int count = 0; for (String triggerKey : extractTriggerKeys(schedule)) { byte[] triggerRowKey = rowKeyBytesForTrigger(scheduleKey, count++); store.put(new Put(triggerRowKey, TRIGGER_KEY_COLUMN_BYTES, triggerKey)); } }
/** * Add a schedule to the store. * * @param schedule the schedule to add * @param status the status of the schedule to add * @param currentTime the current time in milliseconds when adding the schedule * @return the new schedule's last modified timestamp * @throws AlreadyExistsException if the schedule already exists */ private void addScheduleWithStatus(ProgramSchedule schedule, ProgramScheduleStatus status, long currentTime) throws AlreadyExistsException { byte[] scheduleKey = rowKeyBytesForSchedule(schedule.getProgramId().getParent().schedule(schedule.getName())); if (!store.get(new Get(scheduleKey)).isEmpty()) { throw new AlreadyExistsException(schedule.getProgramId().getParent().schedule(schedule.getName())); } Put schedulePut = new Put(scheduleKey); schedulePut.add(SCHEDULE_COLUMN_BYTES, GSON.toJson(schedule)); schedulePut.add(UPDATED_COLUMN_BYTES, currentTime); schedulePut.add(STATUS_COLUMN_BYTES, status.toString()); store.put(schedulePut); int count = 0; for (String triggerKey : extractTriggerKeys(schedule)) { byte[] triggerRowKey = rowKeyBytesForTrigger(scheduleKey, count++); store.put(new Put(triggerRowKey, TRIGGER_KEY_COLUMN_BYTES, triggerKey)); } }