将分区扩展到一个级别
Extend partitioning to one more level
根据 Spring Batch Doc 中的下图,一个主步骤被分成六个从步骤,它们是主步骤的相同副本。
我的问题是,我可以将分区扩展到多一层或多N层吗?即所有六个奴隶都成为更多 N 个奴隶的主人?
用例: 首先,我们根据主要标准对数据进行分区,然后根据该主要标准中的其他一些标准进一步对数据进行分区。
例如首先,我根据 客户端名称 为 N 个客户端的数据启动从站,然后对于每个客户端名称,进一步根据 办公地点 .[=16 对数据进行分区=]
这可以做还是不支持?
编辑: 根据我的编码实验,由于 StepExecutionContext
个问题,它看起来不可行。 See this and this。我们不能在分区上下文中将 StepExecutionContext
从一个 Step
传递给另一个。
(我应该问更多的细节,所以我的回答可能会不必要地长,这取决于你对 spring-batch 中的分区的理解。如果我需要使用分区,我会保留这个线程) .
你总是可以从你的奴隶中产生你自己的线程并给他们他们需要的参数,但这将完全破坏使用像 spring-batch.
这样的框架的全部意义
这不是您问题的直接解决方案:奴隶不会在这里产生其他奴隶。事实上,我不认为他们 should/can。但是您创建的 Partitionner
将通过在其 ExecutionContext 中为每个从属提供自己的参数(clientName 和 officeLocation)来模拟此行为,因此它们将 read/process/write 自己的部分。
如果你不明白:
我以这个为例:https://www.mkyong.com/spring-batch/spring-batch-partitioning-example/ 所以你需要阅读才能知道我在说什么。
根据我对分区的理解,每个步骤都有自己的 ExecutionContext,在这个上下文中,您将放置每个从站特定的参数。您需要创建一个 Partitionner,它为来自 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
中设置了这些值,因此每个 reader/processor/writer 都有自己的处理值(select 从 fromId
到 toId
,所以每个 selects 都有自己的部分)。如果他愿意,他可以做一些更动态的事情:在 Partitionner
中设置数据库的 ID 总数,并根据大小更改 toId
和 fromId
。它是高度可定制的。
对于您的情况,就好像您必须处理两个参数(这里只是 id),它们不是数字。假设你只有 clientName
,如果你给你的 Partitionner 一个包含这些客户端名称的列表(或数组),你只需要为每个 clientName
生成一个 ExecutionContext
并将其设置在. 如果你有两个参数,你可以使用更复杂的结构,比如 List
of Client
class (当然,每个 Client
都有一个 clientName
参数和字符串列表 officeLocations
)。现在,您将为每个 clientName
每个 officeLocation
创建一个 ExecutionContext
。每个 reader 将从其 ExecutionContext 中获取 clientName
和 officeLocation
到 select他们。
例如,如果您有 3 个客户端并且每个客户端有 2 个位置,您最终将有 6 个 ExecutionContext(因此,6 slaves/threads)。然后,在您的 Reader
上,您只需从 ExecutionContext
中检索 clientName 和 officeName 并将它们用于 select 您的实体(来自数据库或其他)。
可以在前面的步骤中使用他们的 officeName 创建客户列表,并在作业上下文中设置为在整个作业中都可以访问。如果 gridSize 需要与 spring 批处理创建的线程数相同,您可以在创建客户端列表的同时计算它并以相同的方式设置它。
根据 Spring Batch Doc 中的下图,一个主步骤被分成六个从步骤,它们是主步骤的相同副本。
我的问题是,我可以将分区扩展到多一层或多N层吗?即所有六个奴隶都成为更多 N 个奴隶的主人?
用例: 首先,我们根据主要标准对数据进行分区,然后根据该主要标准中的其他一些标准进一步对数据进行分区。
例如首先,我根据 客户端名称 为 N 个客户端的数据启动从站,然后对于每个客户端名称,进一步根据 办公地点 .[=16 对数据进行分区=]
这可以做还是不支持?
编辑: 根据我的编码实验,由于 StepExecutionContext
个问题,它看起来不可行。 See this and this。我们不能在分区上下文中将 StepExecutionContext
从一个 Step
传递给另一个。
(我应该问更多的细节,所以我的回答可能会不必要地长,这取决于你对 spring-batch 中的分区的理解。如果我需要使用分区,我会保留这个线程) .
你总是可以从你的奴隶中产生你自己的线程并给他们他们需要的参数,但这将完全破坏使用像 spring-batch.
这样的框架的全部意义这不是您问题的直接解决方案:奴隶不会在这里产生其他奴隶。事实上,我不认为他们 should/can。但是您创建的 Partitionner
将通过在其 ExecutionContext 中为每个从属提供自己的参数(clientName 和 officeLocation)来模拟此行为,因此它们将 read/process/write 自己的部分。
如果你不明白:
我以这个为例:https://www.mkyong.com/spring-batch/spring-batch-partitioning-example/ 所以你需要阅读才能知道我在说什么。
根据我对分区的理解,每个步骤都有自己的 ExecutionContext,在这个上下文中,您将放置每个从站特定的参数。您需要创建一个 Partitionner,它为来自 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
中设置了这些值,因此每个 reader/processor/writer 都有自己的处理值(select 从 fromId
到 toId
,所以每个 selects 都有自己的部分)。如果他愿意,他可以做一些更动态的事情:在 Partitionner
中设置数据库的 ID 总数,并根据大小更改 toId
和 fromId
。它是高度可定制的。
对于您的情况,就好像您必须处理两个参数(这里只是 id),它们不是数字。假设你只有 clientName
,如果你给你的 Partitionner 一个包含这些客户端名称的列表(或数组),你只需要为每个 clientName
生成一个 ExecutionContext
并将其设置在. 如果你有两个参数,你可以使用更复杂的结构,比如 List
of Client
class (当然,每个 Client
都有一个 clientName
参数和字符串列表 officeLocations
)。现在,您将为每个 clientName
每个 officeLocation
创建一个 ExecutionContext
。每个 reader 将从其 ExecutionContext 中获取 clientName
和 officeLocation
到 select他们。
例如,如果您有 3 个客户端并且每个客户端有 2 个位置,您最终将有 6 个 ExecutionContext(因此,6 slaves/threads)。然后,在您的 Reader
上,您只需从 ExecutionContext
中检索 clientName 和 officeName 并将它们用于 select 您的实体(来自数据库或其他)。
可以在前面的步骤中使用他们的 officeName 创建客户列表,并在作业上下文中设置为在整个作业中都可以访问。如果 gridSize 需要与 spring 批处理创建的线程数相同,您可以在创建客户端列表的同时计算它并以相同的方式设置它。