【问题标题】:How do you schedule Resque jobs on Heroku?您如何在 Heroku 上安排 Resque 作业?
【发布时间】:2023-03-05 11:06:01
【问题描述】:

rescue-scheduler gem 安装说要创建一个单独的 Rake 任务用于调度:

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

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

$ rake resque:scheduler

但是我的 Heroku Procfile 已经有一个工作进程来运行 Resque:

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

我不想再创建另一个工作进程来运行预定的作业。这篇旧博客文章说您可以在不使用 Rake 任务的情况下进行设置。

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

如何在不使用 2 个 worker dyno 的情况下在 Heroku 上安排 Resque 作业?

我尝试添加多个依赖项,但它给了我一个循环依赖错误。

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

【问题讨论】:

    标签: ruby-on-rails resque resque-scheduler


    【解决方案1】:

    这行得通 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
    

    然后启动它

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 2014-03-24
      • 2016-08-05
      • 1970-01-01
      • 2011-11-07
      • 2014-04-02
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多