【问题标题】:ruby on rails: delayed_job does not execute function from moduleruby on rails:delayed_job 不执行模块中的函数
【发布时间】:2011-09-30 20:18:02
【问题描述】:

我想使用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),两者都不会静默执行(没有延迟作业代码工作)

【问题讨论】:

    标签: ruby-on-rails delayed-job


    【解决方案1】:

    我自己也无法尝试使用内置延迟方法。我在自己的编码中确定的模式是自己将 DelayedJobs 加入队列,为它们提供一个有效负载对象以供其工作。这也应该对你有用,而且似乎也很有意义。 (这样,您甚至可能不需要 SiteRequest 模块。)

    class MyModuleName < Struct.new(:query)
    
      def perform
         # TODO
      end
    
    end
    

    然后,保存后不要调用get_data(query),而是使用:

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

    【讨论】:

      【解决方案2】:

      我发现了同样的问题。我的环境是:

      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
      

      结束

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-26
        • 2015-02-22
        • 2023-03-07
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多