【问题标题】:Sidekiq - Deleting scheduled jobs when task is deletedSidekiq - 删除任务时删除计划作业
【发布时间】:2014-09-27 06:14:47
【问题描述】:

当用户在创建操作中使用以下代码为特定日期创建任务时,我会安排提醒电子邮件:

if @post.save
  EmailWorker.perform_in(@time.minutes, @post.id)
end

我想在删除相关任务时删除已安排的提醒邮件。我尝试在before_destroy 上使用模型方法:

before_destroy :destroy_sidekiq_job

def destroy_sidekiq_job
  post_id = self.id
  queue = Sidekiq::Queue.new('critical')
  queue.each do |job|
    if job.klass == 'EmailWorker' && job.args.first == post_id
      job.delete
    end
  end
end

但是,作业不会从队列中删除。有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: ruby-on-rails sidekiq


    【解决方案1】:

    不要这样做。让 Sidekiq 执行作业,但验证帖子是否存在并且是当前电子邮件作业运行时

    def perform(post_id)
      post = Post.find_by_id(post_id)
      return unless post
    
      ...
    end
    

    【讨论】:

    • 这很好用。我将如何为 updated_at 添加检查?不知道如何获取更新的变量并比较它
    • 你的意思是像return if post.updated_at > some_date
    • 是的,但检查将是 post.updated_at == quene.updated_at。我将 updated_at 作为 arg 传入,redis 将其与帖子 ID 一起保存。
    【解决方案2】:

    预定的作业还没有在队列中,使用Sidekiq::ScheduledSet查找预定的作业:

    def destroy_sidekiq_jobs
      scheduled = Sidekiq::ScheduledSet.new
      scheduled.each do |job|
        if job.klass == 'EmailWorker' && job.args.first == id
          job.delete
        end
      end
    end
    

    【讨论】:

    • 你摇滚!非常感谢!
    • 只是一个简单的问题 - 为什么他们还没有在队列中?
    • 只有准备好运行的作业才在队列中。在此之前,它们位于 ScheduledSet 中并被调度程序移入队列。
    猜你喜欢
    • 2021-01-21
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2021-04-12
    相关资源
    最近更新 更多