Spring Batch Javaconfig - 参数化commit-interval aka chunksize

时间:2014-06-23 18:44:51

标签: spring-batch spring-java-config

使用基于Spring Batch xml的配置,您可以参数化commit-interval / chunk大小,如:

<job id="basicSimpleJob" 
     xmlns="http://www.springframework.org/schema/batch">
    <step id="basicSimpleStep" >
        <tasklet>
            <chunk
                reader="reader" 
                processor="processor" 
                writer="writer" 
                commit-interval="#{jobParameters['commit.interval']}">
            </chunk>
        </tasklet>
    </step>
</job>

使用基于javaconfig的配置,它可以看起来像

@Bean
public Step step(
        ItemStreamReader<Map<String, Object>> reader,
        ItemWriter<Map<String, Object>> writer,
        @Value("#{jobParameters['commit.interval']}") Integer commitInterval
) throws Exception {
    return steps
            .get("basicSimpleStep")
            .<Map<String, Object>, Map<String, Object>>chunk(commitInterval)
            .reader(reader)
            .processor(new FilterItemProcessor())
            .writer(writer)
            .build();
}

但它不起作用,我得到

  

引起:   org.springframework.expression.spel.SpelEvaluationException:   EL1008E:(pos 0):属性或字段&#39; jobParameters&#39;无法找到   对象类型   &#39; org.springframework.beans.factory.config.BeanExpressionContext&#39; -   也许不公开?

或 - 使用@StepScope作为步骤bean -

  

引起:java.lang.IllegalStateException:没有上下文持有者   可用于步骤范围

我知道我有一个工作步骤镜,其他步骤豆工作(在同一个类中定义为步骤)

现在我使用的是CompletionPolicy,它可以与stepScope一起使用,但我想知道是否有人让它工作正常&#34;正常&#34;方式或是否是JIRA票的时间

...在https://jira.spring.io/browse/BATCH-2263

创建

2 个答案:

答案 0 :(得分:2)

将@JobScope注释添加到步骤定义正在Spring Batch 3中使用:

@Bean
@JobScope
public Step step(
        ItemStreamReader<Map<String, Object>> reader,
        ItemWriter<Map<String, Object>> writer,
        @Value("#{jobParameters['commit.interval']}") Integer commitInterval
)

这将在作业执行时初始化步骤bean,因此在这种情况下,jobParameters的后期绑定正在起作用。

答案 1 :(得分:0)

我对JavaConfig的信心不足 - 也许 - 这可能只是在java配置的后期绑定期间的提交间隔问题(在SB ChunkElementParser.java源中有几行代码检查commit-interval以#开头并注入SimpleCompletionPolicy步骤作用域);您可以尝试注入StepExecutionSimpleCompletionPolicy并检查此解决方案是否有效。

此外,我从未尝试使用xml配置进行后期绑定commit-interval,但有一个[打开的票证标题为Commit Interval not working as intended when used in Late Binding

作为最后的机会,如果您使用的是3.0版,您还可以使用@JobScope注释步骤并检查此解决方案是否有效。