加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Sidekiq:确保队列中的所有作业都是唯一的

发布时间:2020-12-16 22:00:08 所属栏目:百科 来源:网络整理
导读:我有一些更新触发器将作业推送到Sidekiq队列.所以在某些情况下,可以有多个作业来处理同一个对象. 有几个独特的插件(“Middleware”,Unique Jobs),它们没有多少记录,但它们似乎更像是调节器来防止重复处理;我想要的是阻止重复创建相同作业的扼流器.这样,一个
我有一些更新触发器将作业推送到Sidekiq队列.所以在某些情况下,可以有多个作业来处理同一个对象.

有几个独特的插件(“Middleware”,Unique Jobs),它们没有多少记录,但它们似乎更像是调节器来防止重复处理;我想要的是阻止重复创建相同作业的扼流器.这样,一个对象将始终处于最新鲜的状态.是否有插件或技术?

更新:我没有时间做一个中间件,但我最终得到一个相关的清理功能,以确保队列是唯一的:https://gist.github.com/mahemoff/bf419c568c525f0af903

解决方法

我的建议是根据一些选择条件搜索以前的计划作业,然后再安排一个新的作业.当我想要一个特定的对象的一个??预定的作业,和/或其中一个方法,这对我来说是有用的.

在这种情况下的一些示例方法:

find_jobs_for_object_by_method(klass,method)

  jobs = Sidekiq::ScheduledSet.new

  jobs.select { |job|
    job.klass == 'Sidekiq::Extensions::DelayedClass' &&
        ((job_klass,job_method,args) = YAML.load(job.args[0])) &&
        job_klass == klass &&
        job_method == method
  }

end

##
# delete job(s) specific to a particular class,method,particular record
# will only remove djs on an object for that method
#
def self.delete_jobs_for_object_by_method(klass,id)

  jobs = Sidekiq::ScheduledSet.new
  jobs.select do |job|
    job.klass == 'Sidekiq::Extensions::DelayedClass' &&
        ((job_klass,args) = YAML.load(job.args[0])) &&
        job_klass == klass &&
        job_method == method  &&
        args[0] == id
  end.map(&:delete)

end

##
# delete job(s) specific to a particular class and particular record
# will remove any djs on that Object
#
def self.delete_jobs_for_object(klass,args) = YAML.load(job.args[0])) &&
        job_klass == klass &&
        args[0] == id
  end.map(&:delete)

end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读