OPEN - issue BATCH-320: Refactor ItemWriter as primary collaborator (with wrapper for processor)
http://jira.springframework.org/browse/BATCH-320 Half way there - tests OK, but some naming and tidying up to do.
This commit is contained in:
@@ -21,6 +21,7 @@ import org.springframework.batch.io.Skippable;
|
||||
import org.springframework.batch.item.ItemProcessor;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ItemRecoverer;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.batch.repeat.ExitStatus;
|
||||
import org.springframework.batch.retry.RetryPolicy;
|
||||
import org.springframework.batch.retry.callback.ItemReaderRetryCallback;
|
||||
@@ -86,7 +87,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
|
||||
|
||||
protected ItemReader itemProvider;
|
||||
|
||||
protected ItemProcessor itemProcessor;
|
||||
protected ItemWriter itemWriter;
|
||||
|
||||
private ItemRecoverer itemRecoverer;
|
||||
|
||||
@@ -101,7 +102,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
|
||||
*/
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
Assert.notNull(itemProvider, "ItemReader must be provided");
|
||||
Assert.notNull(itemProcessor, "ItemProcessor must be provided");
|
||||
Assert.notNull(itemWriter, "ItemProcessor must be provided");
|
||||
|
||||
if (itemRecoverer == null && (itemProvider instanceof ItemRecoverer)) {
|
||||
itemRecoverer = (ItemRecoverer) itemProvider;
|
||||
@@ -111,7 +112,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
|
||||
template.setRetryPolicy(itemProviderRetryPolicy);
|
||||
|
||||
if (retryPolicy != null) {
|
||||
retryCallback = new ItemReaderRetryCallback(itemProvider, itemProcessor);
|
||||
retryCallback = new ItemReaderRetryCallback(itemProvider, itemWriter);
|
||||
retryCallback.setRecoverer(itemRecoverer);
|
||||
}
|
||||
|
||||
@@ -139,7 +140,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
|
||||
return ExitStatus.FINISHED;
|
||||
}
|
||||
try {
|
||||
itemProcessor.process(item);
|
||||
itemWriter.write(item);
|
||||
}
|
||||
catch (Exception e) {
|
||||
if (itemRecoverer != null) {
|
||||
@@ -164,10 +165,10 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
|
||||
}
|
||||
|
||||
/**
|
||||
* @param moduleProcessor
|
||||
* @param writer
|
||||
*/
|
||||
public void setItemProcessor(ItemProcessor moduleProcessor) {
|
||||
this.itemProcessor = moduleProcessor;
|
||||
public void setItemWriter(ItemWriter writer) {
|
||||
this.itemWriter = writer;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -197,8 +198,8 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
|
||||
if (this.itemProvider instanceof Skippable) {
|
||||
((Skippable) this.itemProvider).skip();
|
||||
}
|
||||
if (this.itemProcessor instanceof Skippable) {
|
||||
((Skippable) this.itemProcessor).skip();
|
||||
if (this.itemWriter instanceof Skippable) {
|
||||
((Skippable) this.itemWriter).skip();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,8 +51,8 @@ public class RestartableItemOrientedTasklet extends ItemOrientedTasklet implemen
|
||||
itemProviderRestartData = ((Restartable) itemProvider).getRestartData();
|
||||
}
|
||||
|
||||
if (itemProcessor instanceof Restartable) {
|
||||
itemProcessorRestartData = ((Restartable) itemProcessor).getRestartData();
|
||||
if (itemWriter instanceof Restartable) {
|
||||
itemProcessorRestartData = ((Restartable) itemWriter).getRestartData();
|
||||
}
|
||||
|
||||
RestartableItemOrientedTaskletRestartData restartData = new RestartableItemOrientedTaskletRestartData(itemProviderRestartData, itemProcessorRestartData);
|
||||
@@ -79,8 +79,8 @@ public class RestartableItemOrientedTasklet extends ItemOrientedTasklet implemen
|
||||
if (itemProvider instanceof Restartable) {
|
||||
((Restartable) itemProvider).restoreFrom(moduleRestartData.providerData);
|
||||
}
|
||||
if (itemProcessor instanceof Restartable) {
|
||||
((Restartable) itemProcessor).restoreFrom(moduleRestartData.processorData);
|
||||
if (itemWriter instanceof Restartable) {
|
||||
((Restartable) itemWriter).restoreFrom(moduleRestartData.processorData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,18 +21,18 @@ import java.util.List;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.batch.item.ItemProcessor;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.batch.support.transaction.TransactionAwareProxyFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
||||
public class EmptyItemProcessor implements ItemProcessor, InitializingBean {
|
||||
public class EmptyItemWriter implements ItemWriter, InitializingBean {
|
||||
|
||||
private boolean failed = false;
|
||||
|
||||
// point at which to fail...
|
||||
private int failurePoint = Integer.MAX_VALUE;
|
||||
|
||||
protected Log logger = LogFactory.getLog(EmptyItemProcessor.class);
|
||||
protected Log logger = LogFactory.getLog(EmptyItemWriter.class);
|
||||
|
||||
List list;
|
||||
|
||||
@@ -45,7 +45,7 @@ public class EmptyItemProcessor implements ItemProcessor, InitializingBean {
|
||||
this.failurePoint = failurePoint;
|
||||
}
|
||||
|
||||
public void process(Object data) {
|
||||
public void write(Object data) {
|
||||
if (!failed && list.size() == failurePoint) {
|
||||
failed = true;
|
||||
throw new RuntimeException("Failed processing: [" + data + "]");
|
||||
@@ -38,9 +38,9 @@ import org.springframework.batch.execution.repository.dao.MapStepDao;
|
||||
import org.springframework.batch.execution.step.SimpleStep;
|
||||
import org.springframework.batch.execution.step.simple.SimpleStepExecutor;
|
||||
import org.springframework.batch.execution.tasklet.ItemOrientedTasklet;
|
||||
import org.springframework.batch.item.ItemProcessor;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ItemRecoverer;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.batch.item.reader.ListItemReader;
|
||||
import org.springframework.batch.repeat.RepeatContext;
|
||||
import org.springframework.batch.repeat.exception.handler.ExceptionHandler;
|
||||
@@ -59,8 +59,8 @@ public class SimpleJobTests extends TestCase {
|
||||
|
||||
private List processed = new ArrayList();
|
||||
|
||||
private ItemProcessor processor = new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
private ItemWriter processor = new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
processed.add((String) data);
|
||||
}
|
||||
};
|
||||
@@ -103,7 +103,7 @@ public class SimpleJobTests extends TestCase {
|
||||
}
|
||||
});
|
||||
module.setItemReader(provider);
|
||||
module.setItemProcessor(processor);
|
||||
module.setItemWriter(processor);
|
||||
module.afterPropertiesSet();
|
||||
return module;
|
||||
}
|
||||
@@ -155,8 +155,8 @@ public class SimpleJobTests extends TestCase {
|
||||
*/
|
||||
final ItemOrientedTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
|
||||
Step step = new SimpleStep(module);
|
||||
module.setItemProcessor(new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
module.setItemWriter(new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
throw new RuntimeException("Try again Dummy!");
|
||||
}
|
||||
});
|
||||
@@ -178,8 +178,8 @@ public class SimpleJobTests extends TestCase {
|
||||
Job jobConfiguration = new Job();
|
||||
final ItemOrientedTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
|
||||
Step step = new SimpleStep(module);
|
||||
module.setItemProcessor(new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
module.setItemWriter(new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
throw new RuntimeException("Foo");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -41,8 +41,8 @@ import org.springframework.batch.execution.scope.StepScope;
|
||||
import org.springframework.batch.execution.scope.StepSynchronizationManager;
|
||||
import org.springframework.batch.execution.step.SimpleStep;
|
||||
import org.springframework.batch.execution.tasklet.ItemOrientedTasklet;
|
||||
import org.springframework.batch.item.ItemProcessor;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.batch.item.reader.ListItemReader;
|
||||
import org.springframework.batch.repeat.ExitStatus;
|
||||
import org.springframework.batch.repeat.RepeatContext;
|
||||
@@ -61,8 +61,8 @@ public class SimpleStepExecutorTests extends TestCase {
|
||||
|
||||
ArrayList processed = new ArrayList();
|
||||
|
||||
ItemProcessor processor = new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
ItemWriter processor = new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
processed.add((String) data);
|
||||
}
|
||||
};
|
||||
@@ -86,7 +86,7 @@ public class SimpleStepExecutorTests extends TestCase {
|
||||
*/
|
||||
private Tasklet getTasklet(String[] strings) throws Exception {
|
||||
ItemOrientedTasklet module = new ItemOrientedTasklet();
|
||||
module.setItemProcessor(processor);
|
||||
module.setItemWriter(processor);
|
||||
module.setItemReader(getReader(strings));
|
||||
module.afterPropertiesSet();
|
||||
return module;
|
||||
|
||||
@@ -24,9 +24,9 @@ import java.util.Properties;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.io.Skippable;
|
||||
import org.springframework.batch.item.ItemProcessor;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ItemRecoverer;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.batch.item.reader.AbstractItemReader;
|
||||
import org.springframework.batch.repeat.context.RepeatContextSupport;
|
||||
import org.springframework.batch.repeat.synch.RepeatSynchronizationManager;
|
||||
@@ -59,8 +59,8 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
}
|
||||
};
|
||||
|
||||
private ItemProcessor itemProcessor = new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
private ItemWriter itemWriter = new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
list.add(data);
|
||||
}
|
||||
};
|
||||
@@ -74,7 +74,7 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
|
||||
// set up module
|
||||
module.setItemReader(itemProvider);
|
||||
module.setItemProcessor(itemProcessor);
|
||||
module.setItemWriter(itemWriter);
|
||||
|
||||
module.afterPropertiesSet();
|
||||
|
||||
@@ -153,7 +153,7 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
|
||||
public void testSkippablReaderProcessor() throws Exception {
|
||||
module.setItemReader(new SkippableItemReader());
|
||||
module.setItemProcessor(new SkippableItemProcessor());
|
||||
module.setItemWriter(new SkippableItemWriter());
|
||||
module.setItemRecoverer(null);
|
||||
module.skip();
|
||||
assertEquals(2, list.size());
|
||||
@@ -178,8 +178,8 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
}
|
||||
});
|
||||
|
||||
module.setItemProcessor(new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
module.setItemWriter(new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
throw new RuntimeException("FOO");
|
||||
}
|
||||
});
|
||||
@@ -215,8 +215,8 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
return "foo";
|
||||
}
|
||||
});
|
||||
module.setItemProcessor(new ItemProcessor() {
|
||||
public void process(Object data) throws Exception {
|
||||
module.setItemWriter(new ItemWriter() {
|
||||
public void write(Object data) throws Exception {
|
||||
throw new RuntimeException("FOO");
|
||||
}
|
||||
});
|
||||
@@ -252,7 +252,7 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
}
|
||||
|
||||
public void testInitialisationWithNullProcessor() throws Exception {
|
||||
module.setItemProcessor(null);
|
||||
module.setItemWriter(null);
|
||||
try {
|
||||
module.afterPropertiesSet();
|
||||
} catch (IllegalArgumentException e) {
|
||||
@@ -276,20 +276,20 @@ public class ItemOrientedTaskletTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
private class SkippableItemProcessor implements ItemProcessor, Skippable,
|
||||
private class SkippableItemWriter implements ItemWriter, Skippable,
|
||||
StatisticsProvider {
|
||||
String props = "foo=bar";
|
||||
|
||||
public SkippableItemProcessor() {
|
||||
public SkippableItemWriter() {
|
||||
super();
|
||||
}
|
||||
|
||||
public SkippableItemProcessor(String props) {
|
||||
public SkippableItemWriter(String props) {
|
||||
this();
|
||||
this.props = props;
|
||||
}
|
||||
|
||||
public void process(Object data) throws Exception {
|
||||
public void write(Object data) throws Exception {
|
||||
// no-op
|
||||
}
|
||||
|
||||
|
||||
@@ -20,9 +20,8 @@ import java.util.Properties;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.execution.tasklet.RestartableItemOrientedTasklet;
|
||||
import org.springframework.batch.item.ItemProcessor;
|
||||
import org.springframework.batch.item.ItemReader;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.batch.restart.GenericRestartData;
|
||||
import org.springframework.batch.restart.RestartData;
|
||||
import org.springframework.batch.restart.Restartable;
|
||||
@@ -66,7 +65,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
|
||||
|
||||
}
|
||||
|
||||
private static class MockProcessor implements ItemProcessor, Restartable {
|
||||
private static class MockWriter implements ItemWriter, Restartable {
|
||||
|
||||
RestartData data = new RestartData() {
|
||||
public Properties getProperties() {
|
||||
@@ -74,7 +73,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
|
||||
}
|
||||
};
|
||||
|
||||
public void process(Object data) {
|
||||
public void write(Object data) {
|
||||
}
|
||||
|
||||
public RestartData getRestartData() {
|
||||
@@ -90,7 +89,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
|
||||
|
||||
private ItemReader itemProvider;
|
||||
|
||||
private ItemProcessor itemProcessor;
|
||||
private ItemWriter itemWriter;
|
||||
|
||||
private RestartableItemOrientedTasklet module;
|
||||
|
||||
@@ -98,12 +97,12 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
|
||||
|
||||
// create data provider and data processor
|
||||
itemProvider = new MockProvider();
|
||||
itemProcessor = new MockProcessor();
|
||||
itemWriter = new MockWriter();
|
||||
|
||||
// create and set up module
|
||||
module = new RestartableItemOrientedTasklet();
|
||||
module.setItemReader(itemProvider);
|
||||
module.setItemProcessor(itemProcessor);
|
||||
module.setItemWriter(itemWriter);
|
||||
|
||||
// get restart data
|
||||
RestartData data = module.getRestartData();
|
||||
@@ -116,12 +115,12 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
|
||||
|
||||
// create data provider and data processor
|
||||
itemProvider = new MockProvider();
|
||||
itemProcessor = new MockProcessor();
|
||||
itemWriter = new MockWriter();
|
||||
|
||||
// create and set up module
|
||||
module = new RestartableItemOrientedTasklet();
|
||||
module.setItemReader(itemProvider);
|
||||
module.setItemProcessor(itemProcessor);
|
||||
module.setItemWriter(itemWriter);
|
||||
|
||||
// get restart data
|
||||
RestartData data = module.getRestartData();
|
||||
@@ -136,7 +135,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
|
||||
// create and set up module
|
||||
module = new RestartableItemOrientedTasklet();
|
||||
module.setItemReader(null);
|
||||
module.setItemProcessor(null);
|
||||
module.setItemWriter(null);
|
||||
|
||||
// get restart data
|
||||
RestartData data = module.getRestartData();
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
<constructor-arg value="foo,bar,spam"/>
|
||||
</bean>
|
||||
</property>
|
||||
<property name="itemProcessor">
|
||||
<bean class="org.springframework.batch.execution.launch.EmptyItemProcessor"/>
|
||||
<property name="itemWriter">
|
||||
<bean class="org.springframework.batch.execution.launch.EmptyItemWriter"/>
|
||||
</property>
|
||||
</bean>
|
||||
</constructor-arg>
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
<constructor-arg value="foo,bar,spam"/>
|
||||
</bean>
|
||||
</property>
|
||||
<property name="itemProcessor">
|
||||
<bean class="org.springframework.batch.execution.launch.EmptyItemProcessor"/>
|
||||
<property name="itemWriter">
|
||||
<bean class="org.springframework.batch.execution.launch.EmptyItemWriter"/>
|
||||
</property>
|
||||
</bean>
|
||||
</constructor-arg>
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
<constructor-arg value="foo,bar,spam"/>
|
||||
</bean>
|
||||
</property>
|
||||
<property name="itemProcessor">
|
||||
<bean class="org.springframework.batch.execution.launch.EmptyItemProcessor"/>
|
||||
<property name="itemWriter">
|
||||
<bean class="org.springframework.batch.execution.launch.EmptyItemWriter"/>
|
||||
</property>
|
||||
</bean>
|
||||
</constructor-arg>
|
||||
|
||||
Reference in New Issue
Block a user