java - 如何在 spring-batch 中将参数从 ItemReader 传递到 ItemProcessor?

标签 java spring spring-batch

问题很简单:如何将仅在 ItemReader 中知道的值(例如当前文件名)传递给 ItemProcessor

@Bean
@JobScope
public ItemReader<String> reader(@Value("#{jobParameters['path]}") String path) {
    FlatFileItemReader<String> delegate = new FlatFileItemReader<>();
    delegate.setLineMapper(new PassThroughLineMapper());

    Resource[] res = new PathMatchingResourcePatternResolver().getResources("file:" + path);

    MultiResourceItemReader<String> r = new MultiResourceItemReader<>();
    r.setResources(res);
    r.setDelegate(delegate);
    return r;
}

@Bean
public ItemProcessor<String, String> processor() {
    return new ItemProcessor<String, String>() {

        @Override
        public String process(String item) throws Exception {
            //TODO I need the filename that is currently processed. HOW?
            return null;
        }
    };
}

最佳答案

为了安全起见,您应该将文件名添加到读取器返回的对象中。为此,您必须实现自己的包装器 Reader。像这样的事情:

public class MyReader {
     private MultiResourceItemReader delegatereader;

     public MyContainerDto read() {
          String line = delegatereader.read();
          if (line==null) return null;

          Resource currentResource = delegatereader.getCurrentResource();

          MyContainerDto container = MyContainerDto();
          container.setLine(line);
          container.setResourceName(currentResource.getFileName());
          return container;
     }

     ...
} 

(此代码未经测试,它只是说明了我将采取的方法)

在我的笔记本电脑上,我能够在一秒钟内创建 100 万个对象,因此创建对象所需的额外性能实际上并不会显着影响整体性能。

问题是,读取器读取的项目数量与 block 大小定义的一样多。之后,它将为该 block 中的每个项目调用处理器。因此,在一个 block 内,其中的项目可能是从不同的文件中读取的。因此,除了在阅读器中将行和文件名绑定(bind)在一起之外,没有其他方法。

另请参阅https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/

关于java - 如何在 spring-batch 中将参数从 ItemReader 传递到 ItemProcessor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43757856/

相关文章:

java - 如何基于默认的android PageView制作可滚动 fragment

java - 复合对象的同步方法如何工作

c# - 在 Android 中调用 .Net Web 服务失败

java - 具有可选行的 JTextArea

java - org.springframework.expression.spel.SpelEvaluationException : EL1007E: Property or field 'xxxxx' cannot be found on null

java - Mockito 如何捕获传递给注入(inject)的模拟对象方法的参数?

java - 使用存储过程快速从sql server读取百万条记录并使用java和spring boot将其写入csv

java - 我可以将单个静态项目注入(inject) Spring Batch 项目读取器吗?

mysql - spring batch - 如何在应用程序运行时传递动态列表到 ListItemReader 将其存储到数据库中

java - 使用 Spring 的 RMI 很慢