(我应该询问更多细节,所以我的答案可能不必要地长,具体取决于您对 spring-batch 分区的理解。如果我需要使用分区,我将保留此线程)。
你总是可以从你的从属线程中生成你自己的线程,并为它们提供所需的参数,但这将完全破坏使用像 spring-batch 这样的框架的全部意义。
这不是解决您问题的直接方法:奴隶不会在这里产生其他奴隶。事实上,我认为他们不应该/可以。但是Partitionner
您将通过在其 ExecutionContext 中为每个从属设备提供自己的参数(clientName 和 officeLocation)来模拟此行为,因此它们将读取/处理/写入自己的部分。
如果你不明白:
我以此为例:https://www.mkyong.com/spring-batch/spring-batch-partitioning-example/ 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
to toId
,所以每个选择都有它自己的部分)。如果他愿意,他可以做一些更动态的事情:在Partitionner
并改变toId
and fromId
取决于尺寸。它是高度可定制的。
对于你的情况,就像你必须处理两个参数(这里只是 id),而且它们不是数字。假设你只有clientName
,如果您为分区程序提供这些客户端名称的列表(或数组),则只需生成一个ExecutionContext
per clientName
并设置它。如果你有两个参数,你可以使用更复杂的结构,比如List
of Client
类(当然,每个Client
have a clientName
参数和 String 列表officeLocations
)。现在,您将创建一个ExecutionContext
per clientName
per officeLocation
每个读者都会从它的ExecutionContext中得到什么clientName
and officeLocation
选择它们。
例如,如果您有 3 个客户端,每个客户端有 2 个位置,那么您最终将得到 6 个 ExecutionContext(因此,6 个从属/线程)。然后,在你的Reader
您只需从以下位置检索 clientName 和 officeNameExecutionContext
并使用它们来选择您的实体(来自数据库或其他)。
创建具有 OfficeName 的客户列表可以在上一步中完成,并在工作上下文中设置为可在整个工作中访问。如果 gridSize 需要与 Spring Batch 创建的线程数相同,您可以在创建客户端列表的同时计算它并以相同的方式设置它。