我正在使用Resque和Resque Schedule啓動一個必須在應用程序啓動時立即運行的作業。其他計劃作業每30秒加載一次。在Rails的應用程序啓動時安排在Heroku上的一次性Resque作業
這是我的配置/初始化/ redis.rb
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來獲取數據,然後將其更新到表中。這整個任務會發生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
Hi @RichPeck我添加了工人類的代碼。我現在已經將它添加到Rake任務,並且它工作正常。即只有一次。但唯一的問題是,我必須手動調用任務,並且它不會自動完成 – ganeshran
這是個好消息 - 也許您可以爲任務創建初始化程序?像 ''#config/initializers/messages.rb Rake :: Task [「your:task」]。invoke''' –