【问题标题】:Prevent duplicate ActiveJob being scheduled防止计划重复的 ActiveJob
【发布时间】:2015-11-27 21:43:24
【问题描述】:

我有一个 Rails 应用程序,它查询外部 Web 服务以更新记录。 我想继续轮询 Web 服务,直到用户会话过期。

目前我在显示操作中为我要更新的记录创建了一个 ActiveJob。

在 ActiveJob 中我重新安排它使用

  self.class.set(wait: 60.seconds).perform_later(record_id)

问题在于,如果用户再次进入 show 操作,它将创建另一个 ActiveJob。

是否有防止创建重复作业的方法?

【问题讨论】:

  • 您使用哪个 ActiveJob 后端?

标签: ruby-on-rails rails-activejob


【解决方案1】:

理想情况下,应该有一种方法可以搜索 ActiveJobs 以查看是否已经存在。类似ActiveJob.find_by(job: JobType, params: record_id)。这将允许您在创建副本之前操作作业。我将进一步挖掘,看看是否可以创建......

【讨论】:

  • 你找到什么了吗? ?
  • @StefanJCollier 不,我认为 Rails 的观点是,如果你这样做,那么你做错了什么。 ?
【解决方案2】:

当用户第一次访问节目时,首先设置一个cookie值。

self.class.set(wait: 60.seconds).perform_later(record_id) if cookies[:_aj].nil?
cookies[:_aj] = true

还可以在您的Record 中创建一个列,可以将其命名为pending_update,并在您安排作业运行时将其设置为true,并在计划作业结束时将其设置为false。这样,即使用户清除了 cookie,您的程序也不会创建重复的作业。

【讨论】:

  • 设置 cookie 并不能解决问题,因为有多个用户可以访问 #show 操作。
  • 是的,但我猜每个都有不同的记录要更新。
【解决方案3】:

activejob-uniqueness gem 旨在消除重复作业。该 gem 仍然相对较新,但它是由一家工程公司 (Veeqo) 赞助的,并且似乎得到了很好的支持。另见:https://devs.veeqo.com/job-uniqueness-for-activejob/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2012-09-24
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多