package net.techreadiness.batch.jobs;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.SimpleJob;
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.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.bind.annotation.RequestMapping;
public abstract class BaseJobBean extends QuartzJobBean {
@Inject
JobRepository jobRepository;
@Inject
JobLauncher jobLauncher;
@Inject
PlatformTransactionManager transactionManager;
protected final Logger log = LoggerFactory.getLogger(this.getClass());
protected TaskletStep createTaskletStep(String name, Tasklet tasklet) {
TaskletStep ts = new TaskletStep(name);
ts.setJobRepository(jobRepository);
ts.setTransactionManager(transactionManager);
ts.setTasklet(tasklet);
return ts;
}
protected SimpleJob createSimpleJob(String name, Step initialStep) {
SimpleJob job = new SimpleJob(name);
job.setJobRepository(jobRepository);
job.addStep(initialStep);
return job;
}
@RequestMapping
protected void runJob(Job job, JobExecutionContext context, Map<String, JobParameter> map) {
try {
if (map == null) {
map = new HashMap<>();
}
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
for (Map.Entry<String, Object> entry : jobDataMap.entrySet()) {
// only 4 types of jobparameters at this time...
if (entry.getValue() instanceof String) {
map.put(entry.getKey(), new JobParameter((String) entry.getValue()));
} else if (entry.getValue() instanceof Long) {
map.put(entry.getKey(), new JobParameter((Long) entry.getValue()));
} else if (entry.getValue() instanceof Double) {
map.put(entry.getKey(), new JobParameter((Double) entry.getValue()));
} else if (entry.getValue() instanceof Date) {
map.put(entry.getKey(), new JobParameter((Date) entry.getValue()));
} else {
map.put(entry.getKey(), new JobParameter(entry.getValue().toString()));
}
}
jobLauncher.run(job, new JobParameters(map));
} catch (JobExecutionAlreadyRunningException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JobRestartException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JobInstanceAlreadyCompleteException e) {
log.debug("Job has already run once with these parameters.", e);
} catch (JobParametersInvalidException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}