Как настроить active_job и спасти планировщик?
Я пытаюсь создать фоновые задания для уведомлений по электронной почте и скребка. Я использую Resque-планировщик (4.0.0), Resque (1.25.2) и рельсы 4.2.1.
Мой файл config.ru:
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
require 'resque/server'
run Rack::URLMap.new "/" => AppName::Application, "/resque" => Resque::Server.new
Мой /lib/tasks/resque.rake:
require 'resque/tasks'
require 'resque/scheduler/tasks'
namespace :resque do
task :setup do
require 'resque'
require 'resque-scheduler'
Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml")
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }
end
end
Мой /config/resque_scheduler.yml:
CheckFsUpdatesJob:
queue: fs_updates
every:
- '1h'
- :first_in: '10s'
class: CheckFsUpdatesJob
args:
description: scrape page
Мой /config/initializer/active_job.rb
ActiveJob::Base.queue_adapter = :resque
Мой /config/initializer/resque.rb:
#config/initializers/resque.rb
require 'resque-scheduler'
require 'resque/scheduler/server'
uri = URI.parse("redis://localhost:6379/")
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }
Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml'))
Resque::Server.use(Rack::Auth::Basic) do |user, password|
user = 'admin'
password = 'admin'
end
Моя первая работа для уведомлений по электронной почте:
class EmailNotificationJob < ActiveJob::Base
queue_as :email_notifications
def perform(episode_id, email)
NotificationMailer.new_record_appears(record_id, email).deliver_now
end
end
Моя вторая работа по расписанию:
class CheckFsUpdatesJob < ActiveJob::Base
queue_as :fs_updates
def perform()
FsStrategy.new.check_for_updates
end
end
Так что мне нужно на работу: 1. Уведомления по электронной почте - должен отправлять электронную почту, когда появляется новая запись в БД 2. Очистить страницу - должен работать каждый час
Как я запускаю это:
redis-server
rake environment resque:work QUEUE=fs_updates
rake environment resque:work QUEUE=email_notifications
rake environment resque:scheduler
rails s
После запуска этих команд я вижу в Resque Dashboard двух рабочих и две очереди, как и ожидалось.
Но!
После нажатия кнопки "Очередь сейчас" на вкладке "Расписание" я вижу, что задача была создана и помещена в очередь "fs_updates". Но он не работает и через несколько секунд исчезает.
Когда я запускаю задание на отправку писем с консоли rails - оно вообще не работает.
Пожалуйста, помогите мне исправить мои настройки. Спасибо
2 ответа
Как я понял: разработчики rails и active_job не несут ответственности за плагины ресков. Возможно, эта проблема будет исправлена в новых версиях gem, но теперь она не работает (active_job не работает нормально с resque-scheduler).
В настоящее время я использую gem 'active_scheduler'
исправить текущую проблему.
У меня возникла та же проблема, когда я пытался настроить Sucker Punch на рельсах. 4.2.1 В итоге я переместил свою собственную логику инициализатора в application.rb, не очень хорошо, но он заставил меня работать.
Не уверен, что есть проблема с инициализаторами в этом выпуске. Попробуйте переместить свой код из active_job.rb и resque.rb в application.rb или соответствующий файл среды. Очевидно, что это не долгосрочное решение, но оно по крайней мере поможет вам определить, является ли это проблемой инициализатора или проблемой конфигурации Resque.