Sidekiq父批处理,等到子批处理完所有作业

时间:2018-04-11 08:36:49

标签: ruby-on-rails sidekiq

我想创建一个工作流程,在这个工作流程中,Sidekiq工作人员会产生一个批处理作业,在该作业中将再次出现一个要生成和完成的工作者列表,并且只有在这些子工作者完全执行之后,我才想运行父批次的回调(on_complete)。

基本上,我想实现这个工作流程

所以,我从文档herehere

中研究了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

1 个答案:

答案 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