当前位置: 首页 > 知识库问答 >
问题:

Spring批处理Javaconfig-参数化提交间隔(又名chunksize)

龙俭
2023-03-14

使用基于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):在“org.SpringFramework.Beans.Factory.Config.BeanExpressionContext”类型的对象上找不到属性或字段“作业参数”-可能不是公共的?

或者-当对step bean使用@stepscope时-

原因:java.lang.IllegalStateException:没有可用于步骤范围的上下文保持器

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

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

共有1个答案

呼延智明
2023-03-14

向步骤定义添加@JobScope注释在Spring批处理3中起作用:

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

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

 类似资料:
  • 我有一个非常简单的spring批处理,它从一个表中更新了一百万条记录。因为它非常简单,所以我尝试只实现一个更新表的Tasklet。 但我想用10个记录的步骤来promise。是可以在tasklet中实现这一点,还是我必须将itemReader/ItemWriter与块一起使用? 提前谢谢。

  • 1)读取器读取的任何记录都应通过处理器的处理传递给写入器 2)我的阅读器通过SQL查询读取记录,所以如果阅读器读取了100条记录,那么所有记录都应该一次传递给writer 3)如果读取1000条记录,则应同时通过所有1000条记录 4)所以从本质上说,提交间隔在这里是动态的,而不是固定的。 5)我们有什么办法可以做到这一点吗? 编辑: 现在我们想要的是动态提交间隔。读者正在阅读的任何内容,都将立即

  • 如何使用Java配置实现这一点?

  • 此场景的解决方案-提交间隔为10,跳过限制为10,总输入记录为20,前9个记录有效,其余无效。 当已读取9条记录时,第10条无效。块大小是10,跳过限制是10,那么Spring批处理会在输出文件中写入那9条记录吗?如果不是,则继续读取剩余的记录,当读取第20条记录时,错误记录的计数为11,定义的跳过限制为10。因此该过程将立即停止。首先读取的有效记录的命运如何。 前9条记录是否写入输出文件。 请让

  • 我正在尝试让Spring Batch2.2与JavaConfig一起工作。 现在,他们有一个注释,它设置了很多东西。默认注释为其职务数据使用datasource,但我们不想保存此数据,也不想为其创建表。文档中提到了一些关于自定义的内容,但我无法使其工作: 用户必须提供作为上下文中的bean,或者在配置类本身中实现,例如: 在我们的旧版本中,我们可以使用类,因此它将所有数据保存在内存中。是否可以使用

  • Spring批处理读取器的“pageSize”属性和写入器的“提交间隔”之间有什么关系/区别。 我可能错了,但我在我的应用程序中看到了一种模式,即每超过一个页面大小,我就会看到一个提交。这是真的吗? 谢谢