简体   繁体   English

您如何在Heroku上安排Resque工作?

[英]How do you schedule Resque jobs on Heroku?

The rescue-scheduler gem installation says to create a separate Rake task for scheduling: rescue-scheduler gem安装说要创建一个单独的Rake任务来调度:

https://github.com/resque/resque-scheduler#rake-integration https://github.com/resque/resque-scheduler#rake-integration

namespace :resque do
  task :setup_schedule => :setup do
    ...
  task :scheduler => :setup_schedule

$ rake resque:scheduler

However my Heroku Procfile already has a worker process to run Resque: 但是我的Heroku Procfile已经有一个运行Resque的辅助进程:

resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work COUNT=1

I don't want to create yet another worker process just to run scheduled jobs. 我不想创建另一个工作进程只是为了运行预定的作业。 This old blog posts says you can set it up without using Rake tasks. 这篇旧的博客文章说,您可以在不使用Rake任务的情况下进行设置。

https://www.perfectline.co/blog/2011/07/cron-tasks-for-your-rails-application-with-resque-2/ https://www.perfectline.co/blog/2011/07/cron-tasks-for-your-rails-application-with-resque-2/

How do you schedule Resque jobs on Heroku without use 2 worker dynos? 您如何在Heroku上安排Resque作业而无需使用2个工人dynos?

I tried to add multiple dependencies but it gave me a circular dependency error. 我试图添加多个依赖关系,但它给了我一个循环依赖关系错误。

namespace :resque do
  task :setup => [:environment, :scheduler]
Console
>env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work COUNT=1
rake aborted!
Circular dependency detected: TOP => resque:work => resque:preload => resque:setup => resque:scheduler => resque:setup_schedule => resque:setup

Tasks: TOP => resque:work => resque:preload => resque:setup => resque:scheduler => resque:setup_schedule

This works https://grosser.it/2012/04/14/resque-scheduler-on-heroku-without-extra-workers/ 这有效https://grosser.it/2012/04/14/resque-scheduler-on-heroku-without-extra-workers/

require 'resque/tasks'
require 'resque/scheduler/tasks'

namespace :resque do

  desc "schedule and work, so we only need 1 dyno"
  task :schedule_and_work do
    if Process.respond_to? :fork
      if Process.fork
        sh "rake environment resque:work"
      else
        sh "rake resque:scheduler"
        Process.wait
      end
    else # windows
      pid = Process.spawn "rake environment resque:work"
      Rake::Task["resque:scheduler"].invoke
      Process.wait pid
    end
  end

  task :setup => :environment

  task :setup_schedule => :setup do
    require 'resque-scheduler'

    # The schedule doesn't need to be stored in a YAML, it just needs to
    # be a hash.  YAML is usually the easiest.
    # Resque.schedule = YAML.load_file('your_resque_schedule.yml')
    Resque.schedule = {merit_rules: {every: '1m', class: 'Merit::ReputationChangeObserver', queue: :badge_queue,
      description: 'This job runs Merit\'s rules to award badges.'}}

  end

  task :scheduler => :setup_schedule

end

And to launch it 并启动它

env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:schedule_and_work COUNT=1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM