Class: PerformEvery::Job
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- PerformEvery::Job
- Includes:
- Helper
- Defined in:
- lib/perform_every/job.rb
Instance Attribute Summary collapse
-
#accuracy ⇒ Object
Returns the value of attribute accuracy.
Instance Method Summary collapse
- #==(j) ⇒ Object
- #add_history(t = Time.now.utc) ⇒ Object
- #from_reflection_store(attr) ⇒ Object
- #mark_deprecated! ⇒ Object
- #parse_interval_value ⇒ Object
- #parse_timestamp_value ⇒ Object
- #perform!(now = Time.now.utc) ⇒ Object
- #perform?(now = Time.now.utc) ⇒ Boolean
- #perform_multi? ⇒ Boolean
- #perform_next_at ⇒ Object
- #perform_once? ⇒ Boolean
- #title ⇒ Object
- #too_old?(now = Time.now.utc) ⇒ Boolean
Methods included from Helper
Instance Attribute Details
#accuracy ⇒ Object
Returns the value of attribute accuracy.
9 10 11 |
# File 'lib/perform_every/job.rb', line 9 def accuracy @accuracy end |
Instance Method Details
#==(j) ⇒ Object
152 153 154 |
# File 'lib/perform_every/job.rb', line 152 def ==(j) self.job_name == j.job_name && self.typ == j.typ && self.value == j.value end |
#add_history(t = Time.now.utc) ⇒ Object
122 123 124 125 126 |
# File 'lib/perform_every/job.rb', line 122 def add_history(t = Time.now.utc) self.history ||= [] self.history << t.to_s self.history.shift(self.history.count - MAX_HISTORY) if self.history.count > MAX_HISTORY end |
#from_reflection_store(attr) ⇒ Object
17 18 19 20 21 |
# File 'lib/perform_every/job.rb', line 17 def from_reflection_store(attr) s = PerformEvery::Reflection.find(self) return nil if s.nil? s.send(attr.to_sym) end |
#mark_deprecated! ⇒ Object
164 165 166 167 |
# File 'lib/perform_every/job.rb', line 164 def mark_deprecated! self.deprecated = true self.save! end |
#parse_interval_value ⇒ Object
138 139 140 141 142 143 |
# File 'lib/perform_every/job.rb', line 138 def parse_interval_value raise "must be interval" if self.value.blank? interval = ::Fugit::Nat.parse("every " + self.value, multi: :fail) raise "must be interval" if interval.blank? || !interval.is_a?(::Fugit::Cron) return interval end |
#parse_timestamp_value ⇒ Object
145 146 147 148 149 150 |
# File 'lib/perform_every/job.rb', line 145 def raise "must be timestamp" if self.value.blank? = ::Fugit::At.parse(self.value) raise "must be timestamp" if .blank? || !.is_a?(::EtOrbi::EoTime) return end |
#perform!(now = Time.now.utc) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/perform_every/job.rb', line 37 def perform!(now = Time.now.utc) return :skip_deprecated if self.perform_at.blank? || self.deprecated if self.too_old?(now) rescue_perform_at = self.perform_at self.perform_at = self.perform_once? ? nil : self.perform_next_at self.deprecated = self.perform_once? self.save! # prepare debug log log = [] log << "'#{self.title}' was skipped." log << "It was scheduled for #{rescue_perform_at} but now it's #{distance(now, rescue_perform_at)} too late to still run the job." if self.perform_multi? log << "The job is scheduled to perform next in #{distance(now, self.perform_at)} at #{self.perform_at}." else log << "This one-time job will not be scheduled again." end Rails.logger.error log.join(" ") return :skip_too_old end if !self.perform?(now) # prepare debug log log = [] log << "'#{self.title}' was skipped." perform_next_str = "" unless self.last_performed_at.blank? log << "It ran #{distance(now, self.last_performed_at)} ago." perform_next_str = "next" else perform_next_str = self.perform_once? ? "once" : "for the first time" end unless self.perform_at.blank? log << "The job is scheduled to perform #{perform_next_str} in #{distance(now, self.perform_at)} at #{self.perform_at}." end Rails.logger.debug log.join(" ") return :skip end # call the actual job schedule_error = nil unless PerformEvery.dry_run begin Object.const_get(self.job_name).send(:perform_now) rescue => e schedule_error = e end end # prepare debug log log = [] unless schedule_error log << "'#{self.title}' was scheduled." else log << "'#{self.title}' failed with error: #{schedule_error}." end if self.perform_multi? log << "The job is scheduled to perform next in #{distance(now, self.perform_next_at)} at #{self.perform_next_at}." else log << "This one-time job will not be scheduled again." end unless schedule_error Rails.logger.debug log.join(" ") else Rails.logger.error log.join(" ") end # log warning if job is performed with more than 1 minute delay if now - self.perform_at > 1.minute Rails.logger.warn "'#{self.title}' was run with a delay of #{distance(now, self.perform_at)}." end self.last_performed_at = now.utc self.add_history(self.last_performed_at) self.perform_at = self.perform_once? ? nil : self.perform_next_at self.deprecated = self.perform_once? self.save! return schedule_error.blank? ? :perform : :error end |
#perform?(now = Time.now.utc) ⇒ Boolean
23 24 25 26 27 28 29 |
# File 'lib/perform_every/job.rb', line 23 def perform?(now = Time.now.utc) return false if self.deprecated return false if self.perform_at.blank? return false if self.too_old?(now) now >= self.perform_at && (self.last_performed_at.blank? || self.last_performed_at < self.perform_at) end |
#perform_multi? ⇒ Boolean
160 161 162 |
# File 'lib/perform_every/job.rb', line 160 def perform_multi? self.typ == "interval" end |
#perform_next_at ⇒ Object
128 129 130 131 132 133 134 135 136 |
# File 'lib/perform_every/job.rb', line 128 def perform_next_at if self.typ == "interval" self.parse_interval_value.next_time.utc elsif self.typ == "timestamp" self..utc else raise "unknown typ" end end |
#perform_once? ⇒ Boolean
156 157 158 |
# File 'lib/perform_every/job.rb', line 156 def perform_once? self.typ == "timestamp" end |
#title ⇒ Object
11 12 13 14 15 |
# File 'lib/perform_every/job.rb', line 11 def title return "#{self.job_name} every #{self.value}" if self.typ == "interval" return "#{self.job_name} at #{self.value}" if self.typ == "timestamp" raise "unknown typ" end |
#too_old?(now = Time.now.utc) ⇒ Boolean
31 32 33 34 35 |
# File 'lib/perform_every/job.rb', line 31 def too_old?(now = Time.now.utc) raise "job is not scheduled to run because perform_at is nil" if self.perform_at.blank? accuracy = self.from_reflection_store(:accuracy) || PerformEvery::DEFAULT_ACCURACY now - self.perform_at >= accuracy end |