sneakers 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/README.md +5 -6
- data/lib/sneakers/handlers/maxretry.rb +1 -0
- data/lib/sneakers/queue.rb +1 -1
- data/lib/sneakers/runner.rb +3 -3
- data/lib/sneakers/spawner.rb +27 -0
- data/lib/sneakers/tasks.rb +2 -2
- data/lib/sneakers/version.rb +1 -1
- data/lib/sneakers/workergroup.rb +1 -1
- data/sneakers.gemspec +2 -1
- data/spec/sneakers/publisher_spec.rb +5 -0
- data/spec/sneakers/queue_spec.rb +3 -3
- data/spec/sneakers/worker_spec.rb +39 -2
- data/spec/spec_helper.rb +1 -0
- metadata +21 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 955c1e3e788a76c97ae9b89ee240a9a2d3f4aaf8
|
4
|
+
data.tar.gz: 28a4049a67567ba36e434a471e280ba0f5fe20b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9405f6a0baf93ddf0211f7437138228e6bdeb76247d64675a8211775f540654bb89efe44497f5502d1582cf7855bae5d38c45986a167c3e39cd580ac2c98d24b
|
7
|
+
data.tar.gz: 11b4a380a5b3a3e596f294d7406c8afed06a7d9e5679dd12907bc543e00580e05f18cb71331ef16c24e6b1881cadb8df90d29317e4ed8573b0d8de946c877ab3
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -20,6 +20,9 @@ Visit the [wiki](https://github.com/jondot/sneakers/wiki) for
|
|
20
20
|
complete docs.
|
21
21
|
|
22
22
|
|
23
|
+
[![Build Status](https://travis-ci.org/jondot/sneakers.svg?branch=master)](https://travis-ci.org/jondot/sneakers)
|
24
|
+
|
25
|
+
|
23
26
|
## Installation
|
24
27
|
|
25
28
|
Add this line to your application's Gemfile:
|
@@ -153,17 +156,13 @@ Fork, implement, add tests, pull request, get my everlasting thanks and a respec
|
|
153
156
|
|
154
157
|
### Thanks:
|
155
158
|
|
156
|
-
|
157
|
-
* Ariel Zerahia - @arielze
|
158
|
-
* @sergei-matheson
|
159
|
-
* Sebastian Edwards - @SebastianEdwards
|
160
|
-
* Tor Ivry - @torkale
|
159
|
+
To all Sneakers [Contributors](https://github.com/jondot/sneakers/graphs/contributors) - you make this happen, thanks!
|
161
160
|
|
162
161
|
|
163
162
|
|
164
163
|
# Copyright
|
165
164
|
|
166
|
-
Copyright (c)
|
165
|
+
Copyright (c) 2015 [Dotan Nahum](http://gplus.to/dotan) [@jondot](http://twitter.com/jondot). See MIT-LICENSE for further details.
|
167
166
|
|
168
167
|
|
169
168
|
|
data/lib/sneakers/queue.rb
CHANGED
@@ -46,7 +46,7 @@ class Sneakers::Queue
|
|
46
46
|
handler_klass = worker.opts[:handler] || Sneakers::CONFIG[:handler]
|
47
47
|
handler = handler_klass.new(@channel, queue, worker.opts)
|
48
48
|
|
49
|
-
@consumer = queue.subscribe(:block => false, :
|
49
|
+
@consumer = queue.subscribe(:block => false, :manual_ack => @opts[:ack]) do | delivery_info, metadata, msg |
|
50
50
|
worker.do_work(delivery_info, metadata, msg, handler)
|
51
51
|
end
|
52
52
|
nil
|
data/lib/sneakers/runner.rb
CHANGED
@@ -4,7 +4,7 @@ require 'sneakers/workergroup'
|
|
4
4
|
module Sneakers
|
5
5
|
class Runner
|
6
6
|
def initialize(worker_classes, opts={})
|
7
|
-
@runnerconfig = RunnerConfig.new(worker_classes)
|
7
|
+
@runnerconfig = RunnerConfig.new(worker_classes, opts)
|
8
8
|
end
|
9
9
|
|
10
10
|
def run
|
@@ -29,9 +29,9 @@ module Sneakers
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
def initialize(worker_classes)
|
32
|
+
def initialize(worker_classes, opts)
|
33
33
|
@worker_classes = worker_classes
|
34
|
-
@conf =
|
34
|
+
@conf = opts
|
35
35
|
end
|
36
36
|
|
37
37
|
def to_h
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Sneakers
|
4
|
+
class Spawner
|
5
|
+
|
6
|
+
def self.spawn
|
7
|
+
worker_group_config_file = ENV['WORKER_GROUP_CONFIG'] || "./config/sneaker_worker_groups.yml"
|
8
|
+
unless File.exists?(worker_group_config_file)
|
9
|
+
puts "No worker group file found."
|
10
|
+
puts "Specify via ENV 'WORKER_GROUP_CONFIG' or by convention ./config/sneaker_worker_groups.yml"
|
11
|
+
end
|
12
|
+
@pids = []
|
13
|
+
@exec_string = "bundle exec rake sneakers:run"
|
14
|
+
worker_config = YAML.load(File.read(worker_group_config_file))
|
15
|
+
worker_config.keys.each do |group_name|
|
16
|
+
@pids << fork do
|
17
|
+
@exec_hash = {"WORKERS"=> worker_config[group_name]['classes'], "WORKER_COUNT" => worker_config[group_name]["workers"].to_s}
|
18
|
+
Kernel.exec(@exec_hash, @exec_string)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
["TERM", "USR1", "HUP", "USR2"].each do |signal|
|
22
|
+
Signal.trap(signal){ @pids.each{|pid| Process.kill(signal, pid) } }
|
23
|
+
end
|
24
|
+
Process.waitall
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/sneakers/tasks.rb
CHANGED
@@ -26,8 +26,8 @@ Please set the classes of the workers you want to run like so:
|
|
26
26
|
EOF
|
27
27
|
exit(1)
|
28
28
|
end
|
29
|
-
|
30
|
-
r = Sneakers::Runner.new(workers)
|
29
|
+
opts = (ENV['WORKER_COUNT'].present? ? {:workers => ENV['WORKER_COUNT'].to_i} : {})
|
30
|
+
r = Sneakers::Runner.new(workers, opts)
|
31
31
|
|
32
32
|
r.run
|
33
33
|
end
|
data/lib/sneakers/version.rb
CHANGED
data/lib/sneakers/workergroup.rb
CHANGED
@@ -28,7 +28,7 @@ module Sneakers
|
|
28
28
|
# end per worker
|
29
29
|
#
|
30
30
|
until @stop_flag.wait_for_set(10.0)
|
31
|
-
Sneakers.logger.
|
31
|
+
Sneakers.logger.debug("Heartbeat: running threads [#{Thread.list.count}]")
|
32
32
|
# report aggregated stats?
|
33
33
|
end
|
34
34
|
|
data/sneakers.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(/^(test|spec|features)\//)
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
gem.add_dependency 'serverengine'
|
20
|
-
gem.add_dependency 'bunny', '~> 1.
|
20
|
+
gem.add_dependency 'bunny', '~> 1.7.0'
|
21
21
|
gem.add_dependency 'thread'
|
22
22
|
gem.add_dependency 'thor'
|
23
23
|
|
@@ -29,5 +29,6 @@ Gem::Specification.new do |gem|
|
|
29
29
|
gem.add_development_dependency 'simplecov'
|
30
30
|
gem.add_development_dependency 'simplecov-rcov-text'
|
31
31
|
gem.add_development_dependency 'rake'
|
32
|
+
gem.add_development_dependency 'minitest'
|
32
33
|
end
|
33
34
|
|
@@ -3,6 +3,11 @@ require 'sneakers'
|
|
3
3
|
|
4
4
|
describe Sneakers::Publisher do
|
5
5
|
describe '#publish' do
|
6
|
+
before do
|
7
|
+
Sneakers.clear!
|
8
|
+
Sneakers.configure(:log => 'sneakers.log')
|
9
|
+
end
|
10
|
+
|
6
11
|
it 'should publish a message to an exchange' do
|
7
12
|
xchg = Object.new
|
8
13
|
mock(xchg).publish('test msg', routing_key: 'downloads')
|
data/spec/sneakers/queue_spec.rb
CHANGED
@@ -44,7 +44,7 @@ describe Sneakers::Queue do
|
|
44
44
|
q = Sneakers::Queue.new("downloads", queue_vars)
|
45
45
|
|
46
46
|
mock(@mkqueue).bind(@mkex, :routing_key => "downloads")
|
47
|
-
mock(@mkqueue).subscribe(:block => false, :
|
47
|
+
mock(@mkqueue).subscribe(:block => false, :manual_ack => true)
|
48
48
|
|
49
49
|
q.subscribe(@mkworker)
|
50
50
|
end
|
@@ -56,7 +56,7 @@ describe Sneakers::Queue do
|
|
56
56
|
|
57
57
|
mock(@mkqueue).bind(@mkex, :routing_key => "alpha")
|
58
58
|
mock(@mkqueue).bind(@mkex, :routing_key => "beta")
|
59
|
-
mock(@mkqueue).subscribe(:block => false, :
|
59
|
+
mock(@mkqueue).subscribe(:block => false, :manual_ack => true)
|
60
60
|
|
61
61
|
q.subscribe(@mkworker)
|
62
62
|
end
|
@@ -80,7 +80,7 @@ describe Sneakers::Queue do
|
|
80
80
|
q = Sneakers::Queue.new("test_nondurable", queue_vars)
|
81
81
|
|
82
82
|
mock(@mkqueue_nondurable).bind(@mkex, :routing_key => "test_nondurable")
|
83
|
-
mock(@mkqueue_nondurable).subscribe(:block => false, :
|
83
|
+
mock(@mkqueue_nondurable).subscribe(:block => false, :manual_ack => true)
|
84
84
|
|
85
85
|
q.subscribe(@mkworker)
|
86
86
|
myqueue = q.instance_variable_get(:@queue)
|
@@ -131,6 +131,7 @@ describe Sneakers::Worker do
|
|
131
131
|
stub(@queue).opts { {} }
|
132
132
|
stub(@queue).exchange { @exchange }
|
133
133
|
|
134
|
+
Sneakers.clear!
|
134
135
|
Sneakers.configure(:daemonize => true, :log => 'sneakers.log')
|
135
136
|
Sneakers::Worker.configure_metrics
|
136
137
|
end
|
@@ -160,14 +161,50 @@ describe Sneakers::Worker do
|
|
160
161
|
it "should build a queue with correct configuration given defaults" do
|
161
162
|
@defaults_q.name.must_equal('defaults')
|
162
163
|
@defaults_q.opts.to_hash.must_equal(
|
163
|
-
|
164
|
+
:runner_config_file => nil,
|
165
|
+
:metrics => nil,
|
166
|
+
:daemonize => true,
|
167
|
+
:start_worker_delay => 0.2,
|
168
|
+
:workers => 4,
|
169
|
+
:log => "sneakers.log",
|
170
|
+
:pid_path => "sneakers.pid",
|
171
|
+
:timeout_job_after => 5,
|
172
|
+
:prefetch => 10,
|
173
|
+
:threads => 10,
|
174
|
+
:durable => true,
|
175
|
+
:ack => true,
|
176
|
+
:amqp => "amqp://guest:guest@localhost:5672",
|
177
|
+
:vhost => "/",
|
178
|
+
:exchange => "sneakers",
|
179
|
+
:exchange_type => :direct,
|
180
|
+
:hooks => {},
|
181
|
+
:handler => Sneakers::Handlers::Oneshot,
|
182
|
+
:heartbeat => 2
|
164
183
|
)
|
165
184
|
end
|
166
185
|
|
167
186
|
it "should build a queue with given configuration" do
|
168
187
|
@dummy_q.name.must_equal('downloads')
|
169
188
|
@dummy_q.opts.to_hash.must_equal(
|
170
|
-
|
189
|
+
:runner_config_file => nil,
|
190
|
+
:metrics => nil,
|
191
|
+
:daemonize => true,
|
192
|
+
:start_worker_delay => 0.2,
|
193
|
+
:workers => 4,
|
194
|
+
:log => "sneakers.log",
|
195
|
+
:pid_path => "sneakers.pid",
|
196
|
+
:timeout_job_after => 1,
|
197
|
+
:prefetch => 40,
|
198
|
+
:threads => 50,
|
199
|
+
:durable => false,
|
200
|
+
:ack => false,
|
201
|
+
:amqp => "amqp://guest:guest@localhost:5672",
|
202
|
+
:vhost => "/",
|
203
|
+
:exchange => "dummy",
|
204
|
+
:exchange_type => :direct,
|
205
|
+
:hooks => {},
|
206
|
+
:handler => Sneakers::Handlers::Oneshot,
|
207
|
+
:heartbeat => 5
|
171
208
|
)
|
172
209
|
end
|
173
210
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sneakers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dotan Nahum
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serverengine
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: 1.7.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
40
|
+
version: 1.7.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: thread
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - ">="
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: minitest
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
181
195
|
description: " Fast background processing framework for Ruby and RabbitMQ "
|
182
196
|
email:
|
183
197
|
- jondotan@gmail.com
|
@@ -187,6 +201,7 @@ extensions: []
|
|
187
201
|
extra_rdoc_files: []
|
188
202
|
files:
|
189
203
|
- ".gitignore"
|
204
|
+
- ".travis.yml"
|
190
205
|
- CHANGELOG.md
|
191
206
|
- Gemfile
|
192
207
|
- Guardfile
|
@@ -217,6 +232,7 @@ files:
|
|
217
232
|
- lib/sneakers/publisher.rb
|
218
233
|
- lib/sneakers/queue.rb
|
219
234
|
- lib/sneakers/runner.rb
|
235
|
+
- lib/sneakers/spawner.rb
|
220
236
|
- lib/sneakers/support/production_formatter.rb
|
221
237
|
- lib/sneakers/support/utils.rb
|
222
238
|
- lib/sneakers/tasks.rb
|
@@ -255,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
271
|
version: '0'
|
256
272
|
requirements: []
|
257
273
|
rubyforge_project:
|
258
|
-
rubygems_version: 2.
|
274
|
+
rubygems_version: 2.4.5
|
259
275
|
signing_key:
|
260
276
|
specification_version: 4
|
261
277
|
summary: Fast background processing framework for Ruby and RabbitMQ
|