使用基于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票的时间
创建答案 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注释步骤并检查此解决方案是否有效。