将分区扩展到另一个级别

时间:2016-10-06 16:27:39

标签: java spring-batch

根据下面Spring Batch Doc的图像,主步骤被划分为六个从属步骤,这些步骤是主要的相同副本。

enter image description here

我的问题是,我可以将分区扩​​展到更多级别还是N级别?即所有六个奴隶都成为更多N奴隶的主人?

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

e.g。首先,我根据客户名称启动N个客户数据的奴隶,然后为每个客户名称,进一步根据办公地点分区数据。

这可以完成还是不支持?

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

1 个答案:

答案 0 :(得分:1)

(我本来应该问更多详细信息,所以我的回答可能会非常长,取决于你对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中设置了这些值,因此每个读者/处理器/编写者都有自己的处理价值(选择从fromId变为toId,因此每个选择获取它是自己的一部分)。如果他愿意,他可以做一些更动态的事情:在Partitionner中设置数据库的ID总数,并根据大小更改toIdfromId。它是高度可定制的。

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

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

使用officeName创建客户端列表可以在上一步中完成,并在作业上下文中设置为可在整个作业中访问。如果gridSize需要与spring批处理创建的线程数相同,则可以在创建客户列表的同时计算它并以相同的方式设置它。