这种方法打破了Spring批处理的设计方法。
spring批处理背后的整个思想是,提交每个块,并且spring-batch跟踪哪些记录已经被处理,以便提供重新启动、跳过和失败处理策略。
如果您真的需要一个贯穿整个过程的事务,为什么要使用spring-batch呢?我的意思是,您可以直接使用读取器和写入器,并在您自己的简单循环中使用它们。像这样的东西。
transaction.open();
while (not all processed) {
List currentChunk = new List..;
for(int i<0;i<chunkSize;i++) {
Object readItem = jdbcCursorItemReader.read();
if (readItem == null) {
break;
}
Object processedItem = processor.process(readItem);
if (processedItem != null) {
currentChunk.add(processedItem);
}
}
yourWriter.write(currentChunk);
}
transaction.commit();
我有一个非常简单的spring批处理,它从一个表中更新了一百万条记录。因为它非常简单,所以我尝试只实现一个更新表的Tasklet。 但我想用10个记录的步骤来promise。是可以在tasklet中实现这一点,还是我必须将itemReader/ItemWriter与块一起使用? 提前谢谢。
1)读取器读取的任何记录都应通过处理器的处理传递给写入器 2)我的阅读器通过SQL查询读取记录,所以如果阅读器读取了100条记录,那么所有记录都应该一次传递给writer 3)如果读取1000条记录,则应同时通过所有1000条记录 4)所以从本质上说,提交间隔在这里是动态的,而不是固定的。 5)我们有什么办法可以做到这一点吗? 编辑: 现在我们想要的是动态提交间隔。读者正在阅读的任何内容,都将立即
我们正在处理一个Spring批处理项目(Spring Boot1.2.2.Release),要求使用Spring SFTP集成以一定频率轮询从服务器位置读取文件。我们使用java config实现了Spring批处理,并在使用Spring Integration java config的过程中实现了Spring批处理。我找不到描述上述情况的例子。我浏览了各种链接,但看到的主要是XML配置示例。 h
如果我正在读写本地文件,那么对远程数据库服务器的更新相对昂贵。如果增加[chunk-size],内存使用量就会上升。 提交频率对编写本地文件并没有太大的影响,所以对我来说,元数据更新才是一个问题。该步骤是可重新启动的,因此从技术上讲,我不需要记录中间提交计数。 对于JobRepository,我可以只使用map或内存数据库,但我需要其他信息,例如持久化的开始/结束时间,而且这个问题只涉及一个步骤。
此场景的解决方案-提交间隔为10,跳过限制为10,总输入记录为20,前9个记录有效,其余无效。 当已读取9条记录时,第10条无效。块大小是10,跳过限制是10,那么Spring批处理会在输出文件中写入那9条记录吗?如果不是,则继续读取剩余的记录,当读取第20条记录时,错误记录的计数为11,定义的跳过限制为10。因此该过程将立即停止。首先读取的有效记录的命运如何。 前9条记录是否写入输出文件。 请让
使用基于Spring Batch xml的配置,您可以参数化提交间隔/块大小,如下所示: 使用基于javaconfig的配置,它看起来像 但这也行不通,我也明白 原因:org.SpringFramework.Expression.Spel.SpelEvaluationException:EL1008E:(pos 0):在“org.SpringFramework.Beans.Factory.Conf