trinidad_threaded_resque_extension 0.0.2 → 0.1.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.
- data/README.md +10 -9
- data/lib/trinidad_threaded_resque_extension.rb +0 -1
- data/lib/trinidad_threaded_resque_extension/lifecycle_listener.rb +15 -8
- data/lib/trinidad_threaded_resque_extension/version.rb +1 -1
- data/lib/trinidad_threaded_resque_extension/worker.rb +23 -0
- data/spec/dummy.rb +2 -0
- data/spec/resque_extension_spec.rb +49 -25
- metadata +4 -2
- data/lib/trinidad_threaded_resque_extension/resque_disable_signal_handlers.rb +0 -14
data/README.md
CHANGED
@@ -18,17 +18,17 @@ Then configure it via config/trinidad.rb:
|
|
18
18
|
|
19
19
|
require 'bundler/setup'
|
20
20
|
Trinidad.configure |config|
|
21
|
+
config.jruby_max_runtimes = 1
|
21
22
|
...
|
22
23
|
config.extensions = {
|
23
|
-
threaded_resque
|
24
|
-
|
24
|
+
threaded_resque: {
|
25
|
+
require: './config/setup_resque_workers', # will be required before starting the workers, setup Resque and require the jobs here
|
25
26
|
queues: {
|
26
|
-
#
|
27
|
-
# the
|
28
|
-
# default
|
29
|
-
|
30
|
-
|
31
|
-
low: 1
|
27
|
+
# hash key is queue name
|
28
|
+
# hash value is the number of workers consuming that queue
|
29
|
+
# default: '*' => 1
|
30
|
+
io_bound: 20,
|
31
|
+
cpu_bound: 3,
|
32
32
|
}
|
33
33
|
}
|
34
34
|
}
|
@@ -37,7 +37,7 @@ Then configure it via config/trinidad.rb:
|
|
37
37
|
|
38
38
|
Start trinidad and enjoy the low memory usage while having high concurrency.
|
39
39
|
|
40
|
-
Note that becasue JRuby can't fork you want to have well behaved workers, watch out for memory leakage
|
40
|
+
Note that becasue JRuby can't fork you want to have well behaved workers, watch out for memory leakage. Naturally your workers have to be thread safe.
|
41
41
|
|
42
42
|
## Contributing
|
43
43
|
|
@@ -46,3 +46,4 @@ Note that becasue JRuby can't fork you want to have well behaved workers, watch
|
|
46
46
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
47
47
|
4. Push to the branch (`git push origin my-new-feature`)
|
48
48
|
5. Create new Pull Request
|
49
|
+
|
@@ -2,7 +2,6 @@ require 'resque'
|
|
2
2
|
require 'trinidad'
|
3
3
|
require_relative "trinidad_threaded_resque_extension/version"
|
4
4
|
require_relative "trinidad_threaded_resque_extension/lifecycle_listener"
|
5
|
-
require_relative "trinidad_threaded_resque_extension/resque_disable_signal_handlers"
|
6
5
|
|
7
6
|
module Trinidad
|
8
7
|
module Extensions
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "worker"
|
2
|
+
|
1
3
|
module Trinidad
|
2
4
|
module Extensions
|
3
5
|
module ThreadedResque
|
@@ -7,7 +9,6 @@ module Trinidad
|
|
7
9
|
|
8
10
|
def initialize(options = {})
|
9
11
|
@options = options
|
10
|
-
require @options[:setup] if @options[:setup]
|
11
12
|
end
|
12
13
|
|
13
14
|
def lifecycleEvent(event)
|
@@ -20,24 +21,30 @@ module Trinidad
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def start_workers
|
24
|
+
pre_require
|
23
25
|
@workers = create_workers
|
24
26
|
@threads = create_threads
|
25
27
|
end
|
26
28
|
|
27
29
|
def stop_workers
|
28
|
-
@workers.each { |w| w.shutdown }
|
29
|
-
@threads.each { |t| t.join }
|
30
|
+
@workers.each { |w| w.shutdown } if @workers
|
31
|
+
@threads.each { |t| t.join } if @threads
|
30
32
|
end
|
31
33
|
|
32
34
|
private
|
35
|
+
def pre_require
|
36
|
+
if @options[:require]
|
37
|
+
require @options[:require]
|
38
|
+
else
|
39
|
+
raise "You probably want to require something before starting the workers"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
33
43
|
def create_workers
|
34
|
-
queues = @options[:queues] || {
|
44
|
+
queues = @options[:queues] || { '*' => 1 }
|
35
45
|
queues.map do |queue, count|
|
36
|
-
queue = '*' if queue.to_s == 'all'
|
37
46
|
count.to_i.times.map do
|
38
|
-
|
39
|
-
worker.cant_fork = true # fork is a noop in jruby
|
40
|
-
worker
|
47
|
+
ThreadedResque::Worker.new(queue.to_s)
|
41
48
|
end
|
42
49
|
end.flatten
|
43
50
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'resque'
|
2
|
+
|
3
|
+
module Trinidad
|
4
|
+
module Extensions
|
5
|
+
module ThreadedResque
|
6
|
+
class Worker < Resque::Worker
|
7
|
+
def initialize(*queues)
|
8
|
+
super(*queues)
|
9
|
+
@cant_fork = true
|
10
|
+
end
|
11
|
+
|
12
|
+
# we can't let resque trap signal
|
13
|
+
def register_signal_handlers
|
14
|
+
end
|
15
|
+
|
16
|
+
#override to_s and separate different workers by there thread id
|
17
|
+
def to_s
|
18
|
+
@to_s ||= "#{hostname}:#{Process.pid}-#{Thread.current.object_id}:#{@queues.join(',')}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/dummy.rb
ADDED
@@ -1,34 +1,58 @@
|
|
1
1
|
require './lib/trinidad_threaded_resque_extension'
|
2
|
-
Resque.inline = true
|
3
2
|
|
4
3
|
describe Trinidad::Extensions::ThreadedResque::LifecycleListener do
|
5
|
-
|
6
|
-
|
7
|
-
subject.workers.should have(1).things
|
8
|
-
end
|
4
|
+
let(:opts) { { :require => './spec/dummy' } }
|
5
|
+
subject { Trinidad::Extensions::ThreadedResque::LifecycleListener.new opts }
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
context '#start_workers' do
|
8
|
+
it 'starts by default one worker' do
|
9
|
+
subject.start_workers
|
10
|
+
subject.workers.should have(1).things
|
11
|
+
end
|
15
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
it 'can start many workers' do
|
14
|
+
subject.options[:queues] = { :q1 => 2 }
|
15
|
+
subject.start_workers
|
16
|
+
subject.workers.map{ |w| w.queues }.flatten.count('q1').should == 2
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can start many workers for different queues' do
|
20
|
+
subject.options[:queues] = { :q1 => 2, :q2 => 2 }
|
21
|
+
subject.start_workers
|
22
|
+
queues = subject.workers.map{ |w| w.queues }.flatten
|
23
|
+
queues.count('q1').should == 2
|
24
|
+
queues.count('q2').should == 2
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'requires the "require" file' do
|
28
|
+
subject.start_workers
|
29
|
+
defined?(Dummy).should_not be_nil
|
30
|
+
end
|
23
31
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
32
|
+
it 'raises if no "require" file is configured' do
|
33
|
+
subject.options[:require] = nil
|
34
|
+
lambda {
|
35
|
+
subject.start_workers
|
36
|
+
}.should raise_error RuntimeError
|
37
|
+
end
|
38
|
+
|
39
|
+
after do
|
40
|
+
subject.stop_workers
|
41
|
+
end
|
29
42
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
43
|
+
|
44
|
+
context '#stop_workers' do
|
45
|
+
before do
|
46
|
+
subject.start_workers
|
47
|
+
subject.stop_workers
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'shutdowns workers' do
|
51
|
+
subject.workers[0].shutdown?.should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'stops threads' do
|
55
|
+
subject.threads[0].stop?.should be_true
|
56
|
+
end
|
33
57
|
end
|
34
58
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: trinidad_threaded_resque_extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Carl Hörberg
|
@@ -80,8 +80,9 @@ files:
|
|
80
80
|
- Rakefile
|
81
81
|
- lib/trinidad_threaded_resque_extension.rb
|
82
82
|
- lib/trinidad_threaded_resque_extension/lifecycle_listener.rb
|
83
|
-
- lib/trinidad_threaded_resque_extension/resque_disable_signal_handlers.rb
|
84
83
|
- lib/trinidad_threaded_resque_extension/version.rb
|
84
|
+
- lib/trinidad_threaded_resque_extension/worker.rb
|
85
|
+
- spec/dummy.rb
|
85
86
|
- spec/resque_extension_spec.rb
|
86
87
|
- trinidad_threaded_resque_extension.gemspec
|
87
88
|
homepage: https://github.com/carlhoerberg/trinidad_threaded_resque_extension
|
@@ -109,5 +110,6 @@ signing_key:
|
|
109
110
|
specification_version: 3
|
110
111
|
summary: Runs Resque workers, threaded, within the Trinidad application server
|
111
112
|
test_files:
|
113
|
+
- spec/dummy.rb
|
112
114
|
- spec/resque_extension_spec.rb
|
113
115
|
...
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'resque'
|
2
|
-
|
3
|
-
module Resque
|
4
|
-
class Worker
|
5
|
-
# if we let resque trap signals trinidad cannot ever be stopped
|
6
|
-
alias :old_register_signal_handlers :register_signal_handlers
|
7
|
-
def register_signal_handlers
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_s
|
11
|
-
@to_s ||= "#{hostname}:#{Process.pid}-#{Thread.current.object_id}:#{@queues.join(',')}"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|