gpt4 book ai didi

ruby-on-rails - 在 Rails 4.2 中检查作业是否已经入队

转载 作者:行者123 更新时间:2023-12-04 20:39:47 25 4
gpt4 key购买 nike

我使用 Rails 4.2 和 delay_job 4.0.6 作为我的 ActiveJob 后端。

我有一份工作,我只想在队列中允许一次。有问题的作业需要一分钟多的时间才能运行。它由模型上的回调排队。回调将比作业完成的频率高得多。作业在 future 不必多次排队。

这是我要完成的一些伪代码。

# app/jobs/refresh_account_cache_job.rb
class RefreshAccountCacheJob < ActiveJob::Base
def before_enqueue
skip if job_already_enqueued
end

def perform
Account.write_to_cache
end

def job_already_enqueued
# ?
end
end

如果作业的实例在再次调用时正在运行,则它仍应排队以备将来使用。我正在寻找一种方法让该作业排队等待 future 最多运行 1 次。

我认为答案必须特定于 delay_job,但如果它可以推广到 ActiveJob,那就更好了。

最佳答案

这可能不是完全合适的,但它应该让你指向正确的方向:

def self.up
create_table :delayed_jobs, :force => true do |table|
table.integer :priority, :default => 0, :null => false
table.integer :attempts, :default => 0, :null => false
table.text :handler, :null => false
table.text :last_error
table.datetime :run_at
table.datetime :locked_at
table.datetime :failed_at
table.string :locked_by
table.string :queue
table.timestamps
end

因此,您可以向该表添加一个状态列,然后运行这样的查询来获取作业并在执行任何其他操作之前检查其状态。
Delayed::Job.where(queue: '<YOUR QUEUE>').where(id: params[:id]).status
你会问,你会如何设置状态?好吧,在延迟作业中使用成功 Hook 。它看起来有点像这样:
def success(job)
update_status('success')
end

private

def update_status(status)
job = Job.find job_id
job.status = status
job.save!
end

希望这可以帮助!

关于ruby-on-rails - 在 Rails 4.2 中检查作业是否已经入队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28564785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com