我和我的作者有个问题 afterStep()
未被调用:
public class MyWriter implements ItemStreamWriter<MyDTO>, StepExecutionListener {
private FlatFileItemWriter<MyDTO> delegate;
private Resource resource;
public void setDelegate(final FlatFileItemWriter<MyDTO> delegate) {
this.delegate = delegate;
delegate.setResource(resource);
}
public void setResource(final Resource resource) {
this.resource = resource;
if (delegate != null) {
delegate.setResource(resource);
}
}
@Override
public void write(List<? extends MyDTO> items) throws Exception {
delegate.write(items);
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
delegate.open(executionContext);
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
delegate.update(executionContext);
}
@Override
public void close() throws ItemStreamException {
delegate.close();
}
@Override
public void beforeStep(StepExecution stepExecution) {
// do nothing
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// do nothing
return null;
}
我还对bean进行了一步范围分析:
@Bean
@StepScope
public ItemStreamWriter<MyDTO> itemWriter() {
DelimitedLineAggregator<MyDTO> lineAggregator = new DelimitedLineAggregator<>();
BeanWrapperFieldExtractor<MyDTO> extractor = new BeanWrapperFieldExtractor<>();
extractor.setNames(new String[]{"test"});
lineAggregator.setFieldExtractor(extractor);
MyWriter writer = new MyWriter();
FlatFileItemWriter<MyDTO> flatFileItemWriter = new FlatFileItemWriter<>();
flatFileItemWriter.setLineAggregator(lineAggregator);
flatFileItemWriter.setShouldDeleteIfExists(true);
flatFileItemWriter.afterPropertiesSet();
writer.setDelegate(flatFileItemWriter);
writer.setResource(new FileSystemResource(getRequestOutputResource(blah)));
return writer;
}
1条答案
按热度按时间rseugnpd1#
writer bean的返回类型是
ItemStreamWriter
,因此spring批处理创建的步骤范围代理bean将不会被视为StepExecutionListener
. 您需要将编写器注册为步骤执行侦听器。作为旁注,你的班级在做两件事(同时是一个作家和一个听众)。多态性对于某些用例来说是一个好主意,但是在您的例子中,为了更清晰和避免代理混淆,我将在它自己的类中分离每个逻辑。