【问题标题】:How to get rufus-scheduler working with a Rails app deployed to Heroku?如何让 rufus-scheduler 与部署到 Heroku 的 Rails 应用程序一起工作?
【发布时间】:2013-12-27 17:30:53
【问题描述】:

./config/initializers 中,我创建了一个名为task_scheduler.rb 的文件,其中包含以下代码:

require 'rufus-scheduler'
require 'mechanize'

scheduler = Rufus::Scheduler.new

scheduler.every("1h") do
    puts "Starting Rufus Scheduler - Task 1 - Checking exampleShop for new orders"

    a = Mechanize.new

    a.get('http://exampleshop.nl/admin/') do |page|

        # Select the login form
        login_form = page.forms.first

        # Insert the username and password
        login_form.username = 'username'
        login_form.password = 'password'

        # Submit the login information
        dashboard_page = a.submit(login_form, login_form.buttons.first)

        # Check if the login was successfull
        puts check_1 = dashboard_page.title == 'Dashboard' ?  "CHECK 1 DASHBOARD SUCCESS" : "CHECK 1 DASHBOARD FAIL"

        # Visit the orders index page to scrape some standard information
        orders_page = a.click(dashboard_page.link_with(:text => /Bestellingen/))

        # pp orders_page # => http://pastebin.com/L3zASer6

        # Check if the visit is successful
        puts check_2 = orders_page.title == 'Bestellingen' ?  "CHECK 2 ORDERS SUCCESS" : "CHECK 2 ORDERS FAIL"

        # Search for all #singleOrder table row's and put them in variable all_single_orders
        all_single_orders = orders_page.search("#singleOrder") 

        # Scrape the needed information (the actual save to database is omitted)
        all_single_orders.each do |order|
            # Set links for each order
            order_link = order.at_css("a")['href']  #Assuming first link in row

            @order_id = order.search("#orderId").text                   
            @order_status = order.search("#orderStatus").text       
            @order_revenue = order.search("#orderAmount").text      

            # Visit a single order page to fetch more detailed information
            single_order_page = orders_page.link_with(:href => order_link).click

            @first_name = single_order_page.search(".firstName").text
            @last_name = single_order_page.search(".lastName").text
            @city = single_order_page.search(".city").text
            @postal_code = single_order_page.search(".postalCode").text
            @address = single_order_page.search(".address").text
            @email = single_order_page.search(".email").text
            @order_quantity = single_order_page.search(".orderQuantity").text

            order = Order.create(   order_id: @order_id, first_name: @first_name, last_name: @last_name, city: @city,
                                                        email: @email, postal_code: @postal_code, address: @address, order_quantity: @order_quantity,
                                                        order_revenue: @order_revenue, order_status: @order_status)
        end
    end

    puts "Ending Rufus Scheduler - Task 1 - Checking exampleShop for new orders"
end

rufus-scheduler 在开发环境中进行测试时有效。但是当我将应用程序部署到 Heroku(免费)时它停止工作。

我使用Phusion Passenger 4.0.27 作为应用服务器。

我的 Gemfile 看起来像这样:

source 'https://rubygems.org'
ruby '2.0.0'
gem 'rails', '4.0.1'
gem 'rufus-scheduler', '3.0.2'
gem 'pg'
gem 'mechanize'
gem 'bcrypt-ruby', '3.1.2'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
gem 'newrelic_rpm'

group :doc do
  gem 'sdoc', require: false
end

group :development do
    gem 'sqlite3'
end

group :production do
    gem 'rails_12factor'
    gem 'passenger'
    gem 'pg'
end

Phusion Passenger 要求的Procfile 包含以下内容:

web: bundle exec passenger start -p $PORT --max-pool-size 3

我没有工人在运行。我正在使用一种免费的标准web Dyno。

知道为什么rufus-scheduler 在部署到 Heroku 时无法正常工作吗?

更新

我知道我可以创建一个客户.rake 文件并使用免费的Heroku Scheduler add-on 来执行任务。但我想知道是否有办法让rufus-scheduler 和免费的heroku dyno 组合工作。

【问题讨论】:

  • 你们有工人在跑吗?
  • @RichPeck 不,我正在使用一个免费的标准 Dyno。
  • 好的,您将遇到的直接问题是,为了运行大多数类型的调度程序,您需要某种持久的工作人员运行(在所需时间执行作业) .您可以使用标准的heroku scheduler add-on,但这仅每 10 分钟运行一次。运行工人不会直接解决您的问题,但可能是一个促成因素:)
  • @narzero,你解决了吗?我正在使用 Webrick 运行 Rails 3.2.16,并且 rufus-scheduler is 正在运行,所以我担心听到有时它不起作用。我想知道这是否与您的任务所做的工作量有关,或者与需要访问网络的任务有关。您是否尝试过一个很小的测试任务,例如写入日志?我不太明白 rufus-scheduler 如何在 web dyno 中守护它的任务。我在这里发布了一个相关问题:stackoverflow.com/questions/22997650/…
  • @MarkBerry 我只是创建了一个.rake 任务并使用Heroku Scheduler 每30 分钟执行一次。

标签: ruby-on-rails ruby heroku passenger rufus-scheduler


【解决方案1】:

这是一个如何让它在 Rails 上工作的示例:

#
# config/initializers/scheduler.rb
require 'rufus-scheduler'

# Let's use the rufus-scheduler singleton
#
s = Rufus::Scheduler.singleton

# Awesome recurrent task...
#
s.every '1m' do
  Rails.logger.info "hello, it's #{Time.now}"
end

看看documentation

【讨论】:

    【解决方案2】:

    您可以改用 Heroku 的调度程序并将此任务移动到使用 Heroku 的本机工具:https://devcenter.heroku.com/articles/scheduler

    【讨论】:

    • 我知道。但我想知道是否有办法让 rufus-scheduler 和免费的 heroku dyno 组合工作。
    • 看起来您需要在您的 procfile 中将其设置为一个单独的进程并扩大该进程 - 这些文档用于发条,但也应该主要适用于 rufus:devcenter.heroku.com/articles/clock-processes-ruby跨度>
    • 谢谢,我会尝试一下,看看它是否适用于 rufus-scheduler。
    【解决方案3】:

    我解决了这个问题,只是添加到我的Procfile:

    web: bundle exec passenger start -p $PORT --max-pool-size 3 --min-instances 2

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2018-10-23
      • 1970-01-01
      • 2015-12-25
      相关资源
      最近更新 更多