如何将参数从执行上下文传递到 MultiResourcePartitioner

How to pass parameters from Execution context to MultiResourcePartitioner

我一直在关注这本书的第十一章: https://www.apress.com/gp/book/9781484237236#:~:text=The%20Definitive%20Guide%20to%20Spring%20Batch%20covers%20how,5%2C%20and%20the%20new%20Spring%20Boot%202%20micro-framework.

我正在尝试实现多资源分区器。现在这是我正在使用的代码:

@Bean
    @StepScope
    public MultiResourcePartitioner multiResourcePartitioner(@Value("#{jobParameters['inputFiles']}")Resource[] resources){
        MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
        partitioner.setKeyName("file");
        partitioner.setResources(resources);
        return partitioner;
    }

这应该向每个步骤发送要读取和处理的文件的名称。 为了传递参数,我正在执行以下操作:

Map<String, JobParameter> parameters = new HashMap<>();
        JobParameter parameter = new JobParameter(new Date());
        parameters.put("currentTime", parameter);

        parameters.put("inputFiles", new JobParameter("1.csv;2.csv"));

但是当我调试 MultiResourcePartitioner class 时,我看到的是:

有谁知道获取资源数组作为 MultiResourcePartitioner 输入的语法是什么 class?

书上说的是: “我们需要在这个 Partitioner 上设置的另一个值是数组 资源。完成后,我们可以 return 实例

@Bean public MultiResourcePartitioner multiResourcePartitioner(@Value("classpath:multifile/*csv") Resource[] externalResources){ MultiResourcePartitioner partitioner = new MultiResourcePartitioner(); partitioner.setKeyName("file"); partitioner.setResources(externalResources); return partitioner; }

我不得不摆脱根本不起作用的 SpEL,甚至无法读取单个文件。我意识到分区程序不需要 beanscope(它在从具有多个线程的数据库中读取时不使用它),所以我只是将资源数组传递给 bean 并且它起作用了。