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

Spring批处理多线程与分区

段干俊茂
2023-03-14

我有一个要求,我想在下面的场景中使用Spring批处理框架。

我有一个在交易日期列上分区的表。我想使用Spring批处理框架的阅读器、处理器和写入器来处理该表的记录。我想做的是根据交易日期创建单独的线程进行读取、写入和处理。假设有4个交易日期,那么我想为单独的交易日期创建4个单独的线程。在每个线程中,阅读器将从该交易日期的表中读取记录,在处理器中丰富记录,然后在写入器中发布/写入。

我是Spring批处理的新手,因此我需要帮助通过使用Spring批处理多线程或分区来设计正确的方法。

共有2个答案

拓拔弘化
2023-03-14

您可以使用本地分区或主从方法来解决问题。在Spring配置中,按照以下步骤编写主和从步骤。

<batch:job id="tradeProcessor">
    <batch:step id="master">
        <partition step="slave" partitioner="tradePartitioner">
            <handler grid-size="4" task-executor="taskExecutor" />
        </partition>
    </batch:step>       
</batch:job>
<batch:step id="slave">
    <batch:tasklet>
        <batch:chunk reader="dataReader" writer="dataWriter"
                          processor="dataProcessor" commit-interval="10">
        </batch:chunk>
    </batch:tasklet>
</batch:step>

有关更多详细信息,您可以参考此处讨论的简单示例。

焦学海
2023-03-14

也许您可以使用如下的本地分区:

<batch:job id="MyBatch" xmlns="http://www.springframework.org/schema/batch">
    <batch:step id="masterStep">
        <batch:partition step="slave" partitioner="splitPartitioner">
            <batch:handler grid-size="4" task-executor="taskExecutor"  />
        </batch:partition>
    </batch:step>
</batch:job>

然后使用组织创建拆分器。springframework。一批果心隔断支持分区器接口。然后在partition method中,根据需要拆分源数据,创建的每个ExecutionContext都将由它自己的线程执行。

 类似资料:
  • null 我更新了我的步骤并添加了一个ThreadPoolTaskExecutor,如下所示 在此之后,我的处理器将被多个线程调用,但使用相同的源数据。我还有什么需要做的吗?

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 我想编写一个spring boot批处理应用程序,其中我有一个充满事件的数据库表。我想做的是有一个多线程的spring boot批处理应用程序,它将以这种方式工作: 我想有5个线程运行,每个线程将保留一个偏移量来跟踪它读取的事件,以便没有其他线程再次读取相同的事件。我想怎么做: 所以我希望能够在数据库表中为每个线程保留偏移量。有没有办法让Spring Boot环境以这种方式工作?

  • 我目前正在处理一批数据,这些数据来自一个拥有数百万行的大型SQL数据库。 它在处理器中执行一些处理,包括通过带有连接的大型sql查询对从Reader检索到的行进行分组。 编写器将结果写入另一个表。 问题是此Batch存在性能问题,因为Sql选择查询需要大量时间并且步骤不会在多线程中执行。 因此,我希望在多标题中运行它们,但问题是,这些步骤通过计算具有相同类型的所有行的总数来对行进行分组。 因此,如

  • 我使用的是Spring Batch 2.1.8。释放我有一个文件,它由一些头信息和一些需要处理的记录组成。 我有一个使用面向块处理的步骤。该步骤包含ItemReader和ItemWriter的实现。ItemReader实现是线程安全的,而ItemWriter不是。 我想在处理(或写入)任何记录之前使用标题信息。在继续使用面向块的处理时,如何确保这一点? 建议的解决方案:一种解决方案可以是编写一个预

  • 我有一个Spring Boot 1.5应用程序与Spring Batch 3.0.7和Java8。我最近收到了一些连接超时,当一个计划作业试图从5个线程开始时,而另一个长时间运行的批处理作业正在运行。似乎有15个线程合并的连接争用。我没有找到任何留档、博客或问题,似乎解决了Spring Batch中线程和池的相关性。 我使用HikariCP有3个连接,每个数据源配置为默认值(10个连接): bat