OPEN - issue BATCH-773: Refactor and extend ExportedJobLauncher to JobOperator

Fill in a few methods in JobOperator (WIP)
This commit is contained in:
dsyer
2008-08-12 20:56:17 +00:00
parent 06b832c3ca
commit 55d59ff09e
13 changed files with 649 additions and 37 deletions

View File

@@ -15,7 +15,6 @@
*/
package org.springframework.batch.core;
/**
* Batch domain object representing a job. Job is an explicit abstraction
* representing the configuration of a job specified by a developer. It should
@@ -40,4 +39,9 @@ public interface Job {
*/
void execute(JobExecution execution) throws JobExecutionException;
/**
* @return in incrementer to be used for creating new parameters
*/
JobParametersIncrementer getJobParametersIncrementer();
}

View File

@@ -15,7 +15,6 @@
*/
package org.springframework.batch.core;
/**
* Interface for obtaining the next {@link JobParameters} in a sequence.
*
@@ -23,7 +22,15 @@ package org.springframework.batch.core;
*
*/
public interface JobParametersIncrementer {
/**
* Increment the provided parameters. If the input is empty, then this
* should return a bootstrap or initial value to be used on the first
* instance of a job.
*
* @param parameters the last value used
* @return the next value to use
*/
JobParameters getNext(JobParameters parameters);
}

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.core.configuration.support;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.configuration.JobFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
@@ -116,6 +117,13 @@ public class ApplicationContextJobFactory implements JobFactory {
return delegate.isRestartable();
}
/**
* @see org.springframework.batch.core.Job#getJobParametersIncrementer()
*/
public JobParametersIncrementer getJobParametersIncrementer() {
return delegate.getJobParametersIncrementer();
}
}
}

View File

@@ -15,13 +15,11 @@
*/
package org.springframework.batch.core.explore;
import java.util.Collection;
import java.util.Date;
import java.util.EnumSet;
import java.util.List;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
/**
* @author Dave Syer
@@ -29,23 +27,24 @@ import org.springframework.batch.core.JobInstance;
*/
public interface BatchMetaDataExplorer {
int countJobExecutionsByStatus(EnumSet<BatchStatus> statuses);
/**
* @param jobName the name of the job to query
* @param count the maximum number of instances to return
* @return the latest {@link JobInstance} values up to a maximum of count values
*/
List<JobInstance> getLastJobInstances(String jobName, int count);
/**
* @param statuses the status values to search
* @param start the start record (defaults to 0)
* @param count the maximum number of objects to return
* @return the {@link JobExecution} objects that have the provided status,
* sorted in reverse order by start time.
* @param jobName the name of the job
* @param jobParameters the parameters to match
* @return true if a {@link JobInstance} already exists for this job name and job parameters
*/
Collection<JobExecution> findJobExecutionsByStatus(EnumSet<BatchStatus> statuses, int start, int count);
int countJobExecutionsByDate(Date from, Date to);
boolean isJobInstanceExists(String jobName, JobParameters jobParameters);
Collection<JobExecution> findJobExecutionsByDate(Date from, Date to, int start, int count);
Collection<JobInstance> findJobInstancesByJobName(String jobName);
Collection<JobExecution> getJobExecutionsForJobInstance(JobInstance jobInstance);
/**
* @param executionId
* @return the {@link JobExecution} with this id, or null
*/
JobExecution getJobExecution(Long executionId);
}

View File

@@ -21,6 +21,7 @@ import java.util.List;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.listener.CompositeExecutionJobListener;
import org.springframework.batch.core.repository.JobRepository;
@@ -50,6 +51,8 @@ public abstract class AbstractJob implements Job, BeanNameAware, InitializingBea
private CompositeExecutionJobListener listener = new CompositeExecutionJobListener();
private JobParametersIncrementer jobParametersIncrementer;
/**
* Default constructor.
*/
@@ -126,6 +129,21 @@ public abstract class AbstractJob implements Job, BeanNameAware, InitializingBea
public boolean isRestartable() {
return restartable;
}
/**
* Public setter for the {@link JobParametersIncrementer}.
* @param jobParametersIncrementer the {@link JobParametersIncrementer} to set
*/
public void setJobParametersIncrementer(JobParametersIncrementer jobParametersIncrementer) {
this.jobParametersIncrementer = jobParametersIncrementer;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.Job#getJobParametersIncrementer()
*/
public JobParametersIncrementer getJobParametersIncrementer() {
return this.jobParametersIncrementer;
}
public String toString() {
return ClassUtils.getShortName(getClass()) + ": [name=" + name + "]";

View File

@@ -19,6 +19,11 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
@@ -45,9 +50,28 @@ public interface JobOperator {
JobRestartException;
Long resume(Long executionId) throws JobInstanceAlreadyCompleteException, NoSuchJobExecutionException,
NoSuchJobException;
NoSuchJobException, JobRestartException;
Long startNextInstance(String jobName) throws NoSuchJobException, JobParametersIncrementerNotFoundException;
/**
* Launch the next in a sequence of {@link JobInstance} determined by the
* {@link JobParametersIncrementer} attached to the specified job. If the
* previous instance is still in a failed state, this method should still
* create a new instance and run it with different parameters (as long as
* the {@link JobParametersIncrementer} is working).<br/><br/>
*
* The last three exception described below should be extremely unlikely,
* but cannot be ruled out entirely. It points to some other thread or
* process trying to use this method (or a similar one) at the same time.
*
* @param jobName the name of the job to launch
* @return the {@link JobExecution} id of the execution created when the job
* is launched
* @throws NoSuchJobException if there is no such job definition available
* @throws JobParametersNotFoundException if the parameters cannot be found
* @throws UnexpectedJobExecutionException if an unexpected condition arises
*/
Long startNextInstance(String jobName) throws NoSuchJobException, JobParametersNotFoundException,
JobRestartException, JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException;
boolean stop(Long executionId) throws NoSuchJobExecutionException;

View File

@@ -26,12 +26,12 @@ import org.springframework.batch.core.JobParametersIncrementer;
* @author Dave Syer
*
*/
public class JobParametersIncrementerNotFoundException extends JobExecutionException {
public class JobParametersNotFoundException extends JobExecutionException {
/**
* Create an exception with the given message.
*/
public JobParametersIncrementerNotFoundException(String msg) {
public JobParametersNotFoundException(String msg) {
super(msg);
}
@@ -39,7 +39,7 @@ public class JobParametersIncrementerNotFoundException extends JobExecutionExcep
* @param msg The message to send to caller
* @param e the cause of the exception
*/
public JobParametersIncrementerNotFoundException(String msg, Throwable e) {
public JobParametersNotFoundException(String msg, Throwable e) {
super(msg, e);
}
}

View File

@@ -0,0 +1,327 @@
/*
* Copyright 2006-2007 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.core.launch.support;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.configuration.JobLocator;
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
import org.springframework.batch.core.converter.JobParametersConverter;
import org.springframework.batch.core.explore.BatchMetaDataExplorer;
import org.springframework.batch.core.launch.JobInstanceAlreadyExistsException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.JobOperator;
import org.springframework.batch.core.launch.JobParametersNotFoundException;
import org.springframework.batch.core.launch.NoSuchJobException;
import org.springframework.batch.core.launch.NoSuchJobExecutionException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.support.PropertiesConverter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* @author Dave Syer
*
*/
public class SimpleJobOperator implements JobOperator, InitializingBean {
/**
*
*/
private static final String ILLEGAL_STATE_MSG = "Illegal state (only happens on a race condition): "
+ "%s with name=%s and parameters=%s";
private JobLocator jobRegistry;
private BatchMetaDataExplorer batchMetaDataExplorer;
private JobLauncher jobLauncher;
private JobParametersConverter jobParametersConverter = new DefaultJobParametersConverter();
private final Log logger = LogFactory.getLog(getClass());
/**
* Check mandatory properties.
*
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
Assert.notNull(jobLauncher, "JobLauncher must be provided");
Assert.notNull(jobRegistry, "JobLocator must be provided");
Assert.notNull(batchMetaDataExplorer, "BatchMetaDataExplorer must be provided");
}
/**
* Public setter for the {@link JobParametersConverter}.
* @param jobParametersConverter the {@link JobParametersConverter} to set
*/
public void setJobParametersConverter(JobParametersConverter jobParametersConverter) {
this.jobParametersConverter = jobParametersConverter;
}
/**
* Public setter for the {@link JobLocator}.
* @param jobRegistry the {@link JobLocator} to set
*/
public void setJobLocator(JobLocator jobRegistry) {
this.jobRegistry = jobRegistry;
}
/**
* Public setter for the {@link BatchMetaDataExplorer}.
* @param batchMetaDataExplorer the {@link BatchMetaDataExplorer} to set
*/
public void setBatchMetaDataExplorer(BatchMetaDataExplorer batchMetaDataExplorer) {
this.batchMetaDataExplorer = batchMetaDataExplorer;
}
/**
* Public setter for the {@link JobLauncher}.
* @param jobLauncher the {@link JobLauncher} to set
*/
public void setJobLauncher(JobLauncher jobLauncher) {
this.jobLauncher = jobLauncher;
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#getExecutions(java.
* lang.Long)
*/
public List<Long> getExecutions(Long instanceId) throws NoSuchJobException {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.core.launch.JobOperator#getJobNames()
*/
public Set<String> getJobNames() {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#getLastInstances(java
* .lang.String, int)
*/
public List<Long> getLastInstances(String jobName, int count) throws NoSuchJobException {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#getParameters(java.
* lang.Long)
*/
public String getParameters(Long executionId) throws NoSuchJobExecutionException {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#getRunningExecutions
* (java.lang.String)
*/
public Set<Long> getRunningExecutions(String jobName) throws NoSuchJobException {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#getStepExecutionSummaries
* (java.lang.Long)
*/
public Map<Long, String> getStepExecutionSummaries(Long executionId) throws NoSuchJobExecutionException {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#getSummary(java.lang
* .Long)
*/
public String getSummary(Long executionId) throws NoSuchJobExecutionException {
JobExecution jobExecution = batchMetaDataExplorer.getJobExecution(executionId);
if (jobExecution==null) {
throw new NoSuchJobExecutionException(String.format("No job execution with id=%d", executionId));
}
return jobExecution.toString();
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#resume(java.lang.Long)
*/
public Long resume(Long executionId) throws JobInstanceAlreadyCompleteException, NoSuchJobExecutionException,
NoSuchJobException, JobRestartException {
logger.info("Checking status of job execution with id=" + executionId);
JobExecution jobExecution = batchMetaDataExplorer.getJobExecution(executionId);
if (jobExecution == null) {
throw new NoSuchJobExecutionException(String.format("No job execution with id=%d", executionId));
}
String jobName = jobExecution.getJobInstance().getJobName();
Job job = jobRegistry.getJob(jobName );
JobParameters parameters = jobExecution.getJobInstance().getJobParameters();
logger.info(String.format("Attempting to resume job with name=%s and parameters=%s", jobName, parameters));
try {
return jobLauncher.run(job, parameters).getId();
}
catch (JobExecutionAlreadyRunningException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG,
"job execution already running", jobName, parameters), e);
}
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#start(java.lang.String,
* java.lang.String)
*/
public Long start(String jobName, String parameters) throws NoSuchJobException, JobInstanceAlreadyExistsException {
logger.info("Checking status of job with name=" + jobName);
JobParameters jobParameters = jobParametersConverter.getJobParameters(PropertiesConverter
.stringToProperties(parameters));
if (batchMetaDataExplorer.isJobInstanceExists(jobName, jobParameters)) {
throw new JobInstanceAlreadyExistsException(String.format(
"Cannot start a job instance that already exists with name=%s and parameters=%s", jobName,
parameters));
}
Job job = jobRegistry.getJob(jobName);
logger.info(String.format("Attempting to launch job with name=%s and parameters=%s", jobName, parameters));
try {
return jobLauncher.run(job, jobParameters).getId();
}
catch (JobExecutionAlreadyRunningException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG,
"job execution already running", jobName, parameters), e);
}
catch (JobRestartException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG, "job not restartable",
jobName, parameters), e);
}
catch (JobInstanceAlreadyCompleteException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG, "job already complete",
jobName, parameters), e);
}
}
/*
* (non-Javadoc)
*
* @see JobOperator#startNextInstance(String )
*/
public Long startNextInstance(String jobName) throws NoSuchJobException, JobParametersNotFoundException,
UnexpectedJobExecutionException {
logger.info("Locating parameters for next instance of job with name=" + jobName);
Job job = jobRegistry.getJob(jobName);
List<JobInstance> lastInstances = batchMetaDataExplorer.getLastJobInstances(jobName, 1);
JobParametersIncrementer incrementer = job.getJobParametersIncrementer();
if (incrementer == null) {
throw new JobParametersNotFoundException("No job parameters incrementer found for job=" + jobName);
}
JobParameters parameters;
if (lastInstances.isEmpty()) {
parameters = incrementer.getNext(new JobParameters());
if (parameters == null) {
throw new JobParametersNotFoundException("No bootstrap parameters found for job=" + jobName);
}
}
else {
parameters = incrementer.getNext(lastInstances.get(0).getJobParameters());
}
logger.info(String.format("Attempting to launch job with name=%s and parameters=%s", jobName, parameters));
try {
return jobLauncher.run(job, parameters).getId();
}
catch (JobExecutionAlreadyRunningException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG, "job already running", jobName,
parameters), e);
}
catch (JobRestartException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG, "job not restartable", jobName,
parameters), e);
}
catch (JobInstanceAlreadyCompleteException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG, "job instance already complete",
jobName, parameters), e);
}
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.launch.JobOperator#stop(java.lang.Long)
*/
public boolean stop(Long executionId) throws NoSuchJobExecutionException {
throw new UnsupportedOperationException("See BATCH-453 for implementation.");
}
}

View File

@@ -19,10 +19,11 @@ package org.springframework.batch.core.job;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.util.ClassUtils;
@@ -88,7 +89,9 @@ public class JobSupport implements BeanNameAware, Job {
this.name = name;
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see org.springframework.batch.core.domain.IJob#getName()
*/
public String getName() {
@@ -104,7 +107,9 @@ public class JobSupport implements BeanNameAware, Job {
this.steps.add(step);
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see org.springframework.batch.core.domain.IJob#getStartLimit()
*/
public int getStartLimit() {
@@ -119,21 +124,37 @@ public class JobSupport implements BeanNameAware, Job {
this.restartable = restartable;
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see org.springframework.batch.core.domain.IJob#isRestartable()
*/
public boolean isRestartable() {
return restartable;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.Job#run(org.springframework.batch.core.domain.JobExecution)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.domain.Job#run(org.springframework.batch
* .core.domain.JobExecution)
*/
public void execute(JobExecution execution) throws UnexpectedJobExecutionException {
throw new UnsupportedOperationException("JobSupport does not provide an implementation of run(). Use a smarter subclass.");
throw new UnsupportedOperationException(
"JobSupport does not provide an implementation of run(). Use a smarter subclass.");
}
public String toString() {
return ClassUtils.getShortName(getClass()) + ": [name=" + name + "]";
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.core.Job#getJobParametersIncrementer()
*/
public JobParametersIncrementer getJobParametersIncrementer() {
return null;
}
}

View File

@@ -21,20 +21,20 @@ import org.springframework.batch.core.AbstractExceptionTests;
* @author Dave Syer
*
*/
public class JobParametersIncrementerNotFoundExceptionTests extends AbstractExceptionTests {
public class JobParametersNotFoundExceptionTests extends AbstractExceptionTests {
/* (non-Javadoc)
* @see org.springframework.batch.io.exception.AbstractExceptionTests#getException(java.lang.String)
*/
public Exception getException(String msg) throws Exception {
return new JobParametersIncrementerNotFoundException(msg);
return new JobParametersNotFoundException(msg);
}
/* (non-Javadoc)
* @see org.springframework.batch.io.exception.AbstractExceptionTests#getException(java.lang.String, java.lang.Throwable)
*/
public Exception getException(String msg, Throwable t) throws Exception {
return new JobParametersIncrementerNotFoundException(msg, t);
return new JobParametersNotFoundException(msg, t);
}
}

View File

@@ -0,0 +1,190 @@
/*
* Copyright 2006-2007 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.core.launch.support;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Collections;
import java.util.Properties;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
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.JobParametersIncrementer;
import org.springframework.batch.core.configuration.JobLocator;
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
import org.springframework.batch.core.explore.BatchMetaDataExplorer;
import org.springframework.batch.core.job.JobSupport;
import org.springframework.batch.core.launch.JobInstanceAlreadyExistsException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.NoSuchJobException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
/**
* @author Dave Syer
*
*/
public class SimpleJobOperatorTests {
private SimpleJobOperator jobOperator;
protected Job job;
private BatchMetaDataExplorer batchMetaDataExplorer;
private JobParameters jobParameters;
/**
* @throws Exception
*
*/
@Before
public void setUp() throws Exception {
job = new JobSupport("foo") {
@Override
public JobParametersIncrementer getJobParametersIncrementer() {
return new JobParametersIncrementer() {
public JobParameters getNext(JobParameters parameters) {
return jobParameters;
}
};
}
};
jobOperator = new SimpleJobOperator();
jobOperator.setJobLocator(new JobLocator() {
public Job getJob(String name) throws NoSuchJobException {
if (name.equals("foo")) {
return job;
}
throw new NoSuchJobException("foo");
}
});
jobOperator.setJobLauncher(new JobLauncher() {
public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException,
JobRestartException, JobInstanceAlreadyCompleteException {
return new JobExecution(new JobInstance(123L, jobParameters, job.getName()), 999L);
}
});
batchMetaDataExplorer = EasyMock.createNiceMock(BatchMetaDataExplorer.class);
jobOperator.setBatchMetaDataExplorer(batchMetaDataExplorer);
jobOperator.setJobParametersConverter(new DefaultJobParametersConverter() {
@Override
public JobParameters getJobParameters(Properties props) {
assertTrue("Wrong properties",props.containsKey("a"));
return jobParameters;
}
});
jobOperator.afterPropertiesSet();
}
@Test
public void testMandatoryProperties() throws Exception {
jobOperator = new SimpleJobOperator();
try {
jobOperator.afterPropertiesSet();
fail("Expected IllegalArgumentException");
}
catch (IllegalArgumentException e) {
// expected
}
}
/**
* Test method for
* {@link org.springframework.batch.core.launch.support.SimpleJobOperator#startNextInstance(java.lang.String)}
* .
* @throws Exception
*/
@Test
public void testStartNextInstanceSunnyDay() throws Exception {
final JobParameters jobParameters = new JobParameters();
batchMetaDataExplorer.getLastJobInstances("foo", 1);
EasyMock.expectLastCall().andReturn(Collections.singletonList(new JobInstance(321L, jobParameters, "foo")));
EasyMock.replay(batchMetaDataExplorer);
Long value = jobOperator.startNextInstance("foo");
assertEquals(999, value.longValue());
EasyMock.verify(batchMetaDataExplorer);
}
@Test
public void testStartNewInstanceSunnyDay() throws Exception {
jobParameters = new JobParameters();
batchMetaDataExplorer.isJobInstanceExists("foo", jobParameters);
EasyMock.expectLastCall().andReturn(false);
EasyMock.replay(batchMetaDataExplorer);
Long value = jobOperator.start("foo", "a=b");
assertEquals(999, value.longValue());
EasyMock.verify(batchMetaDataExplorer);
}
@Test
public void testStartNewInstanceAlreadyExists() throws Exception {
jobParameters = new JobParameters();
batchMetaDataExplorer.isJobInstanceExists("foo", jobParameters);
EasyMock.expectLastCall().andReturn(true);
EasyMock.replay(batchMetaDataExplorer);
try {
jobOperator.start("foo", "a=b");
fail("Expected JobInstanceAlreadyExistsException");
}
catch (JobInstanceAlreadyExistsException e) {
// expected
}
EasyMock.verify(batchMetaDataExplorer);
}
@Test
public void testResumeSunnyDay() throws Exception {
jobParameters = new JobParameters();
batchMetaDataExplorer.getJobExecution(111L);
EasyMock.expectLastCall().andReturn(new JobExecution(new JobInstance(123L, jobParameters, job.getName()), 111L));
EasyMock.replay(batchMetaDataExplorer);
Long value = jobOperator.resume(111L);
assertEquals(999, value.longValue());
EasyMock.verify(batchMetaDataExplorer);
}
@Test
public void testGetSummarySunnyDay() throws Exception {
jobParameters = new JobParameters();
batchMetaDataExplorer.getJobExecution(111L);
JobExecution jobExecution = new JobExecution(new JobInstance(123L, jobParameters, job.getName()), 111L);
EasyMock.expectLastCall().andReturn(jobExecution);
EasyMock.replay(batchMetaDataExplorer);
String value = jobOperator.getSummary(111L);
assertEquals(jobExecution.toString(), value);
EasyMock.verify(batchMetaDataExplorer);
}
}

View File

@@ -3,6 +3,7 @@ package org.springframework.batch.integration;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobParametersIncrementer;
public class JobSupport implements Job {
@@ -24,5 +25,10 @@ public class JobSupport implements Job {
// TODO Auto-generated method stub
return false;
}
public JobParametersIncrementer getJobParametersIncrementer() {
// TODO Auto-generated method stub
return null;
}
}

View File

@@ -21,6 +21,7 @@ import java.util.List;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.beans.factory.BeanNameAware;
@@ -131,6 +132,13 @@ public class JobSupport implements BeanNameAware, Job {
return restartable;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.Job#getJobParametersIncrementer()
*/
public JobParametersIncrementer getJobParametersIncrementer() {
return null;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.Job#run(org.springframework.batch.core.domain.JobExecution)
*/