afterstep处理程序

xwbd5t1u  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(335)

我和我的作者有个问题 afterStep() 未被调用:

  1. public class MyWriter implements ItemStreamWriter<MyDTO>, StepExecutionListener {
  2. private FlatFileItemWriter<MyDTO> delegate;
  3. private Resource resource;
  4. public void setDelegate(final FlatFileItemWriter<MyDTO> delegate) {
  5. this.delegate = delegate;
  6. delegate.setResource(resource);
  7. }
  8. public void setResource(final Resource resource) {
  9. this.resource = resource;
  10. if (delegate != null) {
  11. delegate.setResource(resource);
  12. }
  13. }
  14. @Override
  15. public void write(List<? extends MyDTO> items) throws Exception {
  16. delegate.write(items);
  17. }
  18. @Override
  19. public void open(ExecutionContext executionContext) throws ItemStreamException {
  20. delegate.open(executionContext);
  21. }
  22. @Override
  23. public void update(ExecutionContext executionContext) throws ItemStreamException {
  24. delegate.update(executionContext);
  25. }
  26. @Override
  27. public void close() throws ItemStreamException {
  28. delegate.close();
  29. }
  30. @Override
  31. public void beforeStep(StepExecution stepExecution) {
  32. // do nothing
  33. }
  34. @Override
  35. public ExitStatus afterStep(StepExecution stepExecution) {
  36. // do nothing
  37. return null;
  38. }

我还对bean进行了一步范围分析:

  1. @Bean
  2. @StepScope
  3. public ItemStreamWriter<MyDTO> itemWriter() {
  4. DelimitedLineAggregator<MyDTO> lineAggregator = new DelimitedLineAggregator<>();
  5. BeanWrapperFieldExtractor<MyDTO> extractor = new BeanWrapperFieldExtractor<>();
  6. extractor.setNames(new String[]{"test"});
  7. lineAggregator.setFieldExtractor(extractor);
  8. MyWriter writer = new MyWriter();
  9. FlatFileItemWriter<MyDTO> flatFileItemWriter = new FlatFileItemWriter<>();
  10. flatFileItemWriter.setLineAggregator(lineAggregator);
  11. flatFileItemWriter.setShouldDeleteIfExists(true);
  12. flatFileItemWriter.afterPropertiesSet();
  13. writer.setDelegate(flatFileItemWriter);
  14. writer.setResource(new FileSystemResource(getRequestOutputResource(blah)));
  15. return writer;
  16. }
rseugnpd

rseugnpd1#

writer bean的返回类型是 ItemStreamWriter ,因此spring批处理创建的步骤范围代理bean将不会被视为 StepExecutionListener . 您需要将编写器注册为步骤执行侦听器。
作为旁注,你的班级在做两件事(同时是一个作家和一个听众)。多态性对于某些用例来说是一个好主意,但是在您的例子中,为了更清晰和避免代理混淆,我将在它自己的类中分离每个逻辑。

相关问题