2013-12-22 63 views
1

我正在使用delayed_job_active_record宝石。我想延迟对外部API的请求。即使我的作业被添加到数据库中,并且rake jobs:work将其运行并将其从数据库中删除,但从我的messages_controller.rb实际延迟的代码永远不会执行。delayed_job_active_record不会执行延迟代码

如果我如果从控制器方法中删除.delay,则代码按预期执行,我的测试全部通过。

# messages_controller.rb 
require 'zendesk' 

class MessagesController < ApplicationController 
    layout "application" 

    # /suport/contact-us 
    def contact_us 
    zendesk = MyApp::Zendesk.new 
    zendesk.delay.create_support_ticket(params[:message]) 

    # render page 
    respond_to do |format| 
     flash[:notice] = "Email sent successfully!" if @sent 
     format.html { render "pages/support/contact-us" } 
    end 
    end 
end 

# zendesk.rb 
require 'zendesk_api' 

module MyApp 
    class Zendesk 
    attr_accessor :client 

    def initialize(*args) 
     @client = create_client 
    end 

    # contact-us ticket methods 
    def create_support_ticket(params={}) 
     unless params.blank? || @client.blank? 
     # get or create user_id for submitter 
     params[:requester_id] = check_user_exists(params) 

     begin 
      ticket = @client.tickets.create(
      subject: "Support Ticket", 
      comment: { value: params[:message] }, 
      submitter_id: params[:requester_id], 
      requester_id: params[:requester_id], 
      assignee_id: 201578811, 
      status: "new", 
      fields: [ 
       {id: 20887016, value: "Support"}, 
       {id: 20966436, value: "New"}]) 
      return ticket 
     rescue => e 
      Airbrake.notify e 
     end 
     else 
     return false 
     end 
    end 
    end 
end 

* UPDATE * 我试图启动我的Rails服务器没有工人运行,并通过Delayed::Job.last.invoke_job手动调用作业时,我看到这个错误:

Delayed::DeserializationError: Job failed to load: undefined class/module MyApp::. Handler: "--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/object:MyApp::Zendesk\n client: !ruby/object:ZendeskAPI::Client\n config: !ruby/object:ZendeskAPI::Configuration\n  client_options: {}\n  cache: !ruby/object:ZendeskAPI::LRUCache\n  size: 1000\n  store: {}\n  lru: []\n  url: https://REDACTED/api/v2\n  username: REDACTED\n  password: REDACTED  retry: true\n  logger: !ruby/object:Logger\n  progname: \n  level: 0\n  default_formatter: !ruby/object:Logger::Formatter\n   datetime_format: \n  formatter: \n  logdev: !ruby/object:Logger::LogDevice\n   shift_size: \n   shift_age: \n   filename: \n   dev: !ruby/object:IO {}\n   mutex: !ruby/object:Logger::LogDevice::LogDeviceMutex\n   mon_owner: \n   mon_count: 0\n   mon_mutex: !ruby/object:Mutex {}\n callbacks:\n - !ruby/object:Proc {}\n resource_cache: {}\nmethod_name: :create_support_ticket\nargs:\n- !ruby/hash:ActionController::Parameters\n name: ben\n email: [email protected]\n reason: General\n message: test\n" 
     from /vendor/bundler/gems/delayed_job-4.0.0/lib/delayed/backend/base.rb:97:in `rescue in payload_object' 

我尝试添加require 'zendesk'到一个config/initializers/custom.rb,但错误仍然存​​在。

回答

1

我想你的create_client方法正在实例化Api对象。由于延迟作业运行的过程是异步的,因此很可能Api实例无效。

也就是说,你应该在create_support_ticket中创建一个新的Zendesk Api实例。 如

def create_support_ticket(params={}) 
    @client = create_client 
    unless params.blank? || @client.blank? 
    ... 
end 
+0

我发布了一个更新的问题,但我认为你是正确的,这也会是一个问题。 – professormeowingtons

+0

'模块MyApp'驻留在单独的.rb文件中吗?如果没有,你应该在/lib/my_app.rb中创建它,并且需要lib在application.rb – swapab

+0

是的,'module MyApp'在'/ lib/my_app.rb'中,'lib'已经用'config自动加载.autoload_paths + =%W(#{config.root}/lib)'in'application.rb' – professormeowingtons