package net.techreadiness.batch.jobs;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import net.techreadiness.service.BatchJobSchedulerService;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.NoSuchJobException;
import com.google.common.collect.Maps;
public class SpringBatchJob implements org.quartz.Job {
@Inject
protected JobLauncher jobLauncher;
@Inject
protected JobRegistry jobRegistry;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Map<String, JobParameter> parameters = getParameters(context);
String jobName = getJobName(context);
try {
Job job = doGetJob(context, jobName);
runJob(job, new JobParameters(parameters));
} catch (Exception e) {
throw new JobExecutionException(e);
}
}
protected void runJob(Job job, JobParameters jobParameters) throws Exception {
jobLauncher.run(job, jobParameters);
}
protected Job doGetJob(JobExecutionContext context, String name) throws NoSuchJobException {
return jobRegistry.getJob(name);
}
protected Map<String, JobParameter> getParameters(JobExecutionContext context) {
Map<String, JobParameter> parameters = Maps.newHashMap();
JobDataMap jobDataMap = context.getMergedJobDataMap();
for (Entry<String, Object> entry : jobDataMap.entrySet()) {
// only 4 types of jobparameters at this time...
if (entry.getValue() instanceof String) {
parameters.put(entry.getKey(), new JobParameter((String) entry.getValue()));
} else if (entry.getValue() instanceof Long) {
parameters.put(entry.getKey(), new JobParameter((Long) entry.getValue()));
} else if (entry.getValue() instanceof Double) {
parameters.put(entry.getKey(), new JobParameter((Double) entry.getValue()));
} else if (entry.getValue() instanceof Date) {
parameters.put(entry.getKey(), new JobParameter((Date) entry.getValue()));
} else {
parameters.put(entry.getKey(), new JobParameter(entry.getValue().toString()));
}
}
return parameters;
}
protected String getJobName(JobExecutionContext context) {
return context.getMergedJobDataMap().getString(BatchJobSchedulerService.SPRING_BATCH_JOB_NAME);
}
}