如何让Rufus-scheduler与部署到Heroku的Rails应用程序一起工作? [英] How to get rufus-scheduler working with a Rails app deployed to Heroku?

查看:162
本文介绍了如何让Rufus-scheduler与部署到Heroku的Rails应用程序一起工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

./ config / initializers 我创建了一个名为 task_scheduler.rb 的文件,它包含以下内容代码:
$ b $ pre $ 需要'rufus-scheduler'
需要'机械化'

scheduler = Rufus :: Scheduler.new

scheduler.every(1h)do
puts启动Rufus调度程序 - 任务1 - 检查新订单的exampleShop

a = Mechanize.new

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

#选择登录表单
login_form = page.forms.first

#输入用户名和密码
login_form.username ='username'$提交登录信息
dashboard_page = a.submit(login_form,login_form.buttons.first)

#检查登录是否成功
把check_1 = dashboard_page.title =='Dashboard'? 检查1控制板成功:检查1控制板失败

#访问订单索引页以获取一些标准信息
orders_page = a.click(dashboard_page.link_with(:text => ; / Bestellingen /))

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

#检查访问是否成功
把check_2 = orders_page.title =='Bestellingen'? 检查2订单成功:检查2订单失败

#搜索所有#singleOrder表行并将它们放入变量all_single_orders
all_single_orders = orders_page.search(#singleOrder)

#删除所需的信息(实际保存到数据库被省略)
all_single_orders.each do | order |
#设置每个订单的链接
order_link = order.at_css(a)['href'] #Assuming第一个链接行

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

#访问单个订单页面以获取更详细的信息
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_quant ity = single_order_page.search(。orderQuantity)。text

order = Order.create(order_id:@order_id,first_name:@first_name,last_name:@last_name,city:@city,
电子邮件:@email,postal_code:@postal_code,地址:@address,order_quantity:@ order_quantity,
order_revenue:@order_revenue,order_status:@order_status)
结束
结束

结束结束Rufus调度程序 - 任务1 - 检查新订单的exampleShop
结束

在开发环境中测试时, 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'

组:doc do
gem'sdoc',要求:false
结束

组:开发do
gem'sqlite3'
end

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

需要 Procfile 通过Phusion Passenger包含以下内容:

  web:bundle exec乘客启动-p $ PORT --max-pool-size 3 

我没有员工在运行。我使用一个免费标准 web Dyno。



任何想法为什么 rufus-scheduler 在部署到Heroku时无法正常工作?



更新



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

解决方案

下面是一个如何让它在Rails上运行的例子:



< pre $
#config / initializers / scheduler.rb
require'rufus-scheduler'

#让我们使用rufus-scheduler singleton

s = Rufus :: Scheduler.singleton

#令人敬畏的经常性任务...

s.every'1m'do
Rails.logger.infohello,它是#{Time.now}
end

查看文档


In ./config/initializers I've created a file called task_scheduler.rb and it contains the following code:

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

The rufus-scheduler works when testing in an development environment. But it stops working when I deploy the app to Heroku (free).

I'm using Phusion Passenger 4.0.27 as the application server.

My Gemfile looks like this:

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

The Procfile required by Phusion Passenger contains the following:

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

I have no workers running. I'm using one free standard web Dyno.

Any idea why rufus-scheduler is not working while deployed to Heroku?

UPDATE

I know I could create a customer .rake file and use the free Heroku Scheduler add-on to execute the task. But I'm wondering if there's a way to get the rufus-scheduler and free heroku dyno combination to work.

解决方案

Here's an example of how to get it to work on 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

Take a look at the documentation.

这篇关于如何让Rufus-scheduler与部署到Heroku的Rails应用程序一起工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆