Spring   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了java – Spring Batch Multi Threading – 如何让每个线程读取唯一记录?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

许多论坛已经多次询问过这个问题.但我没有看到适合我的答案.我试图在我的春季批处理实现中实现多线程步骤.@H_618_2@

>有一个@R_946_11262@00k记录的临时表
>希望在每个线程的10个提交间隔300个线程中处理它 – 所以在任何时间点都有3000个记录.
>我定义了一个任务执行器,并在我想要多线程的步骤中引用它
>我的想法是,首先我将获得线程池大小(10)并用一个velue(可以是1-10)更新thread_id列到每个100k记录.在这种情况下有10个线程和100k记录,所以10k记录将分配一个id – 我正在尝试实现一个stagingsteplistener来执行此操作.
>为这个临时表写了一个读者.任务执行器将创建10个读者,每个读者必须读取300个不同的记录并处理它们 – 现在我如何传递一个公共ID
步骤监听器和读取器之间的关系,以便每个线程都有
它自己的一组记录要处理.@H_618_2@

截至目前,我只有一个JVm.所以我想在Multi Threaded步骤中做这个,而不是虑基于分区的方法.@H_618_2@

请帮忙……@H_618_2@

我提到了pro spring批处理书并创建了一个临时步骤监听器,它使用作业参数从作业配置xml接受运行ID,如下所示@H_618_2@

我找不到的是这个?这个“run.id”来自哪里.我在书中的任何地方都没有看到.我在我的spring批处理中复制了相同的实现,当我运行它时,我看到异常说run.id是不可识别的.请帮我讲一下如何做到这一点?

最佳答案
>我没有找到的是这个?这个“run.id”来自哪里

JobParameters@H_618_2@

这只是您传递给jobParameters的参数.通常使用每个实例的不同run.id(传统名称),因为框架无法知道JobParameters的哪些更改使其成为“下一个”作业实例.@H_618_2@

您可以将此“run.id”传递给jobParameters:@H_618_2@

new JobParametersBuilder().addLong("run.id",1L).toJobParameters()

有关详细信息,请查看JobParametersIncrementer的documentation.@H_618_2@

>如何在步骤侦听器和读取器之间传递公共ID,以便每个线程都有自己的一组记录来处理@H_618_2@

别@H_618_2@

这是一条非常危险的路线,因为Step中的许多参与者(例如读者和编写者)都是有状态的,如果状态没有被线程隔离,那么这些组件在多线程步骤中不可用.特别是Spring Batch的大多数现成的读者和作者都不是为多线程使用而设计的.@H_618_2@

分区@H_618_2@

我建议使用Partitioning.它比它看起来简单得多,你仍然可以使用多个线程.看一下使用@L_403_3@的样本批处理作业,它来自“Spring Batch samples”,它是:@H_618_2@

使用PartitionHandler SPI显示多线程步骤执行.该示例使用TaskExecutorPartitionHandler来传播读取多个线程的一些文件的工作,每个线程执行一步.关键组件是PartitionStep和MultiresourcePartitioner,负责划分工作.请注意,正在进行分区的Step中的读者和编写者是步骤范围的,因此它们的状态不会在执行的线程之间共享.@H_618_2@

大佬总结

以上是大佬教程为你收集整理的java – Spring Batch Multi Threading – 如何让每个线程读取唯一记录?全部内容,希望文章能够帮你解决java – Spring Batch Multi Threading – 如何让每个线程读取唯一记录?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。