@Override public void unscheduleJob(@Nonnull JobId jobId) { scheduledJobs.remove(jobId); try { scheduler.unscheduleJob(jobId.toString()); } catch (IllegalArgumentException e) { // failures to unschedule are ignored according to the SchedulerService contract } }
@Nullable Trigger getTrigger(final JobId jobId) { try { return getScheduler().getTrigger(jobId.toString(), QUARTZ_TRIGGER_GROUP); } catch (SchedulerException se) { logWarn("Error getting quartz trigger for '{}'", jobId, se); return null; } }
@Nullable @Override public ClusteredJob find(final JobId jobId) { return Select.from(CLUSTERED_JOB) .whereEqual(JOB_ID, jobId.toString()) .runWith(entityEngine) .singleValue(); }
@Override public boolean delete(final JobId jobId) { final int rows = Delete.from(Name.CLUSTERED_JOB) .whereEqual(JOB_ID, jobId.toString()) .execute(entityEngine); switch (rows) { case 0: return false; case 1: return true; default: LOG.error("Unexpectedly deleted multiple rows removing a clustered job! jobId=" + jobId); return true; } } }
@SuppressWarnings("unchecked") @Nullable @Override public JobRunnerResponse runJob(final JobRunnerRequest request) { final Map<String, Serializable> params = request.getJobConfig().getParameters(); try { final Class<? extends PluginJob> jobClass = (Class<? extends PluginJob>) classLoader.loadClass((String) params.get(JOB_CLASS_CANONICAL_NAME)); jobClass.newInstance().execute(jobDataMap); return JobRunnerResponse.success(); } catch (Exception e) { log.error(String.format("Unable to execute the job [id:%s]", request.getJobId().toString()), e); return JobRunnerResponse.failed(e); } } }
boolean deleteTrigger(final JobId jobId) { try { return getScheduler().unscheduleJob(jobId.toString(), QUARTZ_TRIGGER_GROUP); } catch (SchedulerException se) { logWarn("Error removing Quartz trigger for '{}'", jobId, se); return false; } }
@Nullable @Override public RunDetails getLastRunForJob(@Nonnull final JobId jobId) { return Select.from(RUN_DETAILS) .whereEqual(JOB_ID, jobId.toString()) .orderBy(START_TIME_DESC) .limit(1) .runWith(entityEngine) .singleValue(); }
private void createClusteredJob(final ClusteredJob clusteredJob) { deleteExistingJob(clusteredJob.getJobId().toString()); entityEngine.createValue(CLUSTERED_JOB, new OfBizClusteredJob(null, clusteredJob)); }
@Nullable @Override public RunDetails getLastSuccessfulRunForJob(@Nonnull final JobId jobId) { return Select.from(RUN_DETAILS) .whereEqual(JOB_ID, jobId.toString()) .andEqual(OUTCOME, OUTCOME_SUCCESS) .orderBy(START_TIME_DESC) .limit(1) .runWith(entityEngine) .singleValue(); }
@Override public void scheduleJob(@Nonnull JobId jobId, @Nonnull JobConfig jobConfig) throws SchedulerServiceException { if (jobConfig.getSchedule().getType() == Schedule.Type.CRON_EXPRESSION) { throw new IllegalArgumentException("The fallback scheduler does not support CRON expressions"); } // always unschedule the job - any exceptions in case the job is not scheduled are swallowed unscheduleJob(jobId); scheduledJobs.put(jobId, jobConfig); IntervalScheduleInfo interval = jobConfig.getSchedule().getIntervalScheduleInfo(); Map<String, Object> contextMap = ImmutableMap.of( KEY_JOB_CONFIG, jobConfig, KEY_JOB_ID, jobId, KEY_SCHEDULER_SERVICE, this); scheduler.scheduleJob(jobId.toString(), JobRunnerAdapter.class, contextMap, interval.getFirstRunTime(), interval.getIntervalInMillis()); }
@Override public boolean updateNextRunTime(final JobId jobId, @Nullable final Date date, final long version) { final Long nextRun = (date != null) ? date.getTime() : null; final int rows = Update.into(Name.CLUSTERED_JOB) .set(NEXT_RUN, nextRun) .set(VERSION, version + 1L) .whereEqual(JOB_ID, jobId.toString()) .andEqual(VERSION, version) .execute(entityEngine); switch (rows) { case 0: return false; case 1: return true; default: LOG.error("Unexpectedly hit multiple rows updating a clustered job's next run time! jobId=" + jobId + "; date=" + date + "; version=" + version); return true; } }
@Nullable @Override public Long getVersion(final JobId jobId) { final GenericValue gv = Select.columns(VERSION) .from(Name.CLUSTERED_JOB) .whereEqual(JOB_ID, jobId.toString()) .runWith(entityEngine) .singleValue(); return (gv != null) ? gv.getLong(VERSION) : null; }
@Nullable @Override public Date getNextRunTime(final JobId jobId) { final GenericValue gv = Select.columns(NEXT_RUN) .from(Name.CLUSTERED_JOB) .whereEqual(JOB_ID, jobId.toString()) .runWith(entityEngine) .singleValue(); if (gv != null) { final Long value = gv.getLong(NEXT_RUN); if (value != null) { return new Date(value); } } return null; }
@Override public void addRunDetails(@Nonnull final JobId jobId, @Nonnull final RunDetails runDetails) { if (!started.get()) { warnNotStarted("Cannot record run details when the scheduling system is not started: jobId=" + jobId + "; runDetails=" + runDetails); return; } final List<Long> idsToRemove = isSuccess(runDetails) ? getAllIdsForJob(jobId) : getUnsuccessfulIdsForJob(jobId); entityEngine.createValue(RUN_DETAILS, new OfBizRunDetails(null, jobId.toString(), runDetails)); if (!idsToRemove.isEmpty()) { Delete.from(RUN_DETAILS) .whereCondition(new EntityExpr(ID, IN, idsToRemove)) .execute(entityEngine); } }
private List<Long> getAllIdsForJob(final JobId jobId) { return Select.id() .from(RUN_DETAILS) .whereEqual(JOB_ID, jobId.toString()) .runWith(entityEngine) .asList(); }
public Trigger buildTrigger(final JobId jobId, final JobConfig jobConfig) throws SchedulerServiceException { final byte[] parameters = parameterMapSerializer.serializeParameters(jobConfig.getParameters()); final Trigger trigger = buildTrigger(jobConfig.getSchedule()); trigger.setGroup(QUARTZ_TRIGGER_GROUP); trigger.setName(jobId.toString()); trigger.getJobDataMap().put(QUARTZ_PARAMETERS_KEY, parameters); return trigger; }
private List<Long> getUnsuccessfulIdsForJob(final JobId jobId) { return Select.id() .from(RUN_DETAILS) .whereEqual(JOB_ID, jobId.toString()) .whereCondition(new EntityExpr(OUTCOME, NOT_EQUAL, OUTCOME_SUCCESS)) .runWith(entityEngine) .asList(); }
addErrorMessage(getText("admin.schedulerdetails.failed.to.remove", job.getJobId().toString(), sre.getMessage()));
@Override public Map<String, Object> fieldMapFrom(final OfBizClusteredJob value) { final FieldMap fields = new FieldMap() .add(ID, value.getId()) .add(JOB_ID, value.getJobId().toString()) .add(JOB_RUNNER_KEY, value.getJobRunnerKey().toString()) .add(NEXT_RUN, toLong(value.getNextRunTime())) .add(VERSION, value.getVersion()) .add(PARAMETERS, value.getRawParameters()); addScheduleInfo(fields, value.getSchedule()); return fields; }
private void createFilterSubscriptionSchedule(final Long id, final Schedule schedule) throws SchedulerServiceException { final JobId jobId = toJobId(id); final Date nextRunTime = schedulerService.calculateNextRunTime(schedule); final ClusteredJob clusteredJob = ImmutableClusteredJob.builder() .jobId(jobId) .jobRunnerKey(JobRunnerKey.of(JOB_RUNNER_KEY)) .nextRunTime(nextRunTime) .schedule(schedule) .parameters(toRawParameters(id)) .build(); Delete.from(Entity.CLUSTERED_JOB) .whereEqual(ClusteredJobFactory.JOB_ID, jobId.toString()) .execute(entityEngine); entityEngine.createValue(Entity.CLUSTERED_JOB, new OfBizClusteredJob(null, clusteredJob)); }