通过增加 Spring Batch 中的步骤池大小来更改运行步骤的数量

金色的

这是一个关于在运行时更改线程池大小如何影响弹簧批处理运行时系统的复合问题。

首先,我想澄清一下:并发=运行步骤的数量和并行度=每步骤的#线程。

为了清楚地了解我如何使用 Spring Batch 进行处理。目前我正在生成大量文件(200+),我正在使用 Spring Batch 传输每个步骤映射到 1 个文件的文件。关于工作的一切都是动态的,就像步骤的数量一样,每个步骤的读取器和写入器都与该步骤不同。所以没有步骤共享读者或作者。有一个线程池专门用于并发运行这些步骤,然后每个步骤都有自己的线程池,因此我们可以在每个步骤中进行并行处理。当与提交间隔结合使用时,这提供了巨大的吞吐量和控制。

所以我的问题是:

  1. 作业开始后如何更改运行步骤数?
  2. 如何在步骤开始处理后更改提交间隔?

因此,让我们考虑一个示例,说明我为什么要这样做以及更改“运行步骤”和“提交间隔”的确切含义。

考虑一下您总共有 300 个步骤要处理的情况,步骤线程池大小为 5。我开始处理并意识到我有更多资源可以利用,我想将线程数更改为 8。当我实际执行此操作时在运行时,我的经验是线程池确实增加了,但运行步骤的数量没有改变。这是为什么?

按照类似的逻辑说我有更多的内存可以利用,然后我想在运行时增加我的提交间隔。我在 StepExecution 类中没有发现任何可以让我出人意料地更改提交间隔的东西。为什么不?

有趣的是,对于并行性,我可以通过简单地增加线程池的大小来改变运行线程的数量。通过简单地更改并行线程的数量,我注意到吞吐量大幅增加。

如果您想了解更多信息,我可以提供代码并链接到存储库。

非常感谢。

马哈茂德·本·哈辛

虽然可以使提交间隔和线程池大小可配置并在启动时更改它们,但一旦作业执行开始,就无法在运行时(即“运行中”)更改它们。

使提交间隔和线程池大小可配置(通过应用程序/系统属性或将它们作为作业参数传递)将允许您根据经验调整这些值以最好地利用您的资源,而无需重新编译/重新打包您的应用程序。

您正在寻找的运行时动态默认情况下不可用,但您始终可以实现该Step接口并将其用作 Spring Batch 作业的一部分,旁边是框架提供的开箱即用的其他步骤类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Batch - 如何通过读取其他步骤的编写器来进行并行步骤?

Spring Batch读取步骤循环运行

Spring Batch,在工作步骤中可变

Spring Batch分区:多步骤的从属步骤

Spring Batch:在作业运行时创建新步骤

如何在Spring Batch中的循环中运行步骤:已更新

如何在Spring Batch中完成每个分区步骤后添加tasklet以运行

Spring Batch-Java配置中的抽象步骤定义?

Spring Batch:Java配置文件中的并行步骤执行

在Spring Batch步骤中参考命令行参数

Spring Batch在Tasklet中执行动态生成的步骤

从步骤之前获取XML配置Spring Batch中的jobExecutionContext

如何在Spring Batch中创建动态步骤

Spring Batch在步骤内部访问作业参数

使用批注的Spring Batch 3.0.2并行步骤

Spring Batch步骤不立即提交事务

如果文件中的项目数量非常少,是否可以安全地使用Spring Batch多线程步骤?

通过Spring Batch中的列顺序解析csv

Spring Batch中的JobParameters

我们可以在Spring Batch中并行运行的多个步骤中使用单个flatFileItemReader bean吗?

Spring Batch:为什么单元测试两次运行该步骤?

将Spring Batch Tasklet失败消息传递给报告步骤。

Spring Batch Job应用程序因步骤分区而挂起

Spring Batch事务管理-多线程步骤

Spring Batch有关面向块的步骤与现实的文档?

Spring Batch重复步骤以永无止境的循环结束

将数据传递到将来的步骤-Spring Batch

Spring Batch:从JMS队列读取,步骤未结束

Spring Batch后期绑定-步骤范围还是工作范围?