tks*_*tks 11 ruby-on-rails delayed-job
更新:这个问题有一个补丁: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 app上实现delayed_job.我运行了迁移并安装了gem文件:
gem 'delayed_job'
gem 'delayed_job_active_record'
Run Code Online (Sandbox Code Playgroud)
关于collectiveidea github上的文档(https://github.com/collectiveidea/delayed_job).我正在从我的控制器拨打延迟电话,如下所示:
EventMailer.delay.event_message_email(current_user, @event_message)
Run Code Online (Sandbox Code Playgroud)
这会导致将任务添加到作业表中,但是当我运行rake作业时:工作它会记录以下错误:
Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts
Run Code Online (Sandbox Code Playgroud)
我已经查看了SO上的其他delayed_job NoMethod错误问题,但没有解决此特定错误或提供解决方案.collectiveidea页面提到没有传递方法调用的这种格式是如何设置Rails 3邮件的黑客攻击,所以我想知道这个文档是否可能有些过时,如果有新的方法来调用邮件程序方法?
更新:也毫不拖延地调用邮件程序方法工作正常,我在默认的rails服务器上运行它,因此在collectiveidea faq中提到的Thin问题不适用.谢谢
小智 7
在Rails 3中使用Mailer.delay.send_method似乎有些错误(他们提到它是文档中的黑客).我有相同的NoMethodError并通过使用替代方法来创建文档中显示的作业来解决它,即使用perform方法创建一个新的Job类,例如
class UserMailerJob < Struct.new(:text, :email)
def perform
UserMailer.your_mailer_method(text, email).deliver
end
end
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中创建作业:
Delayed::Job.enqueue UserMailerJob.new(@text, @email)
Run Code Online (Sandbox Code Playgroud)
这比使用延迟稍微长一点,但它似乎正确地创建了作业并可靠地处理它们.
小智 4
我通过切换到delayed_job (DJ) 版本2.1.2 解决了这个问题。
我正在使用:rvm ruby 1.8.7(2010-01-10补丁级别249)rails 3.0.9
Gemfile: gem "delayed_job", '2.1.2'
在此之前,我尝试使用最新版本的delayed_job: gem "delayed_job", :git => 'git://github.com/collectiveidea/delayed_job.git' 对我来说它是v3.0.0.pre
但是:rails生成delayed_job没有生成迁移文件。我手动创建的。然后在“rake db:migrate”之后,我得到了用于存储delayed_job队列的表。然后,当我认为一切都必须正确工作时,我遇到了同样的错误。
当我试图找到此错误的根源时,在“delayed_jobs”表中,我发现delayed_job的任务保存不正确。以下是“delayed_jobs”表中“handler”字段的片段:
--- !ruby/object:Delayed::PerformableMailer
object: !ruby/class Notifier
Run Code Online (Sandbox Code Playgroud)
据我所知,delayed_job 通过 Struct 类获取所有任务,因此任务应该使用 '!ruby/struct' 标头保存,而不是 '!ruby/object' 以下是正确保存任务的片段:
--- !ruby/struct:Delayed::PerformableMailer
object: !ruby/class Notifier
Run Code Online (Sandbox Code Playgroud)
为了检查这一点,我在控制台中停止了 delaed_job 进程。然后我调用了一些方法将 DJ 的任务交给 DB:
Notifier.delay.some_email(current_user, @event_message)
Run Code Online (Sandbox Code Playgroud)
然后我在“handler”字段中手动将“!ruby/object”替换为“!ruby/struct”。然后我启动 DJ 'rake jobs:work',它告诉我邮件已成功发送。
但是: - 此任务并未从 DJ 的表中删除 - 并且邮件未到达收件人手中
所以我认为这是新版本delayed_job中的一个错误。我切换到 DJ '2.1.2',它对我来说效果很好。
PS:抱歉我的英语:)
| 归档时间: |
|
| 查看次数: |
2978 次 |
| 最近记录: |