Ruby on Rails:Delayed_Job无法执行模块中的函数

5

我希望使用delayed_job来执行控制器中的一个函数。该函数存储在lib/site_request.rb模块中:

module SiteRequest

  def get_data(query)
     ...
  end
  handle_asynchronously :get_data

end

query_controller.rb:

class QueryController < ApplicationController

  include SiteRequest

  def index
    @query = Query.find_or_initialize_by_word(params[:query])
    if @query.new_record?
      @query.save
      get_data(@query)
      flash[:notice] = "Request for data is sent to server."
    end
  end

end

我还尝试从模块中删除handle_asynchronously子句,并使用delay.get_data(@query),但两者都不会静默执行(没有延迟作业代码时工作)

2个回答

1
我自己尝试使用内置的延迟方法时也遇到了问题。在我的编码中,我采用了一种模式,即自己排队DelayedJobs,并为它们提供一个有效载荷对象来工作。这种方式对您也适用,甚至似乎更有意义。(这样,您甚至可能不需要您的SiteRequest模块,例如。)
class MyModuleName < Struct.new(:query)

  def perform
     # TODO
  end

end

然后,在保存后,不要调用get_data(query),而是使用以下方法进行排队:

Delayed::Job.enqueue(MyModuleName.new(query))

0

我遇到了同样的问题。我的环境是:

  1. Ruby 2.1.7
  2. Rails 4.2.6
  3. activejob (4.2.6)
  4. delayed_job (4.1.2)
  5. delayed_job_active_record (4.1.1) 我的解决方案: 将模块转换为类。 从该类实例化一个对象,并对实例应用该方法。 似乎ActiveJob只能将实例加入队列。 在你的情况下:
Class SiteRequest
  def initialize
  end
  def get_data(query)
     ...
  end
  handle_asynchronously :get_data
end
def index
  ...

  q= SiteRequest.new
  q.get_data(@query)
  flash[:notice] = "Request for data is sent to server."
end

结束


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