Ruby on rails 在Rails中的应用程序启动时,在heroku上安排一次重新创建作业
我正在使用Resque和Resque Schedule启动一个作业,该作业必须在应用程序启动时立即运行。其他计划作业每30秒加载一次 这是我的config/initializers/redis.rb的代码Ruby on rails 在Rails中的应用程序启动时,在heroku上安排一次重新创建作业,ruby-on-rails,heroku,ruby-on-rails-4,resque,resque-scheduler,Ruby On Rails,Heroku,Ruby On Rails 4,Resque,Resque Scheduler,我正在使用Resque和Resque Schedule启动一个作业,该作业必须在应用程序启动时立即运行。其他计划作业每30秒加载一次 这是我的config/initializers/redis.rb的代码 require 'rake' require 'resque' require 'resque/server' require 'resque_scheduler/tasks' # This will make the tabs show up. require 'resque_schedul
require 'rake'
require 'resque'
require 'resque/server'
require 'resque_scheduler/tasks'
# This will make the tabs show up.
require 'resque_scheduler'
require 'resque_scheduler/server'
uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.redis = REDIS
Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }
Resque.enqueue(AllMessageRetriever)
Resque.schedule = YAML.load_file(Rails.root.join('config', 'schedule.yml'))
当应用程序启动时,AllMessageRetriever将运行2-3次,而不是仅运行一次。初始化者是否多次被呼叫?这在Heroku和我当地的环境中都会发生
是否可以在Resque Scheduler中设置一个仅在运行时立即执行一次的延迟作业
AllMessageRetriever的代码。基本上,它在表上循环并调用外部API来获取数据,然后将其更新到表中。如果在初始值设定项文件中添加enqueue方法,整个任务将发生2-3次
require 'socialcast'
module AllMessageRetriever
@queue = :message_queue
def self.perform()
Watchedgroup.all.each do |group|
puts "Running group #{group.name}"
continueLoading=true
page=1
per_page=500
while(continueLoading == true)
User.first.refresh_token_if_expired
token = User.first.token
puts "ContinueLoading: #{continueLoading}"
@test = Socialcast.get_all_messages(group.name,token,page,per_page)
messagesArray = ActiveSupport::JSON.decode(@test)["messages"]
puts "Message Count: #{messagesArray.count}"
if messagesArray.count == 0
puts 'count is zero now'
continueLoading = false
else
messagesArray.each do |message|
if not Message.exists?(message["id"])
Message.create_with_socialcast(message, group.id)
else
Message.update_with_socialcast(message)
end
end
end
page += 1
end
Resqueaudit.create({:watchedgroup_id => group.id,:timecompleted => DateTime.now})
end
# Do anything here, like access models, etc
puts "Doing my job"
end
end
Rake
首先,为什么要尝试在init上排队
你最好授权给一个由初始值设定项调用的
这将消除对初始化过程的依赖,这将使事情变得更清楚。我不会把它放在初始值设定项中,因为它会在其他地方得到更好的处理()
问题 我认为这一行导致了问题:
Resque.enqueue(AllMessageRetriever)
在没有看到AllMessageRetriever
的内容的情况下,我猜测您是AllMessageRetriever
(模块/类?)将返回结果2/3次,导致Resque将(2/3次)数据集添加到队列中
可能是错误的,但这是有意义的,这意味着您的问题不在于Resque
/初始值设定项,而在于AllMessageRetriever
类
如果你能表现出来,那将是一个很大的帮助 Hi@RichPeck我为worker类添加了代码。我现在已经将它添加到Rake任务中,它工作得很好。i、 只有一次。但唯一的问题是我必须手动调用任务,而不是自动调用这是个好消息——也许你可以为任务创建一个初始值设定项?比如#config/initializers/messages.rb Rake::Task[“your:Task”]。调用