Spring 批处理:MultiResourcePartitioner 如何按名称文件设置顺序资源

Spring Batch : MultiResourcePartitioner How to set order resources by name files

我有工作 Spring 批处理,它读取和写入多个文件,为此我使用 MultiResourcePartitioner 读取多个文件。

当我将文件列表设置为资源 (partitionner.setResources(listFiles)) 时,pMultiResourcePartitioner 随机处理文件不遵守 listFiles

中的文件顺序

这是我的代码:

    @Bean
    @JobScope
    public MultiResourcePartitioner paritioner() throws IOException {
        MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
        Resource[] resources = new Resource[listFiles.size()];
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        HashMap<Integer, String> collect = listFiles
            .stream().sorted(Comparator.reverseOrder()).collect(HashMap<Integer, String>::new, (map, streamValue) -> map.put(map.size(), streamValue), (mapFirst, mapSecond) -> {
            });
        collect.forEach((index, value) -> resources[index] = resolver.getResource("file:" + value));

        partitioner.partition(1);
        partitioner.setResources(resources);
        return partitioner;
    }

如何避免在 MultiResourcePartitioner 中随机处理文件

当您决定使用分区步骤时,您应该假设分区将由不同的工作程序(可能是本地线程或远程工作程序 JVM)并行处理。并行与排序不兼容。未定义的分区处理顺序。

在您的情况下,MultiResourcePartitioner 将为每个文件创建一个分区,并且每个文件将由不同的工作人员处理。将资源传递给分区程序的顺序无关紧要(也不应该)。