sidekiq-scheduler 3.1.1 → 4.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +69 -25
- data/lib/sidekiq-scheduler/extensions/web.rb +7 -4
- data/lib/sidekiq-scheduler/manager.rb +0 -4
- data/lib/sidekiq-scheduler/redis_manager.rb +12 -19
- data/lib/sidekiq-scheduler/schedule.rb +3 -1
- data/lib/sidekiq-scheduler/scheduler.rb +11 -26
- data/lib/sidekiq-scheduler/utils.rb +11 -0
- data/lib/sidekiq-scheduler/version.rb +1 -3
- data/lib/sidekiq-scheduler.rb +18 -4
- data/web/assets/stylesheets/recurring_jobs.css +4 -0
- data/web/views/recurring_jobs.erb +26 -2
- metadata +19 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46f14eafd933ccc91c36ba3b52babf250a9d17723d8a321b016bad2caaf36262
|
4
|
+
data.tar.gz: d285ce8992b380f98c05860883c54aa504c83df31aeba252297b1c02d35590a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe3a692c9419fe21b60333f4801c519fa9eb96b2c49f4f7ad9f6bb41001ac8c0b9884ffa01c19018fe5101e2419f09af3df93f3efcd4de11b87b108d785a5047
|
7
|
+
data.tar.gz: 264780676f625a002b67b88eb03ee12981a2e222889334799e76c1aefde9ec3d35fad50d645233bd27c195113ea14e5af68ad3d82b4f853e7342f6ae2c3d08c3
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# 4.0.2
|
2
|
+
|
3
|
+
- [**FIX**] Fix sidekiq deprecation warning when Sidekiq 6.5+ [#385](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/385)
|
4
|
+
- [**FIX**] Fix `#print_schedule` calling a method that doesn't exist in rufus scheduler [#388](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/388)
|
5
|
+
|
6
|
+
# 4.0.1
|
7
|
+
|
8
|
+
- [**FIX**] Add support for sidekiq 6.5 [#382](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/382)
|
9
|
+
|
10
|
+
# 4.0.0
|
11
|
+
|
12
|
+
- [**FIX**] Fix CSS not loading on Rails app when Sidekiq < 6 [#377](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/377)
|
13
|
+
- [**BREAKING CHANGE**] Drop support for Sidekiq 3 [f15e7ca1a5f3ab5b6fd3d7664d67723dba1fa1f1](https://github.com/sidekiq-scheduler/sidekiq-scheduler/commit/f15e7ca1a5f3ab5b6fd3d7664d67723dba1fa1f1)
|
14
|
+
|
15
|
+
# 4.0.0.alpha1
|
16
|
+
|
17
|
+
- [**FIX**] Fix deprecated uses of Redis#pipelined [#357](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/357)
|
18
|
+
- [**DOCS**] Add docs for running multi-sidekiq configurations [#362](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/362)
|
19
|
+
- [**FIX**] Prevent sidekiq_options from overriding ActiveJob queue settings [#367](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/367)
|
20
|
+
- [**ENHANCEMENT**] Highlight disabled jobs [#369](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/369)
|
21
|
+
- [**BREAKING CHANGE**] Require redis 4.2.0 [#370](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/370)
|
22
|
+
- [**FIX**] Fixes redis deprecation warning regarding `exists` [#370](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/370)
|
23
|
+
- [**BREAKING CHANGE**] Remove dependecy on thwait and e2mmap [#371](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/371)
|
24
|
+
- Support Ruby 3.1 [#373](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/373)
|
25
|
+
- [**BREAKING CHANGE**] Set rufus_scheduler_options via sidekiq.yml file as configuration option [#375](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/375)
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# sidekiq-scheduler
|
2
2
|
|
3
3
|
<p align="center">
|
4
|
-
<a href="http://
|
5
|
-
<img src="https://
|
4
|
+
<a href="http://sidekiq-scheduler.github.io/sidekiq-scheduler/">
|
5
|
+
<img src="https://sidekiq-scheduler.github.io/sidekiq-scheduler/images/small-logo.svg" width="468px" height="200px" alt="Sidekiq Scheduler" />
|
6
6
|
</a>
|
7
7
|
</p>
|
8
8
|
|
@@ -10,19 +10,7 @@
|
|
10
10
|
<a href="https://badge.fury.io/rb/sidekiq-scheduler">
|
11
11
|
<img src="https://badge.fury.io/rb/sidekiq-scheduler.svg" alt="Gem Version">
|
12
12
|
</a>
|
13
|
-
<a href="
|
14
|
-
<img src="https://codeclimate.com/github/moove-it/sidekiq-scheduler/badges/gpa.svg" alt="Code Climate">
|
15
|
-
</a>
|
16
|
-
<a href="https://travis-ci.org/moove-it/sidekiq-scheduler">
|
17
|
-
<img src="https://api.travis-ci.org/moove-it/sidekiq-scheduler.svg?branch=master" alt="Build Status">
|
18
|
-
</a>
|
19
|
-
<a href="https://coveralls.io/github/moove-it/sidekiq-scheduler?branch=master">
|
20
|
-
<img src="https://coveralls.io/repos/moove-it/sidekiq-scheduler/badge.svg?branch=master&service=github" alt="Coverage Status">
|
21
|
-
</a>
|
22
|
-
<a href="https://inch-ci.org/github/moove-it/sidekiq-scheduler">
|
23
|
-
<img src="https://inch-ci.org/github/moove-it/sidekiq-scheduler.svg?branch=master" alt="Documentation Coverage">
|
24
|
-
</a>
|
25
|
-
<a href="http://www.rubydoc.info/github/moove-it/sidekiq-scheduler">
|
13
|
+
<a href="http://www.rubydoc.info/github/sidekiq-scheduler/sidekiq-scheduler">
|
26
14
|
<img src="https://img.shields.io/badge/yard-docs-blue.svg" alt="Documentation">
|
27
15
|
</a>
|
28
16
|
</p>
|
@@ -30,7 +18,7 @@
|
|
30
18
|
`sidekiq-scheduler` is an extension to [Sidekiq](http://github.com/mperham/sidekiq) that
|
31
19
|
pushes jobs in a scheduled way, mimicking cron utility.
|
32
20
|
|
33
|
-
__Note:__
|
21
|
+
__Note:__ Current branch contains work of the v4 release, if you are looking for version 2.2.* or 3.*, go to [2.2-stable branch](https://github.com/sidekiq-scheduler/sidekiq-scheduler/tree/2.2-stable) / [v3-stable](https://github.com/sidekiq-scheduler/sidekiq-scheduler/tree/v3-stable).
|
34
22
|
|
35
23
|
## Installation
|
36
24
|
|
@@ -100,6 +88,7 @@ Available options are:
|
|
100
88
|
:enabled: <enables scheduler if true [true by default]>
|
101
89
|
:scheduler:
|
102
90
|
:listened_queues_only: <push jobs whose queue is being listened by sidekiq [false by default]>
|
91
|
+
:rufus_scheduler_options: <Set custom options for rufus scheduler, like max_work_threads [{} by default]>
|
103
92
|
```
|
104
93
|
|
105
94
|
## Schedule configuration
|
@@ -304,10 +293,16 @@ If you're configuring your own Redis connection pool, you need to make sure the
|
|
304
293
|
|
305
294
|
That's a minimum of `concurrency` + 5 (per the [Sidekiq wiki](https://github.com/mperham/sidekiq/wiki/Using-Redis#complete-control)) + `Rufus::Scheduler::MAX_WORK_THREADS` (28 as of this writing; per the [Rufus README](https://github.com/jmettraux/rufus-scheduler#max_work_threads)), for a total of 58 with the default `concurrency` of 25.
|
306
295
|
|
307
|
-
You can also override the thread pool size in Rufus Scheduler by setting
|
296
|
+
You can also override the thread pool size in Rufus Scheduler by setting the following in your `sidekiq.yml` config:
|
308
297
|
|
309
|
-
```
|
310
|
-
|
298
|
+
```yaml
|
299
|
+
---
|
300
|
+
...
|
301
|
+
|
302
|
+
rufus_scheduler_options:
|
303
|
+
max_work_threads: 5
|
304
|
+
|
305
|
+
...
|
311
306
|
```
|
312
307
|
|
313
308
|
## Notes about running on Multiple Hosts
|
@@ -321,7 +316,7 @@ Non-normal conditions that could push a specific job multiple times are:
|
|
321
316
|
|
322
317
|
`every`, `interval` and `in` jobs will be pushed once per host.
|
323
318
|
|
324
|
-
## Notes on when
|
319
|
+
## Notes on when Sidekiq worker is down
|
325
320
|
|
326
321
|
For a `cron`/`at` (and all other) job to be successfully enqueued, you need at least one sidekiq worker with scheduler to be up at that moment. Handling this is up to you and depends on your application.
|
327
322
|
|
@@ -334,6 +329,54 @@ Possible solutions include:
|
|
334
329
|
|
335
330
|
Each option has it's own pros and cons.
|
336
331
|
|
332
|
+
## Notes when running multiple Sidekiq processors on the same Redis
|
333
|
+
|
334
|
+
### TL;DR
|
335
|
+
|
336
|
+
Be **sure** to include the `:enabled: false` top-level key on any additional
|
337
|
+
configurations to avoid any possibility of the `schedules` definition being
|
338
|
+
wiped by the second Sidekiq process.
|
339
|
+
|
340
|
+
To illustrate what we mean:
|
341
|
+
|
342
|
+
Say you have one process with the schedule:
|
343
|
+
```yaml
|
344
|
+
# e.g., config/sidekiq.yml
|
345
|
+
|
346
|
+
:queues:
|
347
|
+
- default
|
348
|
+
:schedule:
|
349
|
+
do_something_every_minute:
|
350
|
+
class: DoSomethingJob
|
351
|
+
args: matey
|
352
|
+
queue: :scheduler
|
353
|
+
cron: '0 * * * * * America/Los_Angeles'
|
354
|
+
```
|
355
|
+
|
356
|
+
And a separate separate configured process without one:
|
357
|
+
```yaml
|
358
|
+
# e.g., config/sidekiq_other.yml
|
359
|
+
:queues:
|
360
|
+
- scheduler
|
361
|
+
|
362
|
+
## NOTE Disable the Scheduler
|
363
|
+
:enabled: false
|
364
|
+
```
|
365
|
+
|
366
|
+
### Details
|
367
|
+
|
368
|
+
This gem stores the configured schedule in Redis on boot. It's used, primarily,
|
369
|
+
to display in the Web Integration, and allow you to interact with that schedule
|
370
|
+
via that integration.
|
371
|
+
|
372
|
+
If you're running multiple Sidekiq processes on the same Redis namespace with
|
373
|
+
different configurations, **you'll want to explicitly _disable_ Sidekiq
|
374
|
+
Scheduler** for the other processes not responsible for the schedule. If you
|
375
|
+
don't, the last booted Sidekiq processes' schedule will be what is stored in
|
376
|
+
Redis.
|
377
|
+
|
378
|
+
See https://github.com/sidekiq-scheduler/sidekiq-scheduler/issues/361 for a more details.
|
379
|
+
|
337
380
|
## Sidekiq Web Integration
|
338
381
|
|
339
382
|
sidekiq-scheduler provides an extension to the Sidekiq web interface that adds a `Recurring Jobs` page.
|
@@ -347,7 +390,7 @@ require 'sidekiq-scheduler/web'
|
|
347
390
|
run Sidekiq::Web
|
348
391
|
```
|
349
392
|
|
350
|
-
![Sidekiq Web Integration](https://github.com/
|
393
|
+
![Sidekiq Web Integration](https://github.com/sidekiq-scheduler/sidekiq-scheduler/raw/master/images/recurring-jobs-ui-tab.png)
|
351
394
|
|
352
395
|
## ActiveJob integration
|
353
396
|
|
@@ -371,7 +414,7 @@ To see your updated schedule, be sure to reload Spring by stopping it prior to b
|
|
371
414
|
|
372
415
|
Run `spring stop` to stop Spring.
|
373
416
|
|
374
|
-
For more information, see [this issue](https://github.com/
|
417
|
+
For more information, see [this issue](https://github.com/sidekiq-scheduler/sidekiq-scheduler/issues/35#issuecomment-48067183) and [Spring's README](https://github.com/rails/spring/blob/master/README.md).
|
375
418
|
|
376
419
|
|
377
420
|
## Manage tasks from Unicorn/Rails server
|
@@ -408,6 +451,7 @@ MIT License
|
|
408
451
|
|
409
452
|
## Copyright
|
410
453
|
|
411
|
-
Copyright
|
412
|
-
Copyright
|
413
|
-
|
454
|
+
- Copyright 2021 - 2022 Marcelo Lauxen.
|
455
|
+
- Copyright 2013 - 2022 Moove-IT.
|
456
|
+
- Copyright 2012 Morton Jonuschat.
|
457
|
+
- Some parts copyright 2010 Ben VandenBos.
|
@@ -5,7 +5,10 @@ ASSETS_PATH = File.expand_path('../../../web/assets', __dir__)
|
|
5
5
|
Sidekiq::Web.register(SidekiqScheduler::Web)
|
6
6
|
Sidekiq::Web.tabs['recurring_jobs'] = 'recurring-jobs'
|
7
7
|
Sidekiq::Web.locales << File.expand_path("#{File.dirname(__FILE__)}/../../../web/locales")
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
|
9
|
+
if Sidekiq::VERSION >= '6.0.0'
|
10
|
+
Sidekiq::Web.use Rack::Static, urls: ['/stylesheets'],
|
11
|
+
root: ASSETS_PATH,
|
12
|
+
cascade: true,
|
13
|
+
header_rules: [[:all, { 'Cache-Control' => 'public, max-age=86400' }]]
|
14
|
+
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'redis'
|
2
2
|
|
3
|
-
require 'sidekiq/util'
|
4
|
-
|
5
3
|
require 'sidekiq-scheduler/schedule'
|
6
4
|
require 'sidekiq-scheduler/scheduler'
|
7
5
|
|
@@ -12,8 +10,6 @@ module SidekiqScheduler
|
|
12
10
|
# from Redis onto the work queues
|
13
11
|
#
|
14
12
|
class Manager
|
15
|
-
include Sidekiq::Util
|
16
|
-
|
17
13
|
DEFAULT_SCHEDULER_OPTIONS = {
|
18
14
|
enabled: true,
|
19
15
|
dynamic: false,
|
@@ -9,7 +9,7 @@ module SidekiqScheduler
|
|
9
9
|
#
|
10
10
|
# @return [String] schedule in JSON format
|
11
11
|
def self.get_job_schedule(name)
|
12
|
-
hget(
|
12
|
+
hget('schedules', name)
|
13
13
|
end
|
14
14
|
|
15
15
|
# Returns the state of a given job
|
@@ -44,7 +44,7 @@ module SidekiqScheduler
|
|
44
44
|
# @param [String] name The name of the job
|
45
45
|
# @param [Hash] config The new schedule for the job
|
46
46
|
def self.set_job_schedule(name, config)
|
47
|
-
hset(
|
47
|
+
hset('schedules', name, JSON.generate(config))
|
48
48
|
end
|
49
49
|
|
50
50
|
# Sets the state for a given job
|
@@ -75,7 +75,7 @@ module SidekiqScheduler
|
|
75
75
|
#
|
76
76
|
# @param [String] name The name of the job
|
77
77
|
def self.remove_job_schedule(name)
|
78
|
-
hdel(
|
78
|
+
hdel('schedules', name)
|
79
79
|
end
|
80
80
|
|
81
81
|
# Removes the next execution time for a given job
|
@@ -89,21 +89,14 @@ module SidekiqScheduler
|
|
89
89
|
#
|
90
90
|
# @return [Hash] hash with all the job schedules
|
91
91
|
def self.get_all_schedules
|
92
|
-
Sidekiq.redis { |r| r.hgetall(
|
92
|
+
Sidekiq.redis { |r| r.hgetall('schedules') }
|
93
93
|
end
|
94
94
|
|
95
95
|
# Returns boolean value that indicates if the schedules value exists
|
96
96
|
#
|
97
97
|
# @return [Boolean] true if the schedules key is set, false otherwise
|
98
98
|
def self.schedule_exist?
|
99
|
-
Sidekiq.redis
|
100
|
-
case r.exists(:schedules)
|
101
|
-
when true, 1
|
102
|
-
true
|
103
|
-
else
|
104
|
-
false
|
105
|
-
end
|
106
|
-
end
|
99
|
+
Sidekiq.redis { |r| r.exists?('schedules') }
|
107
100
|
end
|
108
101
|
|
109
102
|
# Returns all the schedule changes for a given time range.
|
@@ -113,19 +106,19 @@ module SidekiqScheduler
|
|
113
106
|
#
|
114
107
|
# @return [Array] array with all the changed job names
|
115
108
|
def self.get_schedule_changes(from, to)
|
116
|
-
Sidekiq.redis { |r| r.zrangebyscore(
|
109
|
+
Sidekiq.redis { |r| r.zrangebyscore('schedules_changed', from, "(#{to}") }
|
117
110
|
end
|
118
111
|
|
119
112
|
# Register a schedule change for a given job
|
120
113
|
#
|
121
114
|
# @param [String] name The name of the job
|
122
115
|
def self.add_schedule_change(name)
|
123
|
-
Sidekiq.redis { |r| r.zadd(
|
116
|
+
Sidekiq.redis { |r| r.zadd('schedules_changed', Time.now.to_f, name) }
|
124
117
|
end
|
125
118
|
|
126
119
|
# Remove all the schedule changes records
|
127
120
|
def self.clean_schedules_changed
|
128
|
-
Sidekiq.redis { |r| r.del(
|
121
|
+
Sidekiq.redis { |r| r.del('schedules_changed') unless r.type('schedules_changed') == 'zset' }
|
129
122
|
end
|
130
123
|
|
131
124
|
# Removes a queued job instance
|
@@ -137,9 +130,9 @@ module SidekiqScheduler
|
|
137
130
|
def self.register_job_instance(job_name, time)
|
138
131
|
job_key = pushed_job_key(job_name)
|
139
132
|
registered, _ = Sidekiq.redis do |r|
|
140
|
-
r.pipelined do
|
141
|
-
|
142
|
-
|
133
|
+
r.pipelined do |pipeline|
|
134
|
+
pipeline.zadd(job_key, time.to_i, time.to_i)
|
135
|
+
pipeline.expire(job_key, REGISTERED_JOBS_THRESHOLD_IN_SECONDS)
|
143
136
|
end
|
144
137
|
end
|
145
138
|
|
@@ -188,7 +181,7 @@ module SidekiqScheduler
|
|
188
181
|
end
|
189
182
|
|
190
183
|
private
|
191
|
-
|
184
|
+
|
192
185
|
# Returns the value of a Redis stored hash field
|
193
186
|
#
|
194
187
|
# @param [String] hash_key The key name of the hash
|
@@ -140,7 +140,9 @@ module SidekiqScheduler
|
|
140
140
|
def infer_queue(klass)
|
141
141
|
klass = try_to_constantize(klass)
|
142
142
|
|
143
|
-
|
143
|
+
# ActiveJob uses queue_as when the job is created
|
144
|
+
# to determine the queue
|
145
|
+
if klass.respond_to?(:sidekiq_options) && !SidekiqScheduler::Utils.active_job_enqueue?(klass)
|
144
146
|
klass.sidekiq_options['queue']
|
145
147
|
end
|
146
148
|
end
|
@@ -1,14 +1,10 @@
|
|
1
1
|
require 'rufus/scheduler'
|
2
|
-
require 'thwait'
|
3
|
-
require 'sidekiq/util'
|
4
2
|
require 'json'
|
5
3
|
require 'sidekiq-scheduler/rufus_utils'
|
6
4
|
require 'sidekiq-scheduler/redis_manager'
|
7
5
|
|
8
6
|
module SidekiqScheduler
|
9
7
|
class Scheduler
|
10
|
-
extend Sidekiq::Util
|
11
|
-
|
12
8
|
# We expect rufus jobs to have #params
|
13
9
|
Rufus::Scheduler::Job.module_eval do
|
14
10
|
alias_method :params, :opts
|
@@ -26,6 +22,9 @@ module SidekiqScheduler
|
|
26
22
|
# Set to schedule jobs only when will be pushed to queues listened by sidekiq
|
27
23
|
attr_accessor :listened_queues_only
|
28
24
|
|
25
|
+
# Set custom options for rufus scheduler, like max_work_threads.
|
26
|
+
attr_accessor :rufus_scheduler_options
|
27
|
+
|
29
28
|
class << self
|
30
29
|
|
31
30
|
def instance
|
@@ -47,6 +46,7 @@ module SidekiqScheduler
|
|
47
46
|
self.dynamic = options[:dynamic]
|
48
47
|
self.dynamic_every = options[:dynamic_every]
|
49
48
|
self.listened_queues_only = options[:listened_queues_only]
|
49
|
+
self.rufus_scheduler_options = options[:rufus_scheduler_options] || {}
|
50
50
|
end
|
51
51
|
|
52
52
|
# the Rufus::Scheduler jobs that are scheduled
|
@@ -57,7 +57,7 @@ module SidekiqScheduler
|
|
57
57
|
def print_schedule
|
58
58
|
if rufus_scheduler
|
59
59
|
Sidekiq.logger.info "Scheduling Info\tLast Run"
|
60
|
-
scheduler_jobs = rufus_scheduler.
|
60
|
+
scheduler_jobs = rufus_scheduler.jobs
|
61
61
|
scheduler_jobs.each_value do |v|
|
62
62
|
Sidekiq.logger.info "#{v.t}\t#{v.last}\t"
|
63
63
|
end
|
@@ -161,21 +161,13 @@ module SidekiqScheduler
|
|
161
161
|
config['args'] = arguments_with_metadata(config['args'], scheduled_at: time.to_f)
|
162
162
|
end
|
163
163
|
|
164
|
-
if active_job_enqueue?(config['class'])
|
164
|
+
if SidekiqScheduler::Utils.active_job_enqueue?(config['class'])
|
165
165
|
SidekiqScheduler::Utils.enqueue_with_active_job(config)
|
166
166
|
else
|
167
167
|
SidekiqScheduler::Utils.enqueue_with_sidekiq(config)
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
171
|
-
def rufus_scheduler_options
|
172
|
-
@rufus_scheduler_options ||= {}
|
173
|
-
end
|
174
|
-
|
175
|
-
def rufus_scheduler_options=(options)
|
176
|
-
@rufus_scheduler_options = options
|
177
|
-
end
|
178
|
-
|
179
171
|
def rufus_scheduler
|
180
172
|
@rufus_scheduler ||= SidekiqScheduler::Utils.new_rufus_scheduler(rufus_scheduler_options)
|
181
173
|
end
|
@@ -292,7 +284,11 @@ module SidekiqScheduler
|
|
292
284
|
end
|
293
285
|
|
294
286
|
def sidekiq_queues
|
295
|
-
|
287
|
+
if SIDEKIQ_GTE_6_5_0
|
288
|
+
Sidekiq[:queues].map(&:to_s)
|
289
|
+
else
|
290
|
+
Sidekiq.options[:queues].map(&:to_s)
|
291
|
+
end
|
296
292
|
end
|
297
293
|
|
298
294
|
# Returns true if a job's queue is included in the array of queues
|
@@ -307,17 +303,6 @@ module SidekiqScheduler
|
|
307
303
|
queues.empty? || queues.include?(job_queue)
|
308
304
|
end
|
309
305
|
|
310
|
-
# Returns true if the enqueuing needs to be done for an ActiveJob
|
311
|
-
# class false otherwise.
|
312
|
-
#
|
313
|
-
# @param [Class] klass the class to check is decendant from ActiveJob
|
314
|
-
#
|
315
|
-
# @return [Boolean]
|
316
|
-
def active_job_enqueue?(klass)
|
317
|
-
klass.is_a?(Class) && defined?(ActiveJob::Enqueuing) &&
|
318
|
-
klass.included_modules.include?(ActiveJob::Enqueuing)
|
319
|
-
end
|
320
|
-
|
321
306
|
# Convert the given arguments in the format expected to be enqueued.
|
322
307
|
#
|
323
308
|
# @param [Hash] config the options to be converted
|
@@ -68,6 +68,17 @@ module SidekiqScheduler
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
# Returns true if the enqueuing needs to be done for an ActiveJob
|
72
|
+
# class false otherwise.
|
73
|
+
#
|
74
|
+
# @param [Class] klass the class to check is decendant from ActiveJob
|
75
|
+
#
|
76
|
+
# @return [Boolean]
|
77
|
+
def self.active_job_enqueue?(klass)
|
78
|
+
klass.is_a?(Class) && defined?(ActiveJob::Enqueuing) &&
|
79
|
+
klass.included_modules.include?(ActiveJob::Enqueuing)
|
80
|
+
end
|
81
|
+
|
71
82
|
# Enqueues the job using the Sidekiq client.
|
72
83
|
#
|
73
84
|
# @param [Hash] config The job configuration
|
data/lib/sidekiq-scheduler.rb
CHANGED
@@ -7,19 +7,33 @@ require_relative 'sidekiq-scheduler/manager'
|
|
7
7
|
require_relative 'sidekiq-scheduler/redis_manager'
|
8
8
|
require_relative 'sidekiq-scheduler/extensions/schedule'
|
9
9
|
|
10
|
+
SIDEKIQ_GTE_6_5_0 = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('6.5.0')
|
11
|
+
|
10
12
|
Sidekiq.configure_server do |config|
|
11
13
|
|
12
14
|
config.on(:startup) do
|
13
15
|
# schedules_changed's type was changed from SET to ZSET, so we remove old versions at startup
|
14
16
|
SidekiqScheduler::RedisManager.clean_schedules_changed
|
15
17
|
|
16
|
-
|
17
|
-
config.options
|
18
|
-
|
18
|
+
# Accessing the raw @config hash through .options is deprecated in 6.5 and to be removed in 7.0
|
19
|
+
config_options = SIDEKIQ_GTE_6_5_0 ? Sidekiq.instance_variable_get(:@config) : config.options
|
20
|
+
|
21
|
+
schedule_manager = SidekiqScheduler::Manager.new(config_options)
|
22
|
+
if SIDEKIQ_GTE_6_5_0
|
23
|
+
config[:schedule_manager] = schedule_manager
|
24
|
+
config[:schedule_manager].start
|
25
|
+
else
|
26
|
+
config.options[:schedule_manager] = schedule_manager
|
27
|
+
config.options[:schedule_manager].start
|
28
|
+
end
|
19
29
|
end
|
20
30
|
|
21
31
|
config.on(:quiet) do
|
22
|
-
|
32
|
+
if SIDEKIQ_GTE_6_5_0
|
33
|
+
config[:schedule_manager].stop
|
34
|
+
else
|
35
|
+
config.options[:schedule_manager].stop
|
36
|
+
end
|
23
37
|
end
|
24
38
|
|
25
39
|
end
|
@@ -1,11 +1,35 @@
|
|
1
|
-
|
1
|
+
<% if Sidekiq::VERSION >= '6.0.0' %>
|
2
|
+
<link href="<%= root_path %>stylesheets/recurring_jobs.css" media="screen" rel="stylesheet" type="text/css" />
|
3
|
+
<% else %>
|
4
|
+
<style>
|
5
|
+
.recurring-jobs { border-top-left-radius: 4px; border-top-right-radius: 4px; }
|
6
|
+
.recurring-jobs .title { margin-bottom: 5px; }
|
7
|
+
.recurring-jobs .title .name { font-weight: bold;}
|
8
|
+
.recurring-jobs .info,
|
9
|
+
.recurring-jobs .description { margin-bottom: 5px; }
|
10
|
+
.recurring-jobs .actions { margin-bottom: 5px; }
|
11
|
+
.recurring-jobs .status,
|
12
|
+
.recurring-jobs .description { font-size: 12px; }
|
13
|
+
.recurring-jobs .enqueue { margin-bottom: 0.5rem }
|
14
|
+
|
15
|
+
.list-group-item {
|
16
|
+
background-color: #f3f3f3;
|
17
|
+
color: #585454;
|
18
|
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
19
|
+
}
|
20
|
+
|
21
|
+
.list-group-item-disabled {
|
22
|
+
background-color: #f3d3d3;
|
23
|
+
}
|
24
|
+
</style>
|
25
|
+
<% end %>
|
2
26
|
|
3
27
|
<h3><%= t('recurring_jobs') %></h3>
|
4
28
|
|
5
29
|
<div class="recurring-jobs">
|
6
30
|
<ul class="list-group">
|
7
31
|
<% @presented_jobs.each do |job| %>
|
8
|
-
<li class="list-group-item">
|
32
|
+
<li class="list-group-item <%= !job.enabled? && "list-group-item-disabled" %>">
|
9
33
|
<div class="title">
|
10
34
|
<div class="row">
|
11
35
|
<div class="col-xs-6">
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Morton Jonuschat
|
8
8
|
- Moove-it
|
9
|
+
- Marcelo Lauxen
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2022-
|
13
|
+
date: 2022-06-27 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: sidekiq
|
@@ -17,34 +18,28 @@ dependencies:
|
|
17
18
|
requirements:
|
18
19
|
- - ">="
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
21
|
+
version: '4'
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
26
|
- - ">="
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
28
|
+
version: '4'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
30
|
name: redis
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
33
|
- - ">="
|
33
34
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
35
|
-
- - "<"
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '5'
|
35
|
+
version: 4.2.0
|
38
36
|
type: :runtime
|
39
37
|
prerelease: false
|
40
38
|
version_requirements: !ruby/object:Gem::Requirement
|
41
39
|
requirements:
|
42
40
|
- - ">="
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
version:
|
45
|
-
- - "<"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '5'
|
42
|
+
version: 4.2.0
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: rufus-scheduler
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,34 +68,6 @@ dependencies:
|
|
73
68
|
- - ">="
|
74
69
|
- !ruby/object:Gem::Version
|
75
70
|
version: 1.4.0
|
76
|
-
- !ruby/object:Gem::Dependency
|
77
|
-
name: thwait
|
78
|
-
requirement: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
type: :runtime
|
84
|
-
prerelease: false
|
85
|
-
version_requirements: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
name: e2mmap
|
92
|
-
requirement: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
type: :runtime
|
98
|
-
prerelease: false
|
99
|
-
version_requirements: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
71
|
- !ruby/object:Gem::Dependency
|
105
72
|
name: rake
|
106
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,28 +86,28 @@ dependencies:
|
|
119
86
|
name: timecop
|
120
87
|
requirement: !ruby/object:Gem::Requirement
|
121
88
|
requirements:
|
122
|
-
- - "
|
89
|
+
- - ">="
|
123
90
|
- !ruby/object:Gem::Version
|
124
91
|
version: '0'
|
125
92
|
type: :development
|
126
93
|
prerelease: false
|
127
94
|
version_requirements: !ruby/object:Gem::Requirement
|
128
95
|
requirements:
|
129
|
-
- - "
|
96
|
+
- - ">="
|
130
97
|
- !ruby/object:Gem::Version
|
131
98
|
version: '0'
|
132
99
|
- !ruby/object:Gem::Dependency
|
133
100
|
name: mocha
|
134
101
|
requirement: !ruby/object:Gem::Requirement
|
135
102
|
requirements:
|
136
|
-
- - "
|
103
|
+
- - ">="
|
137
104
|
- !ruby/object:Gem::Version
|
138
105
|
version: '0'
|
139
106
|
type: :development
|
140
107
|
prerelease: false
|
141
108
|
version_requirements: !ruby/object:Gem::Requirement
|
142
109
|
requirements:
|
143
|
-
- - "
|
110
|
+
- - ">="
|
144
111
|
- !ruby/object:Gem::Version
|
145
112
|
version: '0'
|
146
113
|
- !ruby/object:Gem::Dependency
|
@@ -163,30 +130,16 @@ dependencies:
|
|
163
130
|
requirements:
|
164
131
|
- - "~>"
|
165
132
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0.
|
133
|
+
version: 0.28.0
|
167
134
|
type: :development
|
168
135
|
prerelease: false
|
169
136
|
version_requirements: !ruby/object:Gem::Requirement
|
170
137
|
requirements:
|
171
138
|
- - "~>"
|
172
139
|
- !ruby/object:Gem::Version
|
173
|
-
version: 0.
|
140
|
+
version: 0.28.0
|
174
141
|
- !ruby/object:Gem::Dependency
|
175
142
|
name: simplecov
|
176
|
-
requirement: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '0'
|
181
|
-
type: :development
|
182
|
-
prerelease: false
|
183
|
-
version_requirements: !ruby/object:Gem::Requirement
|
184
|
-
requirements:
|
185
|
-
- - "~>"
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '0'
|
188
|
-
- !ruby/object:Gem::Dependency
|
189
|
-
name: byebug
|
190
143
|
requirement: !ruby/object:Gem::Requirement
|
191
144
|
requirements:
|
192
145
|
- - ">="
|
@@ -200,7 +153,7 @@ dependencies:
|
|
200
153
|
- !ruby/object:Gem::Version
|
201
154
|
version: '0'
|
202
155
|
- !ruby/object:Gem::Dependency
|
203
|
-
name:
|
156
|
+
name: byebug
|
204
157
|
requirement: !ruby/object:Gem::Requirement
|
205
158
|
requirements:
|
206
159
|
- - ">="
|
@@ -214,7 +167,7 @@ dependencies:
|
|
214
167
|
- !ruby/object:Gem::Version
|
215
168
|
version: '0'
|
216
169
|
- !ruby/object:Gem::Dependency
|
217
|
-
name:
|
170
|
+
name: activejob
|
218
171
|
requirement: !ruby/object:Gem::Requirement
|
219
172
|
requirements:
|
220
173
|
- - ">="
|
@@ -259,10 +212,12 @@ description: Light weight job scheduling extension for Sidekiq that adds support
|
|
259
212
|
queueing jobs in a recurring way.
|
260
213
|
email:
|
261
214
|
- sidekiq-scheduler@moove-it.com
|
215
|
+
- marcelolauxen16@gmail.com
|
262
216
|
executables: []
|
263
217
|
extensions: []
|
264
218
|
extra_rdoc_files: []
|
265
219
|
files:
|
220
|
+
- CHANGELOG.md
|
266
221
|
- MIT-LICENSE
|
267
222
|
- README.md
|
268
223
|
- Rakefile
|
@@ -294,7 +249,7 @@ files:
|
|
294
249
|
- web/locales/sv.yml
|
295
250
|
- web/locales/zh-cn.yml
|
296
251
|
- web/views/recurring_jobs.erb
|
297
|
-
homepage: https://
|
252
|
+
homepage: https://sidekiq-scheduler.github.io/sidekiq-scheduler/
|
298
253
|
licenses:
|
299
254
|
- MIT
|
300
255
|
metadata: {}
|
@@ -306,7 +261,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
306
261
|
requirements:
|
307
262
|
- - ">="
|
308
263
|
- !ruby/object:Gem::Version
|
309
|
-
version: '
|
264
|
+
version: '2.5'
|
310
265
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
311
266
|
requirements:
|
312
267
|
- - ">="
|