package org.ohdsi.webapi.job; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; import org.springframework.batch.core.step.tasklet.Tasklet; /** * */ public class JobTemplate { private static final Log log = LogFactory.getLog(JobTemplate.class); private final JobLauncher jobLauncher; private final JobBuilderFactory jobBuilders; private final StepBuilderFactory stepBuilders; public JobTemplate(final JobLauncher jobLauncher, final JobBuilderFactory jobBuilders, final StepBuilderFactory stepBuilders) { this.jobLauncher = jobLauncher; this.jobBuilders = jobBuilders; this.stepBuilders = stepBuilders; } public JobExecutionResource launch(final Job job, JobParameters jobParameters) throws WebApplicationException { JobExecution exec = null; try { jobParameters = new JobParametersBuilder(jobParameters).addLong("time", System.currentTimeMillis()) .toJobParameters(); exec = this.jobLauncher.run(job, jobParameters); if (log.isDebugEnabled()) { log.debug("JobExecution queued: " + exec); } } catch (final JobExecutionAlreadyRunningException e) { throw new WebApplicationException(Response.status(Status.CONFLICT).entity(e.getMessage()).build()); } catch (final Exception e) { throw new WebApplicationException(Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build()); } return JobUtils.toJobExecutionResource(exec); } public JobExecutionResource launchTasklet(final String jobName, final String stepName, final Tasklet tasklet, JobParameters jobParameters) throws WebApplicationException { JobExecution exec = null; try { //TODO Consider JobParametersIncrementer jobParameters = new JobParametersBuilder(jobParameters).addLong("time", System.currentTimeMillis()) .toJobParameters(); //TODO Consider our own check (since adding unique JobParameter) to see if related-job is running and throw "already running" final Step step = this.stepBuilders.get(stepName).tasklet(tasklet).allowStartIfComplete(true).build(); final Job job = this.jobBuilders.get(jobName).start(step).build(); exec = this.jobLauncher.run(job, jobParameters); } catch (final JobExecutionAlreadyRunningException e) { throw new WebApplicationException(Response.status(Status.CONFLICT).entity(e.getMessage()).build()); } catch (final JobInstanceAlreadyCompleteException e) { throw new WebApplicationException(Response.status(Status.CONFLICT).entity(e.getMessage()).build()); } catch (final Exception e) { throw new WebApplicationException(Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build()); } return JobUtils.toJobExecutionResource(exec); } }