1

我正在使用delayed_job 中的代码示例发送时事通讯:

class NewsletterJob < Struct.new(:subscribers)
  def perform
    subscribers.each { |subscriber| NewsletterMailer.newsletter(subscriber.id) }
  end
end

然后我在这里设置工作:

Delayed::Job.enqueue NewsletterJob.new(Subscriber.find(:all))

如果我不使用延迟工作,邮件就会被发送,所以它可以工作。如果我直接使用延迟作业,邮件将按如下方式发送:

NewsletterMailer.delay.newsletter(subscriber)

在数据库的作业表中,以下是 yaml:

--- !ruby/struct:NewsletterJob
subscribers:
- !ruby/ActiveRecord:Subscriber
  attributes:
    id: '54'
    email: someemail@gmail.com
    created_at: '2013-08-09 04:44:51.113258'
    updated_at: '2013-08-09 08:26:05.934564'
    token: quVI0dhxyyentB7TJ1IO6w
- !ruby/ActiveRecord:Subscriber
  attributes:
    id: '56'
    email: another@gmail.com
    created_at: '2013-08-11 09:29:22.000829'
    updated_at: '2013-08-11 09:29:22.000829'
    token: a-n-yijwi38_HvGFSmetmA

我使用 MockSMTP 在本地机器上接收电子邮件。

出于某种原因,即使作品似乎正在处理工作,电子邮件也没有被发送。

yaml有什么问题吗?

任何帮助表示赞赏我是 NOOB

4

2 回答 2

2

当您delayed在邮件方法前面进行链接时,您不需要调用deliver它。Delayed::Job 会为您处理这些问题。

NewsletterMailer.delay.newsletter(subscriber) # No need to call `deliver` here

但是当您从自己的自定义作业结构中调用它时,您需要记住调用邮件程序的deliver方法:

subscribers.each do |subscriber|
  NewsletterMailer.newsletter(subscriber.id).deliver # You need `deliver` here
end
于 2013-08-11T17:36:14.913 回答
0

最后,我需要使用驼峰式命名作业类并将其放在 lib 目录中。

#lib
NewsletterJob.rb

然后在#application.rb 中,我必须关闭失败作业的自动删除以查看发生了什么,并从库中预加载文件

Delayed::Worker.destroy_failed_jobs = false
require "#{Rails.root.to_s}/lib/NewsletterJob.rb"

这一切都基于这里的答案 Delayed_job 不执行执行方法而是清空作业队列

于 2013-08-12T05:02:21.720 回答