Class: Bizside::JobUtils
- Inherits:
-
Object
- Object
- Bizside::JobUtils
- Defined in:
- lib/bizside/job_utils.rb
Class Method Summary collapse
- .add_cron(name, job_type, cron, *args) ⇒ Object
- .add_cron_to(queue, name, job_type, cron, *args) ⇒ Object
- .add_job(klass, *args, &block) ⇒ Object
- .add_job_silently(klass, *args) ⇒ Object
- .add_job_silently_to(queue, klass, *args) ⇒ Object
- .add_job_to(queue, klass, *args) ⇒ Object
- .add_scheduler(name, job_type, interval_args, *args) ⇒ Object
- .any_jobs_for?(queue) ⇒ Boolean
- .cancel_job_at(klass, *args) ⇒ Object
- .dequeue(klass, *args) ⇒ Object
- .enqueue_at_with_queue(queue, time, klass, *args) ⇒ Object
- .enqueue_at_with_queue_silently(queue, time, klass, *args) ⇒ Object
- .enqueue_in(time_to_delay, klass, *args) ⇒ Object
- .enqueue_in_with_queue(queue, time_to_delay, klass, *args) ⇒ Object
- .failure_count(queue = nil, class_name = nil) ⇒ Object
- .failure_jobs(start = 0, count = 1, queue = nil) ⇒ Object
- .peek(queue, start = 0, count = 1) ⇒ Object
- .queue_from_class(klass) ⇒ Object
- .queue_size(queue) ⇒ Object
- .remove_cron(name) ⇒ Object
- .remove_delayed_in_queue(klass, queue, *args) ⇒ Object
- .remove_queue(queue) ⇒ Object
- .remove_scheduler(name) ⇒ Object
- .set_job_at(time, klass, *args) ⇒ Object
- .set_job_silently_at(time, klass, *args) ⇒ Object
- .unique_in_queue?(klass, args = {}, queue, count: 100, except: []) ⇒ Boolean
Class Method Details
.add_cron(name, job_type, cron, *args) ⇒ Object
105 106 107 |
# File 'lib/bizside/job_utils.rb', line 105 def self.add_cron(name, job_type, cron, *args) add_cron_to(nil, name, job_type, cron, *args) end |
.add_cron_to(queue, name, job_type, cron, *args) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/bizside/job_utils.rb', line 109 def self.add_cron_to(queue, name, job_type, cron, *args) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時にはCronの設定を行いません。' return end ::Resque.remove_schedule(name) cronline = Array(cron).first if cronline.to_s.strip.empty? return elsif CronValidator.new(cronline).valid? config = { :class => job_type, :cron => cron, :args => args, :persist => true } config[:queue] = queue if queue.present? ::Resque.set_schedule(name, config) else raise ArgumentError, "Cronの書式が正しくないのでスケジューリングしません。name=#{name}" end end |
.add_job(klass, *args, &block) ⇒ Object
6 7 8 |
# File 'lib/bizside/job_utils.rb', line 6 def self.add_job(klass, *args, &block) add_job_to(nil, klass, *args, &block) end |
.add_job_silently(klass, *args) ⇒ Object
33 34 35 36 37 |
# File 'lib/bizside/job_utils.rb', line 33 def self.add_job_silently(klass, *args) add_job(klass, *args) do # 何も出力しない end end |
.add_job_silently_to(queue, klass, *args) ⇒ Object
39 40 41 42 43 |
# File 'lib/bizside/job_utils.rb', line 39 def self.add_job_silently_to(queue, klass, *args) add_job_to(queue, klass, *args) do # 何も出力しない end end |
.add_job_to(queue, klass, *args) ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/bizside/job_utils.rb', line 10 def self.add_job_to(queue, klass, *args) if Bizside.rails_env&.test? do_perform_and_hooks_instantly(klass, 'テスト時にはジョブの登録を行わず、即時実行します。', *args) return end if block_given? yield else if queue Bizside.logger.info "ジョブ #{klass} を #{queue} に登録します。" else Bizside.logger.info "ジョブ #{klass} を登録します。" end end if queue.present? ::Resque.enqueue_to(queue, klass, *args) else ::Resque.enqueue(klass, *args) end end |
.add_scheduler(name, job_type, interval_args, *args) ⇒ Object
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/bizside/job_utils.rb', line 141 def self.add_scheduler(name, job_type, interval_args, *args) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時にはCronの設定を行いません。' return end ::Resque.remove_schedule(name) if interval_args[:cron].present? add_cron(name, job_type, interval_args[:cron], args) elsif interval_args[:every].present? config = { :class => job_type, :every => interval_args[:every], :args => args, :persist => true } ::Resque.set_schedule(name, config) else raise ArgumentError, "cronもしくはeveryが指定されていないのでスケジューリングしません。name=#{name}" end end |
.any_jobs_for?(queue) ⇒ Boolean
213 214 215 216 217 |
# File 'lib/bizside/job_utils.rb', line 213 def self.any_jobs_for?(queue) ret = ::Resque.size(queue) ret += ::Resque.working.reduce(0){|sum, worker| sum += worker.queues.include?(queue) ? 1 : 0 } ret > 0 end |
.cancel_job_at(klass, *args) ⇒ Object
96 97 98 99 100 101 102 103 |
# File 'lib/bizside/job_utils.rb', line 96 def self.cancel_job_at(klass, *args) if Bizside.rails_env&.test? Bizside.logger.info "テスト時には遅延ジョブのキャンセルを行いません。" return end ::Resque.remove_delayed(klass, *args) end |
.dequeue(klass, *args) ⇒ Object
200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/bizside/job_utils.rb', line 200 def self.dequeue(klass, *args) if Bizside.rails_env&.test? if klass.respond_to?(:before_dequeue) return if klass.before_dequeue(*args) == false end Bizside.logger.info 'テスト時にジョブの削除は行いません。' klass.after_dequeue(*args) if klass.respond_to?(:after_dequeue) return end ::Resque.dequeue(klass, *args) end |
.enqueue_at_with_queue(queue, time, klass, *args) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/bizside/job_utils.rb', line 45 def self.enqueue_at_with_queue(queue, time, klass, *args) if Bizside.rails_env&.test? do_perform_and_hooks_instantly(klass, 'テスト時には遅延ジョブの登録を行わず、即時実行します。', *args) return end if block_given? yield else Bizside.logger.info "遅延ジョブ #{klass} を #{queue} に登録します。" end ::Resque.enqueue_at_with_queue(queue, time, klass, *args) end |
.enqueue_at_with_queue_silently(queue, time, klass, *args) ⇒ Object
60 61 62 63 64 |
# File 'lib/bizside/job_utils.rb', line 60 def self.enqueue_at_with_queue_silently(queue, time, klass, *args) enqueue_at_with_queue(queue, time, klass, *args) do # 何も出力しない end end |
.enqueue_in(time_to_delay, klass, *args) ⇒ Object
182 183 184 185 186 187 188 189 |
# File 'lib/bizside/job_utils.rb', line 182 def self.enqueue_in(time_to_delay, klass, *args) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時にジョブの遅延実行は行いません。' return end ::Resque.enqueue_in(time_to_delay, klass, *args) end |
.enqueue_in_with_queue(queue, time_to_delay, klass, *args) ⇒ Object
191 192 193 194 195 196 197 198 |
# File 'lib/bizside/job_utils.rb', line 191 def self.enqueue_in_with_queue(queue, time_to_delay, klass, *args) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時にジョブの遅延実行は行いません。' return end ::Resque.enqueue_in_with_queue(queue, time_to_delay, klass, *args) end |
.failure_count(queue = nil, class_name = nil) ⇒ Object
302 303 304 305 306 |
# File 'lib/bizside/job_utils.rb', line 302 def self.failure_count(queue = nil, class_name = nil) return 0 if Bizside.rails_env&.test? ::Resque::Failure.count(queue, class_name) end |
.failure_jobs(start = 0, count = 1, queue = nil) ⇒ Object
293 294 295 296 297 298 299 300 |
# File 'lib/bizside/job_utils.rb', line 293 def self.failure_jobs(start = 0, count = 1, queue = nil) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時は、ジョブ 0 件とします。' return [] end ::Resque::Failure.all(start, count, queue) end |
.peek(queue, start = 0, count = 1) ⇒ Object
173 174 175 176 177 178 179 180 |
# File 'lib/bizside/job_utils.rb', line 173 def self.peek(queue, start = 0, count = 1) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時は、ジョブ 0 件とします。' return [] end ::Resque.peek(queue, start, count) end |
.queue_from_class(klass) ⇒ Object
228 229 230 |
# File 'lib/bizside/job_utils.rb', line 228 def self.queue_from_class(klass) ::Resque.queue_from_class(klass) end |
.queue_size(queue) ⇒ Object
232 233 234 235 236 |
# File 'lib/bizside/job_utils.rb', line 232 def self.queue_size(queue) return 0 if Bizside.rails_env&.test? ::Resque.size(queue) end |
.remove_cron(name) ⇒ Object
137 138 139 |
# File 'lib/bizside/job_utils.rb', line 137 def self.remove_cron(name) remove_scheduler(name) end |
.remove_delayed_in_queue(klass, queue, *args) ⇒ Object
66 67 68 69 70 71 72 73 |
# File 'lib/bizside/job_utils.rb', line 66 def self.remove_delayed_in_queue(klass, queue, *args) if Bizside.rails_env&.test? Rails.logger.info "テスト時には遅延ジョブのキャンセルを行いません。" return end ::Resque.remove_delayed_in_queue(klass, queue, *args) end |
.remove_queue(queue) ⇒ Object
219 220 221 222 223 224 225 226 |
# File 'lib/bizside/job_utils.rb', line 219 def self.remove_queue(queue) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時にキューの削除は行いません。' return end ::Resque.remove_queue(queue) end |
.remove_scheduler(name) ⇒ Object
164 165 166 167 168 169 170 171 |
# File 'lib/bizside/job_utils.rb', line 164 def self.remove_scheduler(name) if Bizside.rails_env&.test? Bizside.logger.info 'テスト時にはCronの設定を行いません。' return end ::Resque.remove_schedule(name) end |
.set_job_at(time, klass, *args) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/bizside/job_utils.rb', line 75 def self.set_job_at(time, klass, *args) if Bizside.rails_env&.test? do_perform_and_hooks_instantly(klass, 'テスト時には遅延ジョブの登録を行わず、即時実行します。', *args) return end if block_given? yield else Bizside.logger.info "遅延ジョブ #{klass} を登録します。" end ::Resque.enqueue_at(time, klass, *args) end |
.set_job_silently_at(time, klass, *args) ⇒ Object
90 91 92 93 94 |
# File 'lib/bizside/job_utils.rb', line 90 def self.set_job_silently_at(time, klass, *args) set_job_at(time, klass, *args) do # 何も出力しない end end |
.unique_in_queue?(klass, args = {}, queue, count: 100, except: []) ⇒ Boolean
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
# File 'lib/bizside/job_utils.rb', line 238 def self.unique_in_queue?(klass, args = {}, queue, count: 100, except: []) if Bizside.rails_env&.test? Bizside.logger.info "テスト時は常にキューに同一ジョブが存在しない前提とします。" return true end jobs = self.peek(queue, 0, count) # 先頭からcount件のジョブ if already_in_jobs?(klass, args, jobs, except: except) false else count = rest_count(self.queue_size(queue), count) if count == 0 true else count += 1 if count == 1 # Resque.peek()が1件だと戻り値の型が違うのを回避 jobs = self.peek(queue, count * -1, count) # 後ろからcount件のジョブ ! already_in_jobs?(klass, args, jobs, except: except) end end end |