mini_scheduler 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58dcad532f7cb76d214c67d975f8d803dbf915af17cf22ec71e8ce682cd49d39
4
- data.tar.gz: a52d4cd05cabea3cdea11aea43b89f4a098526bb2a441b0f054d4ef03b469159
3
+ metadata.gz: 61de19d47b5090c36a179869a01800506ee364629db64f47df963426c1d9a8b6
4
+ data.tar.gz: faa1b86a2d625fa570b26dd8ad8a2ccdb15fcd6029f1d93ad67ddefb0301342a
5
5
  SHA512:
6
- metadata.gz: ea0b767e1a6751175f904e5f13a5165ff79cc6bd226ec1a140df0591290793c4bb4c8d2d0eeb2a52b390bd43e1b14784fe31c58f3a45d699bd679b44a62cc794
7
- data.tar.gz: fa328b9320451df465d6067fb6adaa6325680fafef660a6fada896079afdd38b74010ba28ed7191779f59164b0db45e32aaf14f1c4d03603ea5382bf9dc8d1cd
6
+ metadata.gz: 931ae1731d9c1b49b3c861ec5b401d317e436f9548494c6fc9cd7b242c5d9bd932459bdf5598f9e7ca24abe8c46d585a43d75cac8a2772f7a04bc77fcf6ad27d
7
+ data.tar.gz: 82ef45be2249b8c5d6834aeeb13f3f72e4b23604436a68246bba46350ad49255d0f9adf6ac262f685c189d9fc6670c8247776ab3b2d4eaf1f9b7e55b87a63515
data/README.md CHANGED
@@ -49,6 +49,7 @@ end
49
49
 
50
50
  Options for schedules:
51
51
 
52
+ * **queue** followed by a queue name, like "queue :email", default queue is "default"
52
53
  * **every** followed by a duration in seconds, like "every 1.hour".
53
54
  * **daily at:** followed by a duration since midnight, like "daily at: 12.hours", to run only once per day at a specific time.
54
55
 
@@ -52,24 +52,30 @@ module MiniScheduler
52
52
  end
53
53
 
54
54
  def self.start
55
- manager = Manager.new
55
+ schedules = Manager.discover_schedules
56
56
 
57
- Manager.discover_schedules.each do |schedule|
58
- manager.ensure_schedule!(schedule)
59
- end
57
+ Manager.discover_queues.each do |queue|
58
+ manager = Manager.new(queue: queue)
60
59
 
61
- Thread.new do
62
- while true
63
- begin
64
- if !self.skip_schedule || !self.skip_schedule.call
65
- manager.tick
66
- end
67
- rescue => e
68
- # the show must go on
69
- handle_job_exception(e, message: "While ticking scheduling manager")
60
+ schedules.each do |schedule|
61
+ if schedule.queue == queue
62
+ manager.ensure_schedule!(schedule)
70
63
  end
64
+ end
71
65
 
72
- sleep 1
66
+ Thread.new do
67
+ while true
68
+ begin
69
+ if !self.skip_schedule || !self.skip_schedule.call
70
+ manager.tick
71
+ end
72
+ rescue => e
73
+ # the show must go on
74
+ handle_job_exception(e, message: "While ticking scheduling manager")
75
+ end
76
+
77
+ sleep 1
78
+ end
73
79
  end
74
80
  end
75
81
  end
@@ -1,6 +1,6 @@
1
1
  module MiniScheduler
2
2
  class Manager
3
- attr_accessor :random_ratio, :redis, :enable_stats
3
+ attr_accessor :random_ratio, :redis, :enable_stats, :queue
4
4
 
5
5
  class Runner
6
6
  def initialize(manager)
@@ -168,11 +168,13 @@ module MiniScheduler
168
168
  end
169
169
 
170
170
  def initialize(options = nil)
171
+ @queue = options && options[:queue] || "default"
172
+
171
173
  @redis = MiniScheduler.redis
172
174
  @random_ratio = 0.1
173
175
  unless options && options[:skip_runner]
174
176
  @runner = Runner.new(self)
175
- self.class.current = self
177
+ self.class.current[@queue] = self
176
178
  end
177
179
 
178
180
  @hostname = options && options[:hostname]
@@ -186,11 +188,7 @@ module MiniScheduler
186
188
  end
187
189
 
188
190
  def self.current
189
- @current
190
- end
191
-
192
- def self.current=(manager)
193
- @current = manager
191
+ @current ||= {}
194
192
  end
195
193
 
196
194
  def hostname
@@ -225,7 +223,7 @@ module MiniScheduler
225
223
  end
226
224
 
227
225
  def reschedule_orphans_on!(hostname = nil)
228
- redis.zrange(Manager.queue_key(hostname), 0, -1).each do |key|
226
+ redis.zrange(Manager.queue_key(queue, hostname), 0, -1).each do |key|
229
227
  klass = get_klass(key)
230
228
  next unless klass
231
229
  info = schedule_info(klass)
@@ -253,14 +251,14 @@ module MiniScheduler
253
251
  end
254
252
 
255
253
  def schedule_next_job(hostname = nil)
256
- (key, due), _ = redis.zrange Manager.queue_key(hostname), 0, 0, withscores: true
254
+ (key, due), _ = redis.zrange Manager.queue_key(queue, hostname), 0, 0, withscores: true
257
255
  return unless key
258
256
 
259
257
  if due.to_i <= Time.now.to_i
260
258
  klass = get_klass(key)
261
259
  unless klass
262
260
  # corrupt key, nuke it (renamed job or something)
263
- redis.zrem Manager.queue_key(hostname), key
261
+ redis.zrem Manager.queue_key(queue, hostname), key
264
262
  return
265
263
  end
266
264
  info = schedule_info(klass)
@@ -281,7 +279,7 @@ module MiniScheduler
281
279
 
282
280
  def stop!
283
281
  @runner.stop!
284
- self.class.current = nil
282
+ self.class.current.delete(@queue)
285
283
  end
286
284
 
287
285
  def keep_alive_duration
@@ -293,11 +291,15 @@ module MiniScheduler
293
291
  end
294
292
 
295
293
  def lock
296
- MiniScheduler::DistributedMutex.synchronize(Manager.lock_key, MiniScheduler.redis) do
294
+ MiniScheduler::DistributedMutex.synchronize(Manager.lock_key(queue), MiniScheduler.redis) do
297
295
  yield
298
296
  end
299
297
  end
300
298
 
299
+ def self.discover_queues
300
+ ObjectSpace.each_object(MiniScheduler::Schedule).map(&:queue).to_set
301
+ end
302
+
301
303
  def self.discover_schedules
302
304
  # hack for developemnt reloader is crazytown
303
305
  # multiple classes with same name can be in
@@ -326,15 +328,15 @@ module MiniScheduler
326
328
  @identity_key ||= "_scheduler_#{hostname}:#{Process.pid}:#{self.class.seq}:#{SecureRandom.hex}"
327
329
  end
328
330
 
329
- def self.lock_key
330
- "_scheduler_lock_"
331
+ def self.lock_key(queue)
332
+ "_scheduler_lock_#{queue}_"
331
333
  end
332
334
 
333
- def self.queue_key(hostname = nil)
335
+ def self.queue_key(queue, hostname = nil)
334
336
  if hostname
335
- "_scheduler_queue_#{hostname}_"
337
+ "_scheduler_queue_#{queue}_#{hostname}_"
336
338
  else
337
- "_scheduler_queue_"
339
+ "_scheduler_queue_#{queue}_"
338
340
  end
339
341
  end
340
342
 
@@ -1,5 +1,10 @@
1
1
  module MiniScheduler::Schedule
2
2
 
3
+ def queue(value = nil)
4
+ @queue = value.to_s if value
5
+ @queue ||= "default"
6
+ end
7
+
3
8
  def daily(options = nil)
4
9
  if options
5
10
  @daily = options
@@ -10,7 +15,7 @@ module MiniScheduler::Schedule
10
15
  def every(duration = nil)
11
16
  if duration
12
17
  @every = duration
13
- if manager = MiniScheduler::Manager.current
18
+ if manager = MiniScheduler::Manager.current[queue]
14
19
  manager.ensure_schedule!(self)
15
20
  end
16
21
  end
@@ -120,9 +120,9 @@ module MiniScheduler
120
120
 
121
121
  def queue_key
122
122
  if @klass.is_per_host
123
- Manager.queue_key(@manager.hostname)
123
+ Manager.queue_key(@manager.queue, @manager.hostname)
124
124
  else
125
- Manager.queue_key
125
+ Manager.queue_key(@manager.queue)
126
126
  end
127
127
  end
128
128
 
@@ -1,3 +1,3 @@
1
1
  module MiniScheduler
2
- VERSION = "0.9.2"
2
+ VERSION = "0.10.0"
3
3
  end
@@ -7,16 +7,17 @@
7
7
  <div class="container">
8
8
  <div class="row">
9
9
 
10
- <div class="col-md-9">
10
+ <div class="col-md-12">
11
11
  <% if @schedules.length > 0 %>
12
12
  <table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
13
13
  <thead>
14
14
  <th style="width: 30%">Worker</th>
15
- <th style="width: 15%">Last Run</th>
16
- <th style="width: 15%">Last Result</th>
17
- <th style="width: 15%">Last Duration</th>
18
- <th style="width: 15%">Last Owner</th>
19
- <th style="width: 15%">Next Run Due</th>
15
+ <th style="width: 10%">Last Run</th>
16
+ <th style="width: 10%">Last Result</th>
17
+ <th style="width: 10%">Last Duration</th>
18
+ <th style="width: 10%">Last Owner</th>
19
+ <th style="width: 10%">Next Run Due</th>
20
+ <th style="width: 10%">Queue</th>
20
21
  <th style="width: 10%">Actions</th>
21
22
  </thead>
22
23
  <% @schedules.each do |schedule| %>
@@ -49,6 +50,9 @@
49
50
  <%= relative_time(Time.at(next_run)) %>
50
51
  <% end %>
51
52
  </td>
53
+ <td>
54
+ <%= schedule.queue %>
55
+ </td>
52
56
  <td>
53
57
  <form action="<%= "#{root_path}scheduler/#{schedule}/trigger" %>" method="post">
54
58
  <%= csrf_tag if respond_to?(:csrf_tag) %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-04-26 00:00:00.000000000 Z
12
+ date: 2019-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sidekiq