schedule.rb 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/env ruby
  2. unless defined?(Rails)
  3. puts
  4. puts "Please run me with rails runner, for example:"
  5. puts " RAILS_ENV=production bundle exec rails runner bin/schedule.rb"
  6. puts
  7. exit 1
  8. end
  9. require 'rufus/scheduler'
  10. class HuginnScheduler
  11. attr_accessor :mutex
  12. def run_schedule(time)
  13. with_mutex do
  14. puts "Queuing schedule for #{time}"
  15. Agent.delay.run_schedule(time)
  16. end
  17. end
  18. def propagate!
  19. with_mutex do
  20. puts "Queuing event propagation"
  21. Agent.delay.receive!
  22. end
  23. end
  24. def cleanup_expired_events!
  25. with_mutex do
  26. puts "Running event cleanup"
  27. Event.delay.cleanup_expired!
  28. end
  29. end
  30. def with_mutex
  31. ActiveRecord::Base.connection_pool.with_connection do
  32. mutex.synchronize do
  33. yield
  34. end
  35. end
  36. end
  37. def run!
  38. self.mutex = Mutex.new
  39. rufus_scheduler = Rufus::Scheduler.new
  40. # Schedule event propagation.
  41. rufus_scheduler.every '1m' do
  42. propagate!
  43. end
  44. # Schedule event cleanup.
  45. rufus_scheduler.cron "0 0 * * * America/Los_Angeles" do
  46. cleanup_expired_events!
  47. end
  48. # Schedule repeating events.
  49. %w[2m 5m 10m 30m 1h 2h 5h 12h 1d 2d 7d].each do |schedule|
  50. rufus_scheduler.every schedule do
  51. run_schedule "every_#{schedule}"
  52. end
  53. end
  54. # Schedule events for specific times.
  55. # Times are assumed to be in PST for now. Can store a user#timezone later.
  56. 24.times do |hour|
  57. rufus_scheduler.cron "0 #{hour} * * * America/Los_Angeles" do
  58. if hour == 0
  59. run_schedule "midnight"
  60. elsif hour < 12
  61. run_schedule "#{hour}am"
  62. elsif hour == 12
  63. run_schedule "noon"
  64. else
  65. run_schedule "#{hour - 12}pm"
  66. end
  67. end
  68. end
  69. rufus_scheduler.join
  70. end
  71. end
  72. scheduler = HuginnScheduler.new
  73. scheduler.run!