/* * Copyright 2009-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.batch.admin.integration; import org.springframework.batch.admin.web.LaunchRequest; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.configuration.JobLocator; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobParametersNotFoundException; import org.springframework.batch.core.launch.NoSuchJobException; import org.springframework.batch.integration.launch.JobLaunchRequest; import org.springframework.integration.annotation.MessageEndpoint; import org.springframework.integration.annotation.ServiceActivator; import java.util.List; /** * Adapt a job name to a {@link LaunchRequest} for restarting the last failed * execution of the {@link Job}. The parameters of the last execution are pulled * out of the {@link JobExplorer}. * * @author Dave Syer * @author Michael Minella * */ @MessageEndpoint public class JobNameToJobRestartRequestAdapter { private JobLocator jobLocator; private JobExplorer jobExplorer; public void setJobLocator(JobLocator jobLocator) { this.jobLocator = jobLocator; } public void setJobExplorer(JobExplorer jobExplorer) { this.jobExplorer = jobExplorer; } @ServiceActivator public JobLaunchRequest adapt(String jobName) throws NoSuchJobException, JobParametersNotFoundException { jobName = jobName.trim(); Job job = jobLocator.getJob(jobName); JobParameters jobParameters = getLastFailedJobParameters(jobName); return new JobLaunchRequest(job, jobParameters); } /** * @param jobName name of job to return parameters for * @return {@link org.springframework.batch.core.JobParameters} for the job requested * @throws JobParametersNotFoundException */ private JobParameters getLastFailedJobParameters(String jobName) throws JobParametersNotFoundException { int start = 0; int count = 100; List<JobInstance> lastInstances = jobExplorer.getJobInstances(jobName, start, count); JobParameters jobParameters = null; if (lastInstances.isEmpty()) { throw new JobParametersNotFoundException( "No job instance found for job=" + jobName); } while (!lastInstances.isEmpty()) { for (JobInstance jobInstance : lastInstances) { List<JobExecution> jobExecutions = jobExplorer .getJobExecutions(jobInstance); if (jobExecutions == null || jobExecutions.isEmpty()) { continue; } JobExecution jobExecution = jobExecutions.get(jobExecutions .size() - 1); if (jobExecution.getStatus() .isGreaterThan(BatchStatus.STOPPING)) { jobParameters = jobExecution.getJobParameters(); break; } } if (jobParameters != null) { break; } start += count; lastInstances = jobExplorer.getJobInstances(jobName, start, count); } if (jobParameters == null) { throw new JobParametersNotFoundException( "No failed or stopped execution found for job=" + jobName); } return jobParameters; } }