如何设置active_job和救援调度程序?

时间:2015-04-06 15:37:56

标签: ruby-on-rails resque rails-activejob resque-scheduler rails-4-2-1

我正在尝试为电子邮件通知和抓取工具创建后台作业。 我使用resque-scheduler(4.0.0),resque(1.25.2)和rails 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中看到了两个工作人员和两个队列,正如预期的那样。

但是!

在resque Schedule选项卡上单击'queue now'按钮后,我看到该任务已创建并且已写入“fs_updates”队列。但它没有运行,在几秒钟内它就消失了。

当我为从rails控制台发送的电子邮件运行作业时 - 它根本不起作用。

请帮我修改配置。 谢天谢地!

2 个答案:

答案 0 :(得分:0)

我在尝试在rails 4.2.1上配置Sucker Punch时遇到了同样的问题。最后我将自定义初始化逻辑移动到了application.rb中,不是很好,但它让我开始运行。

不确定此版本中的初始化程序是否存在问题。尝试将代码从active_job.rb和resque.rb移动到application.rb或相应的环境文件中。显然,这不是一个长期解决方案,但它至少可以帮助您确定它是初始化问题还是Resque配置问题。

答案 1 :(得分:0)

据我了解:rails和active_job开发人员不负责resque插件。也许这个问题将在新的gem版本中修复,但现在它不起作用(active_job在resque-scheduler中不能正常工作)。

目前,我使用gem 'active_scheduler'来解决当前问题。