我想创建一个工作流程,在这个工作流程中,Sidekiq工作人员会产生一个批处理作业,在该作业中将再次出现一个要生成和完成的工作者列表,并且只有在这些子工作者完全执行之后,我才想运行父批次的回调(on_complete)。
基本上,我想实现这个工作流程
中研究了sidekiq批次但是,上述两个资源都提到了一个工作流程,该工作流程要求首先完成Job的步骤,然后使用Sidekiq批次继续执行另一个步骤。
根据我的要求,我不想在每个批处理作业中创建批处理,然后在完成所有子批处理后,在主批处理的回调中做一些工作。
请看下面的片段,我尽力让它尽可能清晰。如果需要其他信息,请进行评论。感谢。
Class TeamWorker
def perform
Team.all.each do |team.id|
ParentWorker.perform_async(team.id)
end
end
end
Class ParentWorker
def perform(team_id)
assets_batch = Sidekiq::Batch.new
assets_batch.on(:complete, 'ParentWorker#FinalCallback', {:team_id => team_id})
assets_batch.jobs do
Team.find(team_id).assets.each do |asset|
AnotherWorker.perform_async(asset.id)
end
end
def FinalCallback(status, options)
#This should run last after all child jobs workers completes
end
end
class AnotherWorker
def perform(asset_id)
child_batch = Sidekiq::Batch.new
child_batch.on(:complete, 'do_something', {asset_id: asset_id})
child_batch.jobs do
ChildJobWorker.perform_async
ChildJobWorker.perform_async
end
end
end
class ChildJobWorker
def perform
#do some processing/work and return
end
end
答案 0 :(得分:1)
问题是您没有将子批次与父批次关联。您需要重新打开批处理以添加作业和/或子批处理。你需要这样做:
class AnotherWorker
def perform(asset_id)
batch.jobs do # reopen this job's batch, now child_batch will really be a child batch
child_batch = Sidekiq::Batch.new
child_batch.on(:complete, 'do_something', {asset_id: asset_id})
child_batch.jobs do
ChildJobWorker.perform_async
ChildJobWorker.perform_async
end
end
end
end