delayed_job не изпраща имейли, но обработва задание

Използвам примерния код от 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: [email protected]
    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: [email protected]
    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


person chell    schedule 11.08.2013    source източник
comment
Каква настройка за поща имате локално?   -  person Matthias    schedule 12.08.2013


Отговори (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
person Chris Peters    schedule 11.08.2013
comment
Промених кода, за да направя както ме посъветвахте, но той все още не изпраща имейла. Задачата изглежда обработена, тъй като се изважда от таблицата със задачи след няколко секунди. Въпреки това не се изпраща имейл - person chell; 12.08.2013
comment
Рестартирахте ли вашия Rails сървър/фонов процес, преди да опитате отново? Delayed::Job ще кешира вашия код, докато не рестартирате. - person Chris Peters; 12.08.2013

В крайна сметка се оказа, че трябваше да наименувам класа работа с помощта на камилски случай и да го поставя в директорията lib.

#lib
NewsletterJob.rb

След това в #application.rb трябваше да изключа автоматичното изтриване на неуспешни задания, за да видя какво се случва и също така да заредя предварително файла от lib

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

Всичко се основава на отговора тук Delayed_job не изпълнява метода за изпълнение, но изпразва опашката със задачи

person chell    schedule 12.08.2013
comment
Запазвам задачите си в lib/jobs и поставям този ред в config/initializers/delayed_job.rb, за да изисквам всички файлове от тази директория: Dir[Rails.root.join("lib/jobs/**/*.rb")].each { |f| require f }. Само едно предложение! - person Chris Peters; 16.08.2013