根据下面Spring Batch Doc的图像,主步骤被划分为六个从属步骤,这些步骤是主要的相同副本。
我的问题是,我可以将分区扩展到更多级别还是N级别?即所有六个奴隶都成为更多N奴隶的主人?
使用案例首先,我们根据主要标准对数据进行分区,然后我们根据该主要标准对其他一些标准进行进一步分区。
e.g。首先,我根据客户名称启动N个客户数据的奴隶,然后为每个客户名称,进一步根据办公地点分区数据。
这可以完成还是不支持?
编辑:根据我的编码实验,由于StepExecutionContext
问题,它看起来并不可行。 See this和this。我们无法在分区上下文中将StepExecutionContext
从Step
传递到另一个%
。
答案 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总数,并根据大小更改toId
和fromId
。它是高度可定制的。
对于你的情况,这就像你必须处理两个参数(这里只是id),它们不是数字。假设您只有clientName
,如果您为分区程序提供这些客户名称的列表(或数组),您只需要为每个ExecutionContext
生成一个clientName
并将其设置为。如果您有两个参数,则可以使用更复杂的结构,例如List
Client
类(当然,每个Client
都有一个clientName
参数和一个字符串officeLocations
)列表。现在,您将按ExecutionContext
每clientName
创建一个officeLocation
。每个读者都会从其ExecutionContext中获取clientName
和officeLocation
来选择它们。
例如,如果您有3个客户端,每个客户端有2个位置,那么最终会有6个ExecutionContext(以及6个从属/线程)。然后,在Reader
上,您只需从ExecutionContext
中检索clientName和officeName,然后使用它们来选择您的实体(来自数据库或其他)。
使用officeName创建客户端列表可以在上一步中完成,并在作业上下文中设置为可在整个作业中访问。如果gridSize需要与spring批处理创建的线程数相同,则可以在创建客户列表的同时计算它并以相同的方式设置它。