【问题标题】:NoMethodError with delayed_job (collectiveidea gem)延迟作业的 NoMethodError (collectiveidea gem)
【发布时间】:2012-01-25 23:54:03
【问题描述】:

更新:有一个针对这个问题的补丁:https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798

更新 2:对于在 Heroku 上遇到此问题的任何人,我发现降级到 Rake 0.8.7 并使用延迟作业版本 2.1.4 有效,而延迟作业 v3 无效(尽管使用补丁它确实适用于本地)。这是在 Bamboo-mri-1.9.2 堆栈上。

我正在尝试在本地的 rails 3.1.0 应用程序上实现延迟作业。我运行了迁移和 安装 gem 文件:

gem 'delayed_job'
gem 'delayed_job_active_record'

遵循collectiveidea github (https://github.com/collectiveidea/delayed_job) 上的文档。我正在从我的控制器进行延迟调用,如下所示:

EventMailer.delay.event_message_email(current_user, @event_message)

这会导致将任务添加到作业表中,但是当我运行 rake jobs:work 时,它会记录以下错误:

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts

我查看了其他有关 SO 的延迟作业 NoMethod 错误问题,但没有一个解决此特定错误或提供解决方案。集体想法页面提到,这种没有传递方法调用的格式是对 Rails 3 邮件程序设置方式的一种破解,所以我想知道这个文档是否可能有些过时,以及是否有一种新的方法来调用邮件程序方法?

更新:在没有延迟的情况下调用 mailer 方法也可以正常工作,并且我在默认的 rails 服务器上运行它,因此集体想法常见问题解答中提到的 Thin 问题不适用。谢谢

【问题讨论】:

  • 您上次重新启动rake jobs:work 任务是什么时候?每次更改代码后都需要重新启动。
  • EventMailer.event_message_email(current_user, @event_message).delay.deliver 工作吗?
  • @iWasRobbed:是的,我试过了
  • @Unixmonkey 不,这不起作用,实际上它给出了一个有用的错误,指出应该在方法调用之前放置延迟

标签: ruby-on-rails delayed-job


【解决方案1】:

在 Rails 3 中使用 Mailer.delay.send_method 似乎有问题(他们在文档中提到这是一个 hack)。我有相同的 NoMethodError 并通过使用文档中显示的创建作业的替代方法来解决它,即使用 perform 方法创建一个新的 Job 类,例如

class UserMailerJob < Struct.new(:text, :email)
  def perform
    UserMailer.your_mailer_method(text, email).deliver
  end
end

然后在我的控制器中创建作业:

Delayed::Job.enqueue UserMailerJob.new(@text, @email)

这样做比使用延迟稍长一些,但它似乎可以正确创建作业并可靠地处理它们。

【讨论】:

    【解决方案2】:

    我通过切换到delayed_job (DJ) 2.1.2 版解决了这个问题。

    我正在使用: 转速 ruby 1.8.7 (2010-01-10 补丁级别 249) 轨道 3.0.9

    宝石文件: gem "delayed_job", '2.1.2'

    在此之前我尝试使用最新版本的delayed_job: gem "delayed_job", :git => 'git://github.com/collectiveidea/delayed_job.git' 对我来说是 v3.0.0.pre

    但是: rails 生成延迟作业 没有生成迁移文件。我手动创建了它。然后在“rake db:migrate”之后,我得到了用于存储延迟作业队列的表。然后,当我认为一切都必须正常工作时,我遇到了同样的错误。

    当我试图找到这个错误的来源时,在'delayed_jobs'表中我发现delayed_job的任务被错误地保存了。这是'delayed_jobs'表中字段'handler'的sn-p:

    --- !ruby/object:Delayed::PerformableMailer 
    object: !ruby/class Notifier
    

    据我所知,delayed_job 通过 Struct 类获取所有任务,因此应使用 '!ruby/struct' 标题而不是 '!ruby/object' 保存任务 这是正确保存任务的sn-p:

    --- !ruby/struct:Delayed::PerformableMailer 
    object: !ruby/class Notifier
    

    为了检查这一点,我在控制台中停止了 delaed_job 进程。然后我调用了一些方法将DJ的任务交给DB:

    Notifier.delay.some_email(current_user, @event_message)
    

    然后我在 'handler' 字段中手动将 '!ruby/object' 替换为 '!ruby/struct'。 然后我开始 DJ 'rake jobs:work',它告诉我邮件已成功发送。

    但是: - 此任务未从 DJ 表中删除 - 邮件无法到达收件人

    所以我认为这是新版本的delayed_job 中的一个错误。我切换到 DJ '2.1.2',效果很好。

    P.S.:对不起我的英语:)

    【讨论】:

    • 嗨,感谢您的详细评估,点赞。我对表格字段进行了更改,它也清除了工作,所以看起来你是正确的。我在 github 上将此作为问题打开,并将其添加为参考。我还没有尝试降级到 2.1.2,因为我也在尝试其他一些事情,我担心这不会解决与 rails 3 邮件相关的问题。
    • 顺便说一下,如果你想关注它,问题在github.com/collectiveidea/delayed_job/issues/323
    • Sukhoviy ,您好,尝试按照您的路线进行操作,但发现捆绑程序不允许使用 3.0.0.pre 之前的延迟作业版本安装延迟作业活动记录。尝试使用没有延迟作业活动记录的延迟作业 2.1.2 似乎也不起作用。你能解决这个问题吗?还是我应该放弃它并使用 resque :)?
    • Sukhoviy,哎呀没关系 2.1.2 没有延迟作业活动记录也可以正常工作,只是忘记更新 gem 文件
    【解决方案3】:

    只是一个简短的说明。我遇到了这个问题,这是因为我将模型中的变量传递到交付方法 BEFORE_SAVE 中。切换到 AFTER_CREATE 为我解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2011-10-22
      • 1970-01-01
      • 2011-05-24
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2015-10-02
      相关资源
      最近更新 更多