java - 将分区扩展至多一级

标签 java spring-batch

如下图所示 Spring Batch Doc ,主步骤被划分为六个从步骤,它们是主步骤的相同副本。

enter image description here

我的问题是,我可以将分区扩​​展到一级或多 N 级吗?即所有六个从机都成为另外 N 个从机的主机?

用例:首先,我们根据主要标准对数据进行分区,然后我们进一步根据该主要标准中的其他一些标准对数据进行分区。

例如首先,我根据客户名称为N个客户的数据启动从属服务器,然后针对每个客户名称,进一步根据办公地点对数据进行分区。

可以这样做还是不支持?

编辑:根据我的编码实验,由于 StepExecutionContext 问题,它看起来不可行。 See thisthis 。我们无法在分区上下文中将 StepExecutionContext 从一个 Step 传递到另一个。

最佳答案

(我应该询问更多细节,所以我的答案可能不必要地长,具体取决于您对 spring-batch 分区的理解。如果我需要使用分区,我将保留此线程)。

你总是可以从你的从属线程中生成你自己的线程,并为它们提供所需的参数,但这将完全破坏使用像 spring-batch 这样的框架的全部意义。

这不是解决您问题的直接方法:奴隶不会在这里产生其他奴隶。事实上,我认为他们不应该/可以。但是您创建的 Partitionner 将通过在 ExecutionContext 中为每个从属设备提供自己的参数(clientName 和 officeLocation)来模拟此行为,因此它们将读取/处理/写入自己的部分。

<小时/>

如果你不明白:

我以此为例:https://www.mkyong.com/spring-batch/spring-batch-partitioning-example/所以你需要阅读才能知道我在说什么。

根据我对分区的理解,每个步骤都有自己的 ExecutionContext,在这种情况下,您将输入特定于每个从属设备的参数。您需要创建一个分区程序,为每个从属设备的 gridSize 设置特定值。

在 Mkyong 的示例中,他将 gridSize 的值设置为 10,这意味着他将有 10 个线程。他知道他将从 1 到 100,因此他为每个线程设置数据库值匹配:

for `thread1`, fromId:1 toId:10, 
for `thread2`, fromId:11 toId:20, 
for `thread3`, fromId:21 toId:30, 
etc.

他在 ExecutionContext 中设置这些值,因此每个读取器/处理器/编写器都会获得自己的处理值(选择从 fromIdtoId ,所以每个选择都有它自己的部分)。如果他愿意,他可以做一些更动态的事情:在 Partitionner 中设置数据库的 id 总数,并更改 toIdfromId > 取决于尺寸。它是高度可定制的。

对于你的情况,就像你必须处理两个参数(这里只是 id),而且它们不是数字。假设您只有 clientName,如果您为 Partitionner 提供这些客户端名称的列表(或数组),则只需为每个 生成一个 ExecutionContext clientName 并设置它。如果您有两个参数,则可以使用更复杂的结构,例如 Client 类的 List(当然,每个参数Client 有一个clientName 参数和一个字符串officeLocations 列表)。现在,您将为每个 officeLocation 的每个 clientName 创建一个 ExecutionContext。每个读者将从其 ExecutionContext 中获取 clientNameofficeLocation 来选择它们。

例如,如果您有 3 个客户端,每个客户端有 2 个位置,那么您最终将得到 6 个 ExecutionContext(因此,6 个从属/线程)。然后,在您的 Reader 上,您只需从 ExecutionContext 中检索 clientName 和 officeName 并使用它们来选择您的实体(来自数据库或其他)。

可以在上一步中创建具有 OfficeName 的客户列表,并在作业上下文中设置为可在整个作业中访问。如果 gridSize 需要与 Spring Batch 创建的线程数相同,您可以在创建客户端列表的同时计算它并以相同的方式设置。

关于java - 将分区扩展至多一级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39901207/

相关文章:

xml - spring batch StaxEventItemReader 释放异常

java - Spring Integration Inbound-Channel-Adapter 逐行读取大文件

java - 如何从 map 中的特定键获取下一个键?

java - 安卓序列化问题

java - Gradle共享依赖版本问题

java - 如何将单行数据插入到多个表中

java - 使用 servlet 从 Apache 中删除文件

java - 如何在另一个类中使用一个类的代码? ( java )

java - JpaItemWriter : no transaction is in progress

java - 在 Spring Batch 中使用采用参数的查询