Как настроить 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.

Другие вопросы по тегам