【问题标题】:Spring Batch Javaconfig - parameterize commit-interval aka chunksizeSpring Batch Javaconfig - 参数化提交间隔又名块大小
【发布时间】:2014-08-13 22:01:09
【问题描述】:

使用基于 Spring Batch xml 的配置,您可以参数化提交间隔/块大小,例如:

<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): 找不到属性或字段“jobParameters” 类型的对象 'org.springframework.beans.factory.config.BeanExpressionContext' - 也许不公开?

或者 - 使用 @StepScope 作为 step bean -

原因:java.lang.IllegalStateException:没有上下文持有者 可用于步进范围

我知道我有一个工作的 stepscope,其他 stepscoped bean 工作(定义在与 step 相同的类中)

现在我使用 CompletionPolicy,它可以与 stepScope 一起使用,但我想知道是否有人让它以“正常”的方式工作,或者是否是 JIRA 票的时候了

...创建于https://jira.spring.io/browse/BATCH-2263

【问题讨论】:

    标签: spring-batch spring-java-config


    【解决方案1】:

    在 Spring Batch 3 中向 Step 定义添加 @JobScope 注释:

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

    这将在作业执行时初始化 step bean,因此在这种情况下,jobParameters 的后期绑定是有效的。

    【讨论】:

    • 拄着拐杖的蟋蟀摩西花了很长时间才找到谢谢!
    【解决方案2】:

    我对 JavaConfig 没有信心,而且 - 也许 - 这可能是 java 配置后期绑定期间的提交间隔问题(在 SB ChunkElementParser.java 源代码中,检查提交间隔的代码行数以a # 并注入一个SimpleCompletionPolicy 范围内的步骤);您可以尝试注入 StepExecutionSimpleCompletionPolicy 并检查此解决方案是否有效。

    另外,我从未尝试过使用 xml 配置进行后期绑定提交间隔,但是有一个 [opened ticket with title Commit Interval not working as intended when used in Late Binding

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

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 2015-12-10
      • 2019-09-26
      • 2011-10-11
      • 2018-05-14
      • 2015-10-15
      • 2014-05-06
      • 1970-01-01
      • 2018-03-09
      相关资源
      最近更新 更多