private void runJob(JobExecution jobExecution, Job<?> job) { JobExecutionContext jobExecutionContext = jobExecutionContextFactory.createJobExecutionContext(jobExecution); Progress progress = new ProgressImpl(jobExecution, jobExecutionUpdater, mailSender); jobExecutionTemplate.call(job, progress, jobExecutionContext); }
@Override public JobExecutionContext createJobExecutionContext(JobExecution jobExecution) { Authentication authentication = jobExecutorTokenService.createToken(jobExecution); Locale locale = jobExecutorLocaleService.createLocale(jobExecution); return JobExecutionContext.create(authentication, locale); } }
private <T> T tryCall(Job<T> job, Progress progress) { progress.start(); try { T result = job.call(progress); progress.success(); return result; } catch (Exception ex) { LOG.warn("Error executing job", ex); progress.failed(createFailureMessage(ex), ex); throw new JobExecutionException(ex); } }
@Override public void canceled() { JOB_EXECUTION_LOG.warn("Canceled"); jobExecution.setEndDate(Instant.now()); jobExecution.setStatus(CANCELED); sendEmail( jobExecution.getFailureEmail(), jobExecution.getType() + " job failed.", jobExecution.getLog()); update(); JobExecutionHolder.unset(); }
/** * Saves execution in the current thread, then creates a Job and submits that for asynchronous * execution. * * @param jobExecution the {@link JobExecution} to save and submit. */ public CompletableFuture<Void> submit(JobExecution jobExecution) { return submit(jobExecution, executorService); }
static JobExecutionContext create(Authentication newAuthentication, Locale newLocale) { return builder().setAuthentication(newAuthentication).setLocale(newLocale).build(); }
@Override public void start() { JobExecutionHolder.set(jobExecution); JOB_EXECUTION_LOG.info("Execution started."); jobExecution.setStartDate(Instant.now()); jobExecution.setStatus(RUNNING); update(); }
@Override public void increment(int amount) { jobExecution.setProgressInt(jobExecution.getProgressInt() + amount); update(); }
@Bean public JobExecutionContextFactory jobExecutionContextFactory() { return new JobExecutionContextFactoryImpl( jobExecutorTokenService(), jobExecutorLocaleService()); }
/** * Executes a job in the calling thread. * * @param <T> Job result type * @param job the {@link Job} to execute * @param progress {@link Progress} to report progress to * @param jobExecutionContext {@link Authentication} to run the job with * @return the result of the job execution * @throws JobExecutionException if job execution throws an exception */ <T> T call(Job<T> job, Progress progress, JobExecutionContext jobExecutionContext) { return runWithContext(jobExecutionContext, () -> tryCall(job, progress)); }
@Bean public JobExecutionUpdater jobExecutionUpdater() { return new JobExecutionUpdaterImpl(jobExecutionContextFactory()); } }
@Override public void setProgressMax(int max) { jobExecution.setProgressMax(max); update(); }
@Override public void update(JobExecution jobExecution) { JobExecutionContext jobExecutionContext = jobExecutionContextFactory.createJobExecutionContext(jobExecution); executorService.execute(() -> updateInternal(jobExecution, jobExecutionContext)); }
private void updateInternal(JobExecution jobExecution, JobExecutionContext jobExecutionContext) { SecurityContext originalContext = SecurityContextHolder.getContext(); try { SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); securityContext.setAuthentication(jobExecutionContext.getAuthentication()); SecurityContextHolder.setContext(securityContext); tryUpdate(jobExecution); } finally { SecurityContextHolder.setContext(originalContext); } }
private void register(JobFactory jobFactory) { jobFactoryRegistry.registerJobFactory(jobFactory); } }
public static Builder builder() { return new AutoValue_JobExecutionContext.Builder(); }
private void update() { updater.update(jobExecution); }
@Bean public JobExecutor jobExecutor(ExecutorService executorService) { return new JobExecutor( dataService, entityManager, jobExecutionUpdater, mailSender, executorService, jobFactoryRegistry, jobExecutionContextFactory); } }
@Bean public JobExecutorLocaleService jobExecutorLocaleService() { return new JobExecutorLocaleServiceImpl(userLocaleResolver); }
@Bean public JobExecutorTokenService jobExecutorTokenService() { return new JobExecutorTokenServiceImpl(userDetailsService, runAsUserTokenFactory); }