diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/internal/GeneratingTradeItemReader.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/internal/GeneratingTradeItemReader.java index 0f2d5ef63..6a52c826a 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/internal/GeneratingTradeItemReader.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/internal/GeneratingTradeItemReader.java @@ -60,4 +60,8 @@ public class GeneratingTradeItemReader implements ItemReader { return limit; } + public void resetCounter() + { + this.counter = 0; + } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/loopFlow/GeneratingTradeResettingListener.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/loopFlow/GeneratingTradeResettingListener.java new file mode 100644 index 000000000..58f605026 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/loopFlow/GeneratingTradeResettingListener.java @@ -0,0 +1,48 @@ +/* + * 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.sample.loopFlow; + +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.listener.StepExecutionListenerSupport; +import org.springframework.batch.sample.domain.trade.internal.GeneratingTradeItemReader; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; + +/** + * This listener resets the count of its GeneratingTradeItemReader after the + * step. + * + * @author Dan Garrette + * @since 2.0 + */ +public class GeneratingTradeResettingListener extends StepExecutionListenerSupport implements InitializingBean { + + private GeneratingTradeItemReader reader; + + public ExitStatus afterStep(StepExecution stepExecution) { + this.reader.resetCounter(); + return null; + } + + public void setReader(GeneratingTradeItemReader reader) { + this.reader = reader; + } + + public void afterPropertiesSet() throws Exception { + Assert.notNull(this.reader, "The 'reader' must be set."); + } +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/loopFlow/LimitDecider.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/loopFlow/LimitDecider.java new file mode 100644 index 000000000..e3cce4a02 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/loopFlow/LimitDecider.java @@ -0,0 +1,55 @@ +/* + * 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.sample.loopFlow; + +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.flow.support.state.JobExecutionDecider; + +/** + * This decider will return "CONTINUE" until the limit it reached, at which + * point it will return "COMPLETE". + * + * @author Dan Garrette + * @since 2.0 + */ +public class LimitDecider implements JobExecutionDecider { + + private int count = 0; + private int limit = 1; + + /* + * (non-Javadoc) + * + * @see org.springframework.batch.core.job.flow.support.state.JobExecutionDecider#decide(org.springframework.batch.core.JobExecution, + * org.springframework.batch.core.StepExecution) + */ + public String decide(JobExecution jobExecution, StepExecution stepExecution) { + if (++count >= limit) { + return "COMPLETE"; + } + else { + return "CONTINUE"; + } + } + + /** + * @param limit + */ + public void setLimit(int limit) { + this.limit = limit; + } +} diff --git a/spring-batch-samples/src/main/resources/jobs/loopFlowSample.xml b/spring-batch-samples/src/main/resources/jobs/loopFlowSample.xml new file mode 100644 index 000000000..48088d620 --- /dev/null +++ b/spring-batch-samples/src/main/resources/jobs/loopFlowSample.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/LoopFlowSampleFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/LoopFlowSampleFunctionalTests.java new file mode 100644 index 000000000..6fe33cb19 --- /dev/null +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/LoopFlowSampleFunctionalTests.java @@ -0,0 +1,44 @@ +/* + * 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.sample; + +import static org.junit.Assert.assertEquals; + +import org.junit.runner.RunWith; +import org.springframework.batch.sample.domain.trade.internal.ItemTrackingTradeItemWriter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Checks that expected number of items have been processed. + * + * @author Dan Garrette + * @since 2.0 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", "/jobs/loopFlowSample.xml" }) +public class LoopFlowSampleFunctionalTests extends AbstractValidatingBatchLauncherTests { + + @Autowired + private ItemTrackingTradeItemWriter itemWriter; + + protected void validatePostConditions() throws Exception { + // items processed = items read + 2 exceptions + assertEquals(10, itemWriter.getItems().size()); + } + +}