如何使用MultiResourceItemReader读取多个文件?

时间:2016-01-07 10:31:36

标签: java spring spring-batch

我有一个tar.gz存档,大约有一百万个文件。我想使用MultiResourceItemReader中的spring-batch来阅读这些文件。

问题:MultiResourceItemReader需要在初始化时设置resources。但我不想在导入开始之前初始化所有1mio文件。相反,我想让MultiResourceItemReader按文件读取存档文件,并通过批量导入传递每个文件,而不是在启动时分配所有文件。

我怎么能得到这个?

2 个答案:

答案 0 :(得分:2)

我认为您必须编写自己的}作为CompressedFileMultiResourceItemReader,但接受:

  1. 单个压缩文件
  2. 匹配路径列表
  3. 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实际解析资源。