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

Spring批处理理解块处理

东方吕恭
2023-03-14

我在表中总共有8条记录,其中6条在spring批处理调用read时可以使用jpareader。现在我将页面大小和块大小设置为1以进行测试。期望作业运行时,它应该进行6次读取调用,然后它应该逐个处理,逐个写入。但实际上发生的是,它只是调用read 4次(从日志中我可以看到这样读取页面0...1)并处理4个,其中一个由于不匹配写入标准而被过滤掉,然后它只是更新了3个记录,作业标记为成功完成。

共有1个答案

段铭晨
2023-03-14

我看到了混乱。JPapagingItemReaderPageSize参数与面向块的步骤的ChunkSize(或commit-interval)无关。

如果使用JPAPagingItemReader并在pageSize=4的面向块的步骤之外使用它,它将一次获取4个项目(即每个页面)。现在这4个项目可以以2个为一个的块来处理,例如,每页将有两个块。每次通过面向块的步骤调用read时,JPapagingItemReader将读取第一页(4个项目的列表),然后从该列表返回项目。下面是PageSize=4ChunkSize=2TotalItems=8和块侦听器的示例:

ChunkListener.beforeChunk
Reading page 0
Reading item1
Reading item2
Writing item1
Writing item2
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading item3
Reading item4
Writing item3
Writing item4
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading page 1
Reading item5
Reading item6
Writing item5
Writing item6
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading item7
Reading item8
Writing item7
Writing item8
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading page 2
Reading item = null
ChunkListener.afterChunk

我用这个配置创建了一个示例应用程序,这样您就可以玩它,看看它是如何工作的。

希望在与分页项阅读器一起使用时,这有助于理解面向块的处理模型。

 类似资料:
  • 如果我正在读写本地文件,那么对远程数据库服务器的更新相对昂贵。如果增加[chunk-size],内存使用量就会上升。 提交频率对编写本地文件并没有太大的影响,所以对我来说,元数据更新才是一个问题。该步骤是可重新启动的,因此从技术上讲,我不需要记录中间提交计数。 对于JobRepository,我可以只使用map或内存数据库,但我需要其他信息,例如持久化的开始/结束时间,而且这个问题只涉及一个步骤。

  • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

  • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 在Spring batch中(请参见https://docs.Spring.io/spring-batch/3.0.x/reference/html/metadataschema.html),有六个表: batch_job_execution batch_job_execution_context batch_job_execution_params batch_job_instance batc

  • 步骤1:从数据库中加载10条记录。(Tasklet负责该工作) 步骤2:使用提交间隔=1的ItemReader、ItemProcessor、ItemWriter实现配置了面向块的处理 据我所知,对于每一个记录 > 我的问题是假设它处理了六条记录,而现在在ItemProcessor实现中的第7条记录出现了异常,它尝试回滚,但由于事务处于未知状态而无法回滚 即使它不能回滚第7条记录的tx,它也不会处理