Задать вопрос
@bmalets

Как правильно настроить active_job и resque в rails 4.2.1?

Здравствуйте!

Пробую создать две бекграунд джобы - одна для отправки email (будет запускаться как callback при изменении модели)
и парсер (который будет запускаться каждый час).
Проект на рельсах 4.2.1, также использую resque-scheduler (4.0.0), resque (1.25.2)

Мой 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:

CheckUpdatesJob:
  queue: parse_updates
  every:
    - '1h'
    - :first_in: '10s'  
  class: CheckUpdatesJob
  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 CheckUpdatesJob < ActiveJob::Base
  queue_as :parse_updates

  def perform()
    ParseStrategy.new.check_for_updates
  end
end


Как я это все запускаю:

1. redis-server
- редис работает
2. rake environment resque:work QUEUE=parse_updates
- воркер для парсинга работает
3.
rake environment resque:work QUEUE=email_notifications

- воркер для отправки почты работает
4. rake environment resque:scheduler
- шедулер работает работает
5. rails s
- ну и собственно рельсы

После запуска рельсов, в админке рескью видно два воркера, две очереди, вкладка Schedule тоже видна.
Но после нажатия 'queue now' на вкладке Schedule, видно что таска появяется в очереди, но она так и не обрабатывается - как буд-то просто пропадает из очереди через несколько секунд.

Изменяю модельку через рейлс-консоль - колбек срабатывает, но джоба с отправкой почты не работает. Аналогично с периодическим запуском каждый час....

Подскажите, пожалуйста, что я не так настроил, может направильно запускаю... Потому что вроде бы как все работает, но ничего не работает. Заранее благодарен.
  • Вопрос задан
  • 956 просмотров
Подписаться 2 Сложный Комментировать
Решения вопроса 1
@yoyasimf
Попробуй в /lib/tasks/resque.rake
добавить Resque::Scheduler.dynamic = true
перед
Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml")
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
michaelkl
@michaelkl
Существует проблема с запуском ActiveJob-задач через resque-scheduler.

Суть проблемы описана тут. Говоря коротко, нужно запускать задачу через адаптер ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper.
Здесь можно почитать про варианты решения проблемы. Один из них - этот гем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы