request = initialStatus.getRequest(); if (initialStatus.getStatus() != JobStatus.Status.SUBMITTED) { if (initialStatus.getStatus() == JobStatus.Status.RUNNING) { _jobStatusDAO.updateJobStatus(jobId, new JobStatus<Q, R>(JobStatus.Status.RUNNING, request, null, null)); _jobStatusDAO.updateJobStatus(jobId, new JobStatus<Q, R>(JobStatus.Status.SUBMITTED, request, null, null)); return false; recordFinalStatus(jobId, new JobStatus<>(JobStatus.Status.FINISHED, request, response, null)); } catch (Exception e) { _log.error("Job failed: [id={}, type={}]", jobId, jobId.getJobType(), e); recordFinalStatus(jobId, new JobStatus<Q, R>(JobStatus.Status.FAILED, request, null, e.getMessage()));
@Override public PurgeStatus getPurgeStatus( String table, String jobID) { checkNotNull(table, "table"); JobIdentifier<PurgeRequest, PurgeResult> jobId; try { jobId = JobIdentifier.fromString(jobID, PurgeJob.INSTANCE); } catch (IllegalArgumentException e) { // The tableName is illegal and therefore cannot match any purge jobs. throw new UnknownPurgeException(jobID); } JobStatus<PurgeRequest, PurgeResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownPurgeException(jobID); } PurgeRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Purge request details not found: " + jobId); } switch (status.getStatus()) { case FINISHED: return new PurgeStatus(request.getTable(), PurgeStatus.Status.COMPLETE); case FAILED: return new PurgeStatus(request.getTable(), PurgeStatus.Status.ERROR); default: return new PurgeStatus(request.getTable(), PurgeStatus.Status.IN_PROGRESS); } }
/** * Attempts to record the final status for a job. Logs any errors, but always returns without throwing an * exception. * @param jobId The job ID * @param jobStatus The job's status * @param <Q> The job's request type * @param <R> The job's result type. */ private <Q, R> void recordFinalStatus(JobIdentifier<Q, R> jobId, JobStatus<Q, R> jobStatus) { try { _jobStatusDAO.updateJobStatus(jobId, jobStatus); } catch (Exception e) { _log.error("Failed to record final status for job: [id={}, status={}]", jobId, jobStatus.getStatus(), e); } }
@Override public <Q, R> JobIdentifier<Q, R> submitJob(JobRequest<Q, R> jobRequest) { checkNotNull(jobRequest, "jobRequest"); JobType<Q, R> jobType = jobRequest.getType(); // Ensure there is a handler for this job type RegistryEntry<?, ?> entry = _jobHandlerRegistry.getRegistryEntry(jobType.getName()); if (entry == null) { throw new IllegalArgumentException("Cannot handle job of type " + jobType); } // Create a unique job identifier JobIdentifier<Q, R> jobId = createNew(jobType); // Store the job status as "submitted" JobStatus<Q, R> jobStatus = new JobStatus<>(JobStatus.Status.SUBMITTED, jobRequest.getRequest(), null, null); _jobStatusDAO.updateJobStatus(jobId, jobStatus); // Queue the job _queueService.send(_queueName, jobId.toString()); return jobId; }
@Override public PurgeStatus getPurgeStatus( String table, String jobID) { checkNotNull(table, "table"); JobIdentifier<PurgeRequest, PurgeResult> jobId; try { jobId = JobIdentifier.fromString(jobID, PurgeJob.INSTANCE); } catch (IllegalArgumentException e) { // The tableName is illegal and therefore cannot match any purge jobs. throw new UnknownPurgeException(jobID); } JobStatus<PurgeRequest, PurgeResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownPurgeException(jobID); } PurgeRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Purge request details not found: " + jobId); } switch (status.getStatus()) { case FINISHED: return new PurgeStatus(request.getTable(), PurgeStatus.Status.COMPLETE); case FAILED: return new PurgeStatus(request.getTable(), PurgeStatus.Status.ERROR); default: return new PurgeStatus(request.getTable(), PurgeStatus.Status.IN_PROGRESS); } }
/** * Attempts to record the final status for a job. Logs any errors, but always returns without throwing an * exception. * @param jobId The job ID * @param jobStatus The job's status * @param <Q> The job's request type * @param <R> The job's result type. */ private <Q, R> void recordFinalStatus(JobIdentifier<Q, R> jobId, JobStatus<Q, R> jobStatus) { try { _jobStatusDAO.updateJobStatus(jobId, jobStatus); } catch (Exception e) { _log.error("Failed to record final status for job: [id={}, status={}]", jobId, jobStatus.getStatus(), e); } }
@Override public <Q, R> JobIdentifier<Q, R> submitJob(JobRequest<Q, R> jobRequest) { checkNotNull(jobRequest, "jobRequest"); JobType<Q, R> jobType = jobRequest.getType(); // Ensure there is a handler for this job type RegistryEntry<?, ?> entry = _jobHandlerRegistry.getRegistryEntry(jobType.getName()); if (entry == null) { throw new IllegalArgumentException("Cannot handle job of type " + jobType); } // Create a unique job identifier JobIdentifier<Q, R> jobId = createNew(jobType); // Store the job status as "submitted" JobStatus<Q, R> jobStatus = new JobStatus<>(JobStatus.Status.SUBMITTED, jobRequest.getRequest(), null, null); _jobStatusDAO.updateJobStatus(jobId, jobStatus); // Queue the job _queueService.send(_queueName, jobId.toString()); return jobId; }
@Override public ReplaySubscriptionStatus getReplayStatus(String ownerId, String reference) { checkNotNull(reference, "reference"); JobIdentifier<ReplaySubscriptionRequest, ReplaySubscriptionResult> jobId; try { jobId = JobIdentifier.fromString(reference, ReplaySubscriptionJob.INSTANCE); } catch (IllegalArgumentException e) { // The reference is illegal and therefore cannot match any replay jobs. throw new UnknownReplayException(reference); } JobStatus<ReplaySubscriptionRequest, ReplaySubscriptionResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownReplayException(reference); } ReplaySubscriptionRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Replay request details not found: " + jobId); } checkSubscriptionOwner(ownerId, request.getSubscription()); switch (status.getStatus()) { case FINISHED: return new ReplaySubscriptionStatus(request.getSubscription(), ReplaySubscriptionStatus.Status.COMPLETE); case FAILED: return new ReplaySubscriptionStatus(request.getSubscription(), ReplaySubscriptionStatus.Status.ERROR); default: return new ReplaySubscriptionStatus(request.getSubscription(), ReplaySubscriptionStatus.Status.IN_PROGRESS); } }
request = initialStatus.getRequest(); if (initialStatus.getStatus() != JobStatus.Status.SUBMITTED) { if (initialStatus.getStatus() == JobStatus.Status.RUNNING) { _jobStatusDAO.updateJobStatus(jobId, new JobStatus<Q, R>(JobStatus.Status.RUNNING, request, null, null)); _jobStatusDAO.updateJobStatus(jobId, new JobStatus<Q, R>(JobStatus.Status.SUBMITTED, request, null, null)); return false; recordFinalStatus(jobId, new JobStatus<>(JobStatus.Status.FINISHED, request, response, null)); } catch (Exception e) { _log.error("Job failed: [id={}, type={}]", jobId, jobId.getJobType(), e); recordFinalStatus(jobId, new JobStatus<Q, R>(JobStatus.Status.FAILED, request, null, e.getMessage()));
@Override public <Q, R> void updateJobStatus(JobIdentifier<Q, R> jobId, JobStatus<Q, R> jobStatus) { checkNotNull(jobId, "jobId"); checkNotNull(jobStatus, "jobStatus"); Delta delta = Deltas.mapBuilder() .put("status", JsonHelper.convert(jobStatus, Object.class)) .build(); write(jobId, delta, "Update job status to " + jobStatus.getStatus()); }
@Override public ReplaySubscriptionStatus getReplayStatus(String ownerId, String reference) { checkNotNull(reference, "reference"); JobIdentifier<ReplaySubscriptionRequest, ReplaySubscriptionResult> jobId; try { jobId = JobIdentifier.fromString(reference, ReplaySubscriptionJob.INSTANCE); } catch (IllegalArgumentException e) { // The reference is illegal and therefore cannot match any replay jobs. throw new UnknownReplayException(reference); } JobStatus<ReplaySubscriptionRequest, ReplaySubscriptionResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownReplayException(reference); } ReplaySubscriptionRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Replay request details not found: " + jobId); } checkSubscriptionOwner(ownerId, request.getSubscription()); switch (status.getStatus()) { case FINISHED: return new ReplaySubscriptionStatus(request.getSubscription(), ReplaySubscriptionStatus.Status.COMPLETE); case FAILED: return new ReplaySubscriptionStatus(request.getSubscription(), ReplaySubscriptionStatus.Status.ERROR); default: return new ReplaySubscriptionStatus(request.getSubscription(), ReplaySubscriptionStatus.Status.IN_PROGRESS); } }
@Override public <Q, R> void updateJobStatus(JobIdentifier<Q, R> jobId, JobStatus<Q, R> jobStatus) { checkNotNull(jobId, "jobId"); checkNotNull(jobStatus, "jobStatus"); Delta delta = Deltas.mapBuilder() .put("status", JsonHelper.convert(jobStatus, Object.class)) .build(); write(jobId, delta, "Update job status to " + jobStatus.getStatus()); }
@Override public MoveQueueStatus getMoveStatus(String reference) { checkNotNull(reference, "reference"); JobIdentifier<MoveQueueRequest, MoveQueueResult> jobId; try { jobId = JobIdentifier.fromString(reference, _moveQueueJobType); } catch (IllegalArgumentException e) { // The reference is illegal and therefore cannot match any move jobs. throw new UnknownMoveException(reference); } JobStatus<MoveQueueRequest, MoveQueueResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownMoveException(reference); } MoveQueueRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Move request details not found: " + jobId); } switch (status.getStatus()) { case FINISHED: return new MoveQueueStatus(request.getFrom(), request.getTo(), MoveQueueStatus.Status.COMPLETE); case FAILED: return new MoveQueueStatus(request.getFrom(), request.getTo(), MoveQueueStatus.Status.ERROR); default: return new MoveQueueStatus(request.getFrom(), request.getTo(), MoveQueueStatus.Status.IN_PROGRESS); } }
@Override public MoveQueueStatus getMoveStatus(String reference) { checkNotNull(reference, "reference"); JobIdentifier<MoveQueueRequest, MoveQueueResult> jobId; try { jobId = JobIdentifier.fromString(reference, _moveQueueJobType); } catch (IllegalArgumentException e) { // The reference is illegal and therefore cannot match any move jobs. throw new UnknownMoveException(reference); } JobStatus<MoveQueueRequest, MoveQueueResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownMoveException(reference); } MoveQueueRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Move request details not found: " + jobId); } switch (status.getStatus()) { case FINISHED: return new MoveQueueStatus(request.getFrom(), request.getTo(), MoveQueueStatus.Status.COMPLETE); case FAILED: return new MoveQueueStatus(request.getFrom(), request.getTo(), MoveQueueStatus.Status.ERROR); default: return new MoveQueueStatus(request.getFrom(), request.getTo(), MoveQueueStatus.Status.IN_PROGRESS); } }
@Override public MoveSubscriptionStatus getMoveStatus(String ownerId, String reference) { checkNotNull(reference, "reference"); JobIdentifier<MoveSubscriptionRequest, MoveSubscriptionResult> jobId; try { jobId = JobIdentifier.fromString(reference, MoveSubscriptionJob.INSTANCE); } catch (IllegalArgumentException e) { // The reference is illegal and therefore cannot match any move jobs. throw new UnknownMoveException(reference); } JobStatus<MoveSubscriptionRequest, MoveSubscriptionResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownMoveException(reference); } MoveSubscriptionRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Move request details not found: " + jobId); } checkSubscriptionOwner(ownerId, request.getFrom()); switch (status.getStatus()) { case FINISHED: return new MoveSubscriptionStatus(request.getFrom(), request.getTo(), MoveSubscriptionStatus.Status.COMPLETE); case FAILED: return new MoveSubscriptionStatus(request.getFrom(), request.getTo(), MoveSubscriptionStatus.Status.ERROR); default: return new MoveSubscriptionStatus(request.getFrom(), request.getTo(), MoveSubscriptionStatus.Status.IN_PROGRESS); } }
@Override public MoveSubscriptionStatus getMoveStatus(String ownerId, String reference) { checkNotNull(reference, "reference"); JobIdentifier<MoveSubscriptionRequest, MoveSubscriptionResult> jobId; try { jobId = JobIdentifier.fromString(reference, MoveSubscriptionJob.INSTANCE); } catch (IllegalArgumentException e) { // The reference is illegal and therefore cannot match any move jobs. throw new UnknownMoveException(reference); } JobStatus<MoveSubscriptionRequest, MoveSubscriptionResult> status = _jobService.getJobStatus(jobId); if (status == null) { throw new UnknownMoveException(reference); } MoveSubscriptionRequest request = status.getRequest(); if (request == null) { throw new IllegalStateException("Move request details not found: " + jobId); } checkSubscriptionOwner(ownerId, request.getFrom()); switch (status.getStatus()) { case FINISHED: return new MoveSubscriptionStatus(request.getFrom(), request.getTo(), MoveSubscriptionStatus.Status.COMPLETE); case FAILED: return new MoveSubscriptionStatus(request.getFrom(), request.getTo(), MoveSubscriptionStatus.Status.ERROR); default: return new MoveSubscriptionStatus(request.getFrom(), request.getTo(), MoveSubscriptionStatus.Status.IN_PROGRESS); } }