我有一个tar.gz
存档,大约有一百万个文件。我想使用MultiResourceItemReader
中的spring-batch
来阅读这些文件。
问题:MultiResourceItemReader
需要在初始化时设置resources
。但我不想在导入开始之前初始化所有1mio文件。相反,我想让MultiResourceItemReader按文件读取存档文件,并通过批量导入传递每个文件,而不是在启动时分配所有文件。
我怎么能得到这个?
答案 0 :(得分:2)
我认为您必须编写自己的}
作为CompressedFileMultiResourceItemReader
,但接受:
MultiResourceItemReader
应遍历压缩文件条目,匹配路径,并且 - 如果找到匹配项 - 创建VfsResource
(或适用于VFS条目的自定义CompressedFileMultiResourceItemReader
)并将其传递给代表进行真正的阅读
当然,你自己的读者必须关心它的状态
允许重新启动 这只是一个想法;我没有时间把它变得具体,因为目前我还没有空余时间:(
答案 1 :(得分:1)
使用Apache-VFS,您可以像在“传统”文件系统上执行文件一样读取tar存档中的文件。
As presented here,资源路径为:tar:// arch-file-uri[! absolute-path]
。
tar.gz
文件的示例:tar:gz:http://anyhost/dir/mytar.tar.gz!/mytar.tar!/path/in/tar/README.txt
。
现在,Spring Batch MultiResourceItemReader
可以通过在资源名称中指定通配符来读取多个文件。
示例:<property name="resources" value="file:C:/files/file*.txt" />
我认为您可以尝试覆盖默认setResource(Resource resource)
的方法MultiResourceItemReader
以添加对Apache-VFS的支持。
修改强>
正如Luca所指出的那样,MultiResourceItemReader
没有setResource(Resource resource)
方法,而是setResources(Resources[] resources)
。
在这种情况下,我认为这不会使这一领导无效。实际上,在我看来,存在底层ResourcesItemReader
,它将通配符转换为资源数组。
这意味着您可以声明一个新的String属性来请求资源路径,并可以使用PathMatchingResourcePatternResolver来解析实际资源。
以下是您可能会发现有用的几行代码:
public class CustomMultiResourceItemReader extends MultiResourceItemReader {
private String resourcesPath;
@Override
public void setResources(Resources[] resources) {
this.resources = new PathMatchingResourcePatternResolver().getResources(resourcesPath)
}
public void setResourcesPath(String resourcesPath) {
this.resourcesPath = resourcesPath;
}
}
现在我认为您需要创建自定义ResourceLoader
才能使用Apache-VFS实际解析资源。