sidekiq-cron 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14e517dfc5120f0566a60c0aa5a3b8e68d714dca
4
- data.tar.gz: d68e25c487348b2c473b854d3c2d70c31a17dc56
3
+ metadata.gz: b058d0c5b73a34aed14caeb7f42f28160211d85c
4
+ data.tar.gz: 63e67fe94aca427cb37924ef6510e255f3525a85
5
5
  SHA512:
6
- metadata.gz: f75f115a12fff61f49b0f5e659c61ddb32307f6cbcf95768b4264b036889897ece81084edc79cad35b8424eb5da8732e55ce40cc32eb85fedbf27134a1bc5150
7
- data.tar.gz: 1326115dd62fce5b842fed9fde09dcadc9fe917169a038c8309777524526dffc67d2945b36f6fadc72f965b0f312c62ad950c6016094cc535dd68e946d12ff66
6
+ metadata.gz: cbf9eb136c8490a8d8eabd88fd4709df9f157835bf5ca4decf8b847f458efed8fb148b296b268c051ad5679187f6cf70df5d6482e1c113a0ece9ad5214690a76
7
+ data.tar.gz: 64baadd70d279c95b8d2381b29cd4c0f9f9097166a47f0f1b4a9cac5130943ee8041ec34b2fcdc00608fa924dfa9c6b0c5f760b169315fb5039b2c8fd81c819e
data/.travis.yml CHANGED
@@ -1,8 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - jruby-19mode
4
- - rbx-19mode
5
- - 2.0.0
3
+ - 2.3.1
6
4
  - 2.2.2
7
5
  services:
8
6
  - redis-server
data/Gemfile CHANGED
@@ -2,12 +2,12 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'sidekiq', '>= 4.2.1'
4
4
  gem 'rufus-scheduler', '>= 3.3.0'
5
- gem 'redis-namespace', '>= 1.5.2'
6
5
 
7
6
  group :development do
8
7
  gem 'bundler'
9
8
  gem 'simplecov'
10
9
 
10
+ gem 'redis-namespace', '>= 1.5.2'
11
11
  gem 'shoulda-context'
12
12
 
13
13
  gem 'rack'
data/README.md CHANGED
@@ -281,6 +281,10 @@ When you start the Sidekiq process, it starts one thread with `Sidekiq::Poller`
281
281
 
282
282
  Sidekiq-Cron adds itself into this start procedure and starts another thread with `Sidekiq::Cron::Poller` which checks all enabled Sidekiq cron jobs every 10 seconds, if they should be added to queue (their cronline matches time of check).
283
283
 
284
+ Sidekiq-Cron is checking jobs to be enqueued every 30s by default, you can change it by setting:
285
+ ```
286
+ Sidekiq.options[:poll_interval] = 10
287
+ ```
284
288
 
285
289
  ## Thanks to
286
290
  * [@7korobi](https://github.com/7korobi)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.1
1
+ 0.6.0
@@ -68,7 +68,7 @@ module Sidekiq
68
68
  end
69
69
  end
70
70
 
71
- save
71
+ save_last_enqueue_time
72
72
  logger.debug { "enqueued #{@name}: #{@message}" }
73
73
  end
74
74
 
@@ -451,6 +451,13 @@ module Sidekiq
451
451
  logger.info { "Cron Jobs - add job with name: #{@name}" }
452
452
  end
453
453
 
454
+ def save_last_enqueue_time
455
+ Sidekiq.redis do |conn|
456
+ # update last enqueue time
457
+ conn.hset redis_key, 'last_enqueue_time', @last_enqueue_time
458
+ end
459
+ end
460
+
454
461
  # remove job from cron jobs by name
455
462
  # input:
456
463
  # first arg: name (string) - name of job (must be same - case sensitive)
@@ -3,7 +3,12 @@ en:
3
3
  Cron: Cron
4
4
  CronJobs: Cron Jobs
5
5
  EnqueueNow: Enqueue Now
6
+ EnableAll: Enable All
7
+ DisableAll: Disable All
8
+ EnqueueAll: Enqueue All
9
+ DeleteAll: Delete All
6
10
  'Cron string': Cron
11
+ AreYouSureDeleteCronJobs: Are you sure you want to delete ALL cron jobs?
7
12
  AreYouSureDeleteCronJob: Are you sure you want to delete the %{job} cron job?
8
13
  NoCronJobsFound: "No cron jobs found"
9
14
  Enable: Enable
@@ -5,6 +5,8 @@ require 'sidekiq/scheduled'
5
5
 
6
6
  module Sidekiq
7
7
  module Cron
8
+ POLL_INTERVAL = 30
9
+
8
10
  # The Poller checks Redis every N seconds for sheduled cron jobs
9
11
  class Poller < Sidekiq::Scheduled::Poller
10
12
  def enqueue
@@ -28,6 +30,10 @@ module Sidekiq
28
30
  logger.error "CRON JOB: #{ex.message}"
29
31
  logger.error "CRON JOB: #{ex.backtrace.first}"
30
32
  end
33
+
34
+ def poll_interval_average
35
+ Sidekiq.options[:poll_interval] || POLL_INTERVAL
36
+ end
31
37
  end
32
38
  end
33
39
  end
@@ -1,8 +1,27 @@
1
1
  <header class='row'>
2
- <div class='span5 col-sm-5'>
2
+ <div class='col-sm-5 pull-left'>
3
3
  <h3><%=t 'CronJobs' %></h3>
4
4
  </div>
5
+ <div class='col-sm-7 pull-right' style="margin-top: 20px; margin-bottom: 10px;">
6
+ <form action="<%= root_path %>cron/__all__/delete" method="post" class="pull-right">
7
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
8
+ <input class="btn btn-small btn-danger" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSureDeleteCronJobs') %>">
9
+ </form>
10
+ <form action="<%= root_path %>cron/__all__/disable" method="post" class="pull-right">
11
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
12
+ <input class="btn btn-small" type="submit" name="enque" value="<%= t('DisableAll') %>" />
13
+ </form>
14
+ <form action="<%= root_path %>cron/__all__/enable" method="post" class="pull-right">
15
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
16
+ <input class="btn btn-small" type="submit" name="enque" value="<%= t('EnableAll') %>" />
17
+ </form>
18
+ <form action="<%= root_path %>cron/__all__/enque" method="post" class="pull-right">
19
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
20
+ <input class="btn btn-small" type="submit" name="enque" value="<%= t('EnqueueAll') %>" />
21
+ </form>
22
+ </div>
5
23
  </header>
24
+
6
25
  <% if @cron_jobs.size > 0 %>
7
26
 
8
27
  <table class="table table-hover table-bordered table-striped table-white">
@@ -1,6 +1,21 @@
1
1
  header.row
2
- .span5
2
+ .span.col-sm-5.pull-left
3
3
  h3 = t('CronJobs')
4
+
5
+ .span.col-sm-7.pull-right style="margin-top: 20px; margin-bottom: 10px;"
6
+ form.pull-right action="#{root_path}cron/__all__/delete" method="post"
7
+ = csrf_tag if respond_to?(:csrf_tag)
8
+ input.btn.btn-small.pull-left.btn-danger type="submit" name="enque" value="#{t('DeleteAll')}" data-confirm="#{t('AreYouSureDeleteCronJobs')}"
9
+ form.pull-right action="#{root_path}cron/__all__/disable" method="post"
10
+ = csrf_tag if respond_to?(:csrf_tag)
11
+ input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('DisableAll')}"
12
+ form.pull-right action="#{root_path}cron/__all__/enable" method="post"
13
+ = csrf_tag if respond_to?(:csrf_tag)
14
+ input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnableAll')}"
15
+ form.pull-right action="#{root_path}cron/__all__/enque" method="post"
16
+ = csrf_tag if respond_to?(:csrf_tag)
17
+ input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnqueueAll')}"
18
+
4
19
  - if @cron_jobs.size > 0
5
20
 
6
21
  table class="table table-hover table-bordered table-striped"
@@ -22,7 +22,9 @@ module Sidekiq
22
22
 
23
23
  #enque cron job
24
24
  app.post '/cron/:name/enque' do
25
- if job = Sidekiq::Cron::Job.find(route_params[:name])
25
+ if route_params[:name] === '__all__'
26
+ Sidekiq::Cron::Job.all.each(&:enque!)
27
+ elsif job = Sidekiq::Cron::Job.find(route_params[:name])
26
28
  job.enque!
27
29
  end
28
30
  redirect "#{root_path}cron"
@@ -30,7 +32,9 @@ module Sidekiq
30
32
 
31
33
  #delete schedule
32
34
  app.post '/cron/:name/delete' do
33
- if job = Sidekiq::Cron::Job.find(route_params[:name])
35
+ if route_params[:name] === '__all__'
36
+ Sidekiq::Cron::Job.all.each(&:destroy)
37
+ elsif job = Sidekiq::Cron::Job.find(route_params[:name])
34
38
  job.destroy
35
39
  end
36
40
  redirect "#{root_path}cron"
@@ -38,7 +42,9 @@ module Sidekiq
38
42
 
39
43
  #enable job
40
44
  app.post '/cron/:name/enable' do
41
- if job = Sidekiq::Cron::Job.find(route_params[:name])
45
+ if route_params[:name] === '__all__'
46
+ Sidekiq::Cron::Job.all.each(&:enable!)
47
+ elsif job = Sidekiq::Cron::Job.find(route_params[:name])
42
48
  job.enable!
43
49
  end
44
50
  redirect "#{root_path}cron"
@@ -46,7 +52,9 @@ module Sidekiq
46
52
 
47
53
  #disable job
48
54
  app.post '/cron/:name/disable' do
49
- if job = Sidekiq::Cron::Job.find(route_params[:name])
55
+ if route_params[:name] === '__all__'
56
+ Sidekiq::Cron::Job.all.each(&:disable!)
57
+ elsif job = Sidekiq::Cron::Job.find(route_params[:name])
50
58
  job.disable!
51
59
  end
52
60
  redirect "#{root_path}cron"
data/sidekiq-cron.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: sidekiq-cron 0.5.1 ruby lib
5
+ # stub: sidekiq-cron 0.6.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "sidekiq-cron"
9
- s.version = "0.5.1"
9
+ s.version = "0.6.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Ondrej Bartas"]
14
- s.date = "2017-04-13"
14
+ s.date = "2017-04-18"
15
15
  s.description = "Enables to set jobs to be run in specified time (using CRON notation)"
16
16
  s.email = "ondrej@bartas.cz"
17
17
  s.extra_rdoc_files = [
@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
44
44
  "lib/sidekiq/cron/web.rb",
45
45
  "lib/sidekiq/cron/web_extension.rb",
46
46
  "sidekiq-cron.gemspec",
47
+ "test/integration/performance_test.rb",
47
48
  "test/test_helper.rb",
48
49
  "test/unit/job_test.rb",
49
50
  "test/unit/poller_test.rb",
@@ -60,9 +61,9 @@ Gem::Specification.new do |s|
60
61
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
62
  s.add_runtime_dependency(%q<sidekiq>, [">= 4.2.1"])
62
63
  s.add_runtime_dependency(%q<rufus-scheduler>, [">= 3.3.0"])
63
- s.add_runtime_dependency(%q<redis-namespace>, [">= 1.5.2"])
64
64
  s.add_development_dependency(%q<bundler>, [">= 0"])
65
65
  s.add_development_dependency(%q<simplecov>, [">= 0"])
66
+ s.add_development_dependency(%q<redis-namespace>, [">= 1.5.2"])
66
67
  s.add_development_dependency(%q<shoulda-context>, [">= 0"])
67
68
  s.add_development_dependency(%q<rack>, [">= 0"])
68
69
  s.add_development_dependency(%q<rack-test>, [">= 0"])
@@ -78,9 +79,9 @@ Gem::Specification.new do |s|
78
79
  else
79
80
  s.add_dependency(%q<sidekiq>, [">= 4.2.1"])
80
81
  s.add_dependency(%q<rufus-scheduler>, [">= 3.3.0"])
81
- s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
82
82
  s.add_dependency(%q<bundler>, [">= 0"])
83
83
  s.add_dependency(%q<simplecov>, [">= 0"])
84
+ s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
84
85
  s.add_dependency(%q<shoulda-context>, [">= 0"])
85
86
  s.add_dependency(%q<rack>, [">= 0"])
86
87
  s.add_dependency(%q<rack-test>, [">= 0"])
@@ -97,9 +98,9 @@ Gem::Specification.new do |s|
97
98
  else
98
99
  s.add_dependency(%q<sidekiq>, [">= 4.2.1"])
99
100
  s.add_dependency(%q<rufus-scheduler>, [">= 3.3.0"])
100
- s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
101
101
  s.add_dependency(%q<bundler>, [">= 0"])
102
102
  s.add_dependency(%q<simplecov>, [">= 0"])
103
+ s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
103
104
  s.add_dependency(%q<shoulda-context>, [">= 0"])
104
105
  s.add_dependency(%q<rack>, [">= 0"])
105
106
  s.add_dependency(%q<rack-test>, [">= 0"])
@@ -0,0 +1,52 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require './test/test_helper'
3
+ require 'benchmark'
4
+
5
+ describe 'Perfromance Poller' do
6
+ X = 10000
7
+ before do
8
+ Sidekiq.redis = REDIS
9
+ Sidekiq.redis do |conn|
10
+ conn.flushdb
11
+ end
12
+
13
+ #clear all previous saved data from redis
14
+ Sidekiq.redis do |conn|
15
+ conn.keys("cron_job*").each do |key|
16
+ conn.del(key)
17
+ end
18
+ end
19
+
20
+ args = {
21
+ queue: "default",
22
+ cron: "*/2 * * * *",
23
+ klass: "CronTestClass"
24
+ }
25
+
26
+ X.times do |i|
27
+ Sidekiq::Cron::Job.create(args.merge(name: "Test#{i}"))
28
+ end
29
+
30
+ @poller = Sidekiq::Cron::Poller.new
31
+ now = Time.now.utc
32
+ enqueued_time = Time.new(now.year, now.month, now.day, now.hour + 1, 10, 5)
33
+ Time.stubs(:now).returns(enqueued_time)
34
+ end
35
+
36
+ it 'should enqueue 10000 jobs in less than 30s' do
37
+ Sidekiq.redis do |conn|
38
+ assert_equal 0, conn.llen("queue:default"), 'Queue should be empty'
39
+ end
40
+
41
+ bench = Benchmark.measure {
42
+ @poller.enqueue
43
+ }
44
+
45
+ Sidekiq.redis do |conn|
46
+ assert_equal X, conn.llen("queue:default"), 'Queue should be full'
47
+ end
48
+
49
+ puts "Perfomance test finished in #{bench.real}"
50
+ assert_operator 30, :>, bench.real
51
+ end
52
+ end
@@ -66,6 +66,14 @@ describe 'Cron web' do
66
66
  @cron_job_name = "TesQueueNameOfCronJob"
67
67
  end
68
68
 
69
+ it "disable and enable all cron jobs" do
70
+ post "/cron/__all__/disable"
71
+ assert_equal Sidekiq::Cron::Job.find(@name).status, "disabled"
72
+
73
+ post "/cron/__all__/enable"
74
+ assert_equal Sidekiq::Cron::Job.find(@name).status, "enabled"
75
+ end
76
+
69
77
  it "disable and enable cron job" do
70
78
  post "/cron/#{@name}/disable"
71
79
  assert_equal Sidekiq::Cron::Job.find(@name).status, "disabled"
@@ -74,6 +82,19 @@ describe 'Cron web' do
74
82
  assert_equal Sidekiq::Cron::Job.find(@name).status, "enabled"
75
83
  end
76
84
 
85
+ it "enqueue all jobs" do
86
+ Sidekiq.redis do |conn|
87
+ assert_equal 0, conn.llen("queue:default"), "Queue should have no jobs"
88
+ end
89
+
90
+ post "/cron/__all__/enque"
91
+
92
+ Sidekiq.redis do |conn|
93
+ assert_equal 1, conn.llen("queue:default"), "Queue should have 1 job in default"
94
+ assert_equal 1, conn.llen("queue:cron"), "Queue should have 1 job in cron"
95
+ end
96
+ end
97
+
77
98
  it "enqueue job" do
78
99
  Sidekiq.redis do |conn|
79
100
  assert_equal 0, conn.llen("queue:default"), "Queue should have no jobs"
@@ -106,5 +127,11 @@ describe 'Cron web' do
106
127
  post "/cron/#{@cron_job_name}/delete"
107
128
  assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have zero jobs"
108
129
  end
130
+
131
+ it "destroy all jobs" do
132
+ assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 job"
133
+ post "/cron/__all__/delete"
134
+ assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have zero jobs"
135
+ end
109
136
  end
110
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-cron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ondrej Bartas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-13 00:00:00.000000000 Z
11
+ date: 2017-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -39,21 +39,21 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 3.3.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: redis-namespace
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.5.2
48
- type: :runtime
47
+ version: '0'
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 1.5.2
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,19 +67,19 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: simplecov
70
+ name: redis-namespace
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 1.5.2
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 1.5.2
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: shoulda-context
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -281,6 +281,7 @@ files:
281
281
  - lib/sidekiq/cron/web.rb
282
282
  - lib/sidekiq/cron/web_extension.rb
283
283
  - sidekiq-cron.gemspec
284
+ - test/integration/performance_test.rb
284
285
  - test/test_helper.rb
285
286
  - test/unit/job_test.rb
286
287
  - test/unit/poller_test.rb