Spring batch ResourceAware,而不是LineCallbackHandler的MultiResourceItemReader.getCurrentResource()

Spring batch ResourceAware,而不是LineCallbackHandler的MultiResourceItemReader.getCurrentResource(),spring-batch,Spring Batch,我正在使用一个MultiResourceItemReader,它的getCurrentResource()方法最近被弃用(请参阅:) 替换方法是使用ResourceAware界面,但我面临一个问题,不知道是否有人能提供帮助 当前设置: 我有一个使用FlatFileItemReader委托的MultiResourceItemReader FlatFileItemReader使用LineCallbackHandler,该处理程序是使用FlatFileItemReaderBuilder的skippe

我正在使用一个
MultiResourceItemReader
,它的
getCurrentResource()
方法最近被弃用(请参阅:)

替换方法是使用
ResourceAware
界面,但我面临一个问题,不知道是否有人能提供帮助

当前设置:

  • 我有一个使用
    FlatFileItemReader
    委托的
    MultiResourceItemReader
  • FlatFileItemReader
    使用
    LineCallbackHandler
    ,该处理程序是使用
    FlatFileItemReaderBuilder
    skippedLinesCallback()
    方法设置的
  • 当前实现将
    MultiResourceItemReader
    注入
    LineCallbackHandler
    ,以便
    handleLine(stringline)
    方法可以利用知道当前正在处理的文件
  • 据我所知,
    resourceaware
    接口是在域项目上实现的,但就我而言,我还没有域项目的实例。。。我只有文件中的输入字符串,因为该行已被跳过
如何让我的LineCallbackHandler“资源感知”,以便继续使用刚才的逻辑?

代码:

配置:

  @Bean
  public MultiResourceItemReader<Items> reader(@Value(SPRING_VALUE_TO_LOOK_FOR) final String paths) {
    final Resource[] resources = EtlHelpers.convertFilesToProcessFromContextString(paths);
    final MultiResourceItemReader<Items> reader = new MultiResourceItemReader<>();
    reader.setName("multiFileReader");
    reader.setDelegate(fileReaderDelegate());
    reader.setResources(resources);
    return reader;
  }

  @Bean
  public FlatFileItemReader<Items> fileReaderDelegate() {
    return new FlatFileItemReaderBuilder<Items>()
        .name("fileReader")
        .linesToSkip(1)
        .skippedLinesCallback(headerValidator)
              // (extra unrelated config)
        .build();
  }

如果我理解正确,您的目标是跳过标题并知道每个标题来自哪个资源。尽管这是一个非常具体的用例,但我认为这是一个有效的用例,因为它可以应用于任何被认为是注释的行(比如知道每个注释行的源文件)

当前实现将MultiResourceItemReader注入到LineCallbackHandler中,以便handleLine(String line)方法可以利用知道当前正在处理的文件

我希望您同意,这会将
LineCallbackHandler
MultiResourceItemReader
耦合起来,但这并不理想(如中所述,它不推荐
MultiResourceItemReader#getCurrentResource
)。如果此耦合不是您的问题,那么您可以从
FlatFileItemReader
本身获取当前资源,因为每次处理新资源时,
MultiResourceItemReader
。您可以找到一个完整的示例(请注意,这需要为
FlatFileItemReader
中的资源提供一个新的getter)

这就是说,我看不到任何明显的方法来实现SpringBatch当前提供的用例。
skippedLinesCallback
doOpen
方法中调用,该方法早于通过
ResourceAware
设置资源的映射项。我想到的解决此类用例的最直接的方法是使用
ResourceAwareRelineCallBackHandler
,并使
FlatFileItemReader
设置其上的当前资源


请打开一个有关此SO问题的问题,我们可以讨论介绍此功能的最佳方式。首先谢谢。

我添加了一个答案,给出了当前情况。如果有帮助,请接受它:。否则,请让我知道缺少什么来接受它。“谢谢你。”马哈茂德本哈辛谢谢你的帮助。我提出了一个新的功能请求:(抱歉,到现在还没有时间提出)新提出的问题可在以下网址查阅:
@Service
@RequiredArgsConstructor
public class HeaderValidator implements LineCallbackHandler {
    private final MultiResourceItemReader<Items> itemReader;

    @Override
    public void handleLine(@NonNull final String line) {
        final String desc = Optional.ofNullable(itemReader.getCurrentResource()).map(Resource::getDescription).orElse("file");
        log.info("{}: Ensuring headings are on the first line and are correct (using case-insensitive comparisons)", desc);
        // ... other uses of itemReader.getCurrentResource() omitted for brevity 
    }
}