Более очевидный и идеальный способ - записать значение в базу данных и проверить, существует ли оно в вашем работнике, прежде чем вы его запустите.
Они, вероятно, не будут масштабироваться так, как вам нужно, но, поскольку я не знаю о вашей архитектуре, я дам вам некоторые рекомендации, чтобы вы могли исследовать свой собственный путь:
Внутри config/application.rb
:
def ran_special_job?
@ran_special_job < 5.minutes.ago
end
def ran_special_job_at=(val)
@ran_special_job = val
end
В вашей работе замкните накоротко:
def perform
return if Rails.application.ran_special_job?
Rails.application.ran_special_job_at = Time.now
puts "I am running"
end
По-другому ваш работник:
def perform
return if Rails.application.ran_special_job?
Rails.application.ran_special_job!
puts "I am running"
end
и в вашем config/application.rb
def ran_special_job?
return false unless File.exists?("special_job.txt")
DateTime.parse(File.read("special_job.txt")) < 5.minutes.ago
end
def ran_special_job!
File.open("special_job.txt", "w") { |file| file.write Time.now }
end
Этот метод не идеален, если вы используете Heroku или какой-либо другой сервис, который не предоставляет постоянную файловую систему, но вы поняли идею.