如何在Rails 4.2中的Active Job内访问Delayed Job实例

4

我正在使用后台的delayed_job (4.0.6)和ActiveJob,我想找到一个已经计划好的任务并将其删除。

例如,如果我有以下代码:

class MyClass

  def my_method
    perform_stuff
    MyJob.set(wait: 1.month.from_now).perform_later(current_user)
  end
end

然后,如果我编辑了MyClass实例并再次调用my_method,我希望取消该作业并安排一个新的作业。
如在此帖子中建议的http://www.sitepoint.com/delayed-jobs-best-practices,我向Delayed Job表添加了两个列。
table.integer :delayed_reference_id
table.string  :delayed_reference_type

add_index :delayed_jobs, [:delayed_reference_id],   :name => 'delayed_jobs_delayed_reference_id'
add_index :delayed_jobs, [:delayed_reference_type], :name => 'delayed_jobs_delayed_reference_type'

我希望通过这种方式找到一个延迟的任务并将其删除。但是我想在ActiveJob类中执行此操作,以保持项目中作业模式的一致性。

我想做这样的事情:

class MyJob < ActiveJob::Base

  after_enqueue do |job|
    user = self.arguments.first
    job.delayed_reference_id = user.id,
    job.delayed_reference_type = "User" 
  end

  def perform(user)
    delete_previous_job_if_exists(user_id)
  end

  def delete_previous_job_if_exists(user_id)
    Delayed::Job.find_by(delayed_reference_id: 1, delayed_reference_type: 'User').delete
  end
end

但是那并不起作用。 有人遇到过这种问题吗?

你能找到解决方案吗?我也遇到了同样的问题。 - pthamm
2个回答

2

两个更改: 1. 更新了after_enqueue回调,以便您可以直接更新delayed_jobs表 2. 修复了一个错别字,其中delayed_reference_id被硬编码为1

这应该可以工作:

class MyJob < ActiveJob::Base

  after_enqueue do |job|
    user = self.arguments.first
    delayed_job = Delayed::Job.find(job.provider_job_id)
    delayed_job.update(delayed_reference_id:user.id,delayed_reference_type:'User')
 end

  def perform(user)
    delete_previous_job_if_exists(user.id)
  end

  def delete_previous_job_if_exists(user_id)
    Delayed::Job.find_by(delayed_reference_id: user_id, delayed_reference_type: 'User').delete
  end
end

0
如果你想在初始化程序中从工作器中访问Delayed::Job,你可以对JobWrapper类进行猴子补丁。
module ActiveJob
  module QueueAdapters
    class DelayedJobAdapter
      class JobWrapper
        def perform(job)
        end
      end
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接