代码之家  ›  专栏  ›  技术社区  ›  calyxofheld

在Rails中取消计划的Sidekiq作业

  •  4
  • calyxofheld  · 技术社区  · 7 年前

    我的应用程序中的某些Sidekiq作业计划将资源状态更改为 cancelled 除非用户在某个时间段内做出响应。有一个 lot of information about 如何最好地完成这项任务,但没有一项实际上取消了任务。

    要取消作业,wiki中的代码会显示:

    class MyWorker
     include Sidekiq::Worker
    
     def perform(thing_id)
      return if cancelled?
      thing = Thing.find thing_id
      thing.renege!
     end
    
     def cancelled?
      Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
     end
    
     def self.cancel!(jid)
      Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
     end
    end
    

    然而 here 有人建议我做一些像

     def perform(thing_id)
      thing = Thing.find thing_id
      while !cancel?(thing)
       thing.ignore!
      end
     end
    
     def cancel?(thing_id)
      thing = Thing.find thing_id
      thing.matched? || thing.passed?
     end
    

    wiki上的这段代码和类似代码让人困惑的是,它们都没有真正取消工作。上面的示例只对 thing 如果 cancelled? 收益率 false (应该如此),但如果它在将来返回真值,则不会取消。它只是失败了,出现了一条aasm转换错误消息,并被发送到retryset。打电话 MyWorker.cancel! jid 在模型代码中引发未定义的变量错误。如何访问模型中的jid?实际上怎么可能 取消 删除 那个具体的工作?谢谢!

    3 回复  |  直到 7 年前
        1
  •  4
  •   Mike Perham    7 年前
    # The wiki code
    class MyWorker
     include Sidekiq::Worker
    
     def perform(thing_id)
      return if cancelled?
    
      # do actual work
     end
    
     def cancelled?
      Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
     end
    
     def self.cancel!(jid)
      Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
     end
    end
    
    # create job
    jid = MyWorker.perform_async("foo")
    
    # cancel job
    MyWorker.cancel!(jid)
    
        2
  •  0
  •   Rubin bhandari    7 年前

    你可以这样做,但不会有效率。这是一个线性扫描,用于查找jid安排的作业。

    需要“sidekiq/api” sidekiq::scheduledset.new.find_job(jid).try(:delete) 或者,你的工作可以在运行时查看它是否仍然相关。

        3
  •  0
  •   calyxofheld    7 年前

    好吧,原来我已经回答了一个问题。我所包含的代码集之一是wiki中功能相似的代码版本。另一个问题的解决方案(“我如何访问模型中的jid?”)如果您对编程还不是很熟悉,那么这看起来很明显,但基本上是:将jid存储在数据库列中,然后在需要时检索/更新它!啊!

    推荐文章