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
@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
}
}