sidekiq-scheduler 2.0.6 → 2.0.7

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
  SHA1:
3
- metadata.gz: d2b640d812a1bd5a97323ddcc891c3b4322bc5f8
4
- data.tar.gz: 8d1d6592c877a503f3167fdb91cecced8bebead1
3
+ metadata.gz: 8d0589167bd1d704cc531881f41ce934e07e684a
4
+ data.tar.gz: 4a07798d84026cedbb746d6c455463ae796ca56f
5
5
  SHA512:
6
- metadata.gz: 80c12e6687d4251e579d2d7e802e7721f7d9fe6288689f45684448243e2c0091742910a87b57ae306fe4fe0a5a925bbe1fa8b0e7a60c67be62be139e547d2028
7
- data.tar.gz: 1d25189e230f7f93bc66fe347326e925c868f8bc967ce5f5211c05aa37ba2f54030732f236e0521621da06af63bd27192ed3beccb6a76baee46c82e4ab8f77e7
6
+ metadata.gz: 56218d97eb155af5fbf07e4ccbca6a5e76bfe5e23facefb8e685758d3f031b17ab6f66ed89132a8953a8b03ad3935132cb1eefedbf3adbb2d23168698c4b959a
7
+ data.tar.gz: 722247865b66c237efcea76d099207b746e5058adeb60a550a8090baec5c666dab01f7659a8c00d3021fa9138692eccde02b62343980b3da2f9cfab5b2d4a0de
data/README.md CHANGED
@@ -56,7 +56,7 @@ You can add sidekiq-scheduler configuration options to sidekiq.yml config file.
56
56
  Available options are:
57
57
 
58
58
  :schedule: <the schedule to be run>
59
- :dynamic: <if true the schedule can be modified in runtime>
59
+ :dynamic: <if true the schedule can be modified in runtime [false by default]>
60
60
  :enabled: <enables scheduler if true [true by default]>
61
61
  :scheduler:
62
62
  :listened_queues_only: <push jobs whose queue is being listened by sidekiq [false by default]>
@@ -187,16 +187,42 @@ For more information, see [this issue](https://github.com/Moove-it/sidekiq-sched
187
187
 
188
188
  ### Reloading the schedules
189
189
 
190
- The schedules can we updated from redis, every 5 seconds the redis is checked for schedule changes,
191
- to update an schedule you have to:
190
+ Schedules are stored in Redis. To add / update an schedule, you have to:
192
191
 
193
- ```ruby
194
- Sidekiq.set_schedule('some_name', { 'every' => ['1m'], 'class' => 'HardWorker' })
195
- ```
192
+ ```ruby
193
+ Sidekiq.set_schedule('heartbeat', { 'every' => ['1m'], 'class' => 'HeartbeatWorker' })
194
+ ```
195
+
196
+ When `:dynamic` flag is set to `true`, schedule changes are loaded every 5 seconds.
197
+
198
+ You can set that flag in the following ways.
199
+
200
+ - Yaml configuration:
201
+ ```
202
+ :dynamic: true
203
+ ```
204
+
205
+ - Initializer configuration:
206
+ ```ruby
207
+ Sidekiq.configure_server do |config|
208
+ # ...
209
+
210
+ config.on(:startup) do
211
+ # ...
212
+ Sidekiq::Scheduler.dynamic = true
213
+ end
214
+ end
215
+ ```
216
+
217
+ If `:dynamic` flag is set to false, you have to reload the schedule manually in sidekiq
218
+ side:
219
+ ```ruby
220
+ Sidekiq::Scheduler.reload_schedule!
221
+ ```
196
222
 
197
- If the schedule did not exist it'll we created if it existed it'll be updated
223
+ If the schedule did not exist it'll we created, if it existed it'll be updated
198
224
 
199
- ### Testing
225
+ ### Testing
200
226
 
201
227
  In your tests you can check that a schedule change has been set you have to:
202
228
  ```ruby
@@ -37,7 +37,7 @@ module SidekiqScheduler
37
37
  # param, otherwise params is passed in as the only parameter to perform.
38
38
  def schedule=(schedule_hash)
39
39
  schedule_hash = prepare_schedule(schedule_hash)
40
- to_remove = (get_all_schedules || {}).keys - schedule_hash.keys
40
+ to_remove = (get_all_schedules || {}).keys - schedule_hash.keys.map(&:to_s)
41
41
 
42
42
  schedule_hash.each do |name, job_spec|
43
43
  set_schedule(name, job_spec)
@@ -1,5 +1,5 @@
1
1
  module SidekiqScheduler
2
2
 
3
- VERSION = '2.0.6'
3
+ VERSION = '2.0.7'
4
4
 
5
5
  end
@@ -7,6 +7,8 @@ module Sidekiq
7
7
  class Scheduler
8
8
  extend Sidekiq::Util
9
9
 
10
+ REGISTERED_JOBS_THRESHOLD_IN_SECONDS = 24 * 60 * 60
11
+
10
12
  # We expect rufus jobs to have #params
11
13
  Rufus::Scheduler::Job.module_eval do
12
14
 
@@ -100,18 +102,21 @@ module Sidekiq
100
102
  if config['rails_env'].nil? || self.rails_env_matches?(config)
101
103
  logger.info "Scheduling #{name} #{config}"
102
104
  interval_defined = false
103
- interval_types = %w{cron every at in}
105
+ interval_types = %w{cron every at in interval}
104
106
  interval_types.each do |interval_type|
105
- if !config[interval_type].nil? && config[interval_type].length > 0
106
- args = self.optionizate_interval_value(config[interval_type])
107
+ config_interval_type = config[interval_type]
108
+
109
+ if !config_interval_type.nil? && config_interval_type.length > 0
110
+
111
+ args = self.optionizate_interval_value(config_interval_type)
107
112
 
108
113
  # We want rufus_scheduler to return a job object, not a job id
109
114
  opts = { :job => true }
110
115
 
111
- @@scheduled_jobs[name] = self.rufus_scheduler.send(interval_type, *args, opts) do
112
- logger.info "queueing #{config['class']} (#{name})"
116
+ @@scheduled_jobs[name] = self.rufus_scheduler.send(interval_type, *args, opts) do |job, time|
113
117
  config.delete(interval_type)
114
- self.handle_errors { self.enqueue_job(config) }
118
+
119
+ idempotent_job_enqueue(name, time, config)
115
120
  end
116
121
 
117
122
  interval_defined = true
@@ -126,6 +131,25 @@ module Sidekiq
126
131
  end
127
132
  end
128
133
 
134
+ # Pushes the job into Sidekiq if not already pushed for the given time
135
+ #
136
+ # @param [String] job_name The job's name
137
+ # @param [Time] time The time when the job got cleared for triggering
138
+ # @param [Hash] config Job's config hash
139
+ def self.idempotent_job_enqueue(job_name, time, config)
140
+ registered = register_job_instance(job_name, time)
141
+
142
+ if registered
143
+ logger.info "queueing #{config['class']} (#{job_name})"
144
+
145
+ self.handle_errors { self.enqueue_job(config) }
146
+
147
+ remove_elder_job_instances(job_name)
148
+ else
149
+ logger.debug { "Ignoring #{job_name} job as it has been already enqueued" }
150
+ end
151
+ end
152
+
129
153
  # Returns true if the given schedule config hash matches the current
130
154
  # ENV['RAILS_ENV']
131
155
  def self.rails_env_matches?(config)
@@ -263,5 +287,38 @@ module Sidekiq
263
287
  queues.empty? || queues.include?(job_queue)
264
288
  end
265
289
 
290
+ # Registers a queued job instance
291
+ #
292
+ # @param [String] job_name The job's name
293
+ # @param [Time] time Time at which the job was cleared by the scheduler
294
+ #
295
+ # @return [Boolean] true if the job was registered, false when otherwise
296
+ def self.register_job_instance(job_name, time)
297
+ pushed_job_key = pushed_job_key(job_name)
298
+
299
+ registered, _ = Sidekiq.redis do |r|
300
+ r.pipelined do
301
+ r.zadd(pushed_job_key, time.to_i, time.to_i)
302
+ r.expire(pushed_job_key, REGISTERED_JOBS_THRESHOLD_IN_SECONDS)
303
+ end
304
+ end
305
+
306
+ registered
307
+ end
308
+
309
+ def self.remove_elder_job_instances(job_name)
310
+ Sidekiq.redis do |r|
311
+ r.zremrangebyscore(pushed_job_key(job_name), 0, Time.now.to_i - REGISTERED_JOBS_THRESHOLD_IN_SECONDS)
312
+ end
313
+ end
314
+
315
+ # Returns the key of the Redis sorted set used to store job enqueues
316
+ #
317
+ # @param [String] job_name The name of the job
318
+ #
319
+ # @return [String]
320
+ def self.pushed_job_key(job_name)
321
+ "sidekiq-scheduler:pushed:#{job_name}"
322
+ end
266
323
  end
267
324
  end
@@ -0,0 +1,9 @@
1
+ es:
2
+ recurring_jobs: Tareas Recurrentes
3
+ name: Nombre
4
+ description: Descripción
5
+ interval: Intervalo
6
+ class: Clase
7
+ queue: Cola
8
+ arguments: Argumentos
9
+ enqueue_now: Encolar ahora
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 2.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Morton Jonuschat
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-03-31 00:00:00.000000000 Z
12
+ date: 2016-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sidekiq
@@ -240,6 +240,7 @@ files:
240
240
  - lib/sidekiq/scheduler.rb
241
241
  - web/locales/cs.yml
242
242
  - web/locales/en.yml
243
+ - web/locales/es.yml
243
244
  - web/views/recurring_jobs.erb
244
245
  homepage: https://github.com/moove-it/sidekiq-scheduler
245
246
  licenses:
@@ -261,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
262
  version: '0'
262
263
  requirements: []
263
264
  rubyforge_project:
264
- rubygems_version: 2.4.5.1
265
+ rubygems_version: 2.4.5
265
266
  signing_key:
266
267
  specification_version: 4
267
268
  summary: Light weight job scheduling extension for Sidekiq