backburner-allq 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +29 -0
- data/CHANGELOG.md +133 -0
- data/CONTRIBUTING.md +37 -0
- data/Gemfile +4 -0
- data/HOOKS.md +99 -0
- data/LICENSE +22 -0
- data/README.md +658 -0
- data/Rakefile +17 -0
- data/TODO +4 -0
- data/backburner-allq.gemspec +26 -0
- data/bin/backburner +7 -0
- data/circle.yml +3 -0
- data/deploy.sh +3 -0
- data/examples/custom.rb +25 -0
- data/examples/demo.rb +60 -0
- data/examples/god.rb +46 -0
- data/examples/hooked.rb +87 -0
- data/examples/retried.rb +31 -0
- data/examples/simple.rb +43 -0
- data/examples/stress.rb +31 -0
- data/lib/backburner.rb +75 -0
- data/lib/backburner/allq_wrapper.rb +317 -0
- data/lib/backburner/async_proxy.rb +25 -0
- data/lib/backburner/cli.rb +53 -0
- data/lib/backburner/configuration.rb +48 -0
- data/lib/backburner/connection.rb +157 -0
- data/lib/backburner/helpers.rb +193 -0
- data/lib/backburner/hooks.rb +53 -0
- data/lib/backburner/job.rb +118 -0
- data/lib/backburner/logger.rb +53 -0
- data/lib/backburner/performable.rb +95 -0
- data/lib/backburner/queue.rb +145 -0
- data/lib/backburner/tasks.rb +54 -0
- data/lib/backburner/version.rb +3 -0
- data/lib/backburner/worker.rb +221 -0
- data/lib/backburner/workers/forking.rb +52 -0
- data/lib/backburner/workers/simple.rb +29 -0
- data/lib/backburner/workers/threading.rb +163 -0
- data/lib/backburner/workers/threads_on_fork.rb +263 -0
- data/test/async_proxy_test.rb +36 -0
- data/test/back_burner_test.rb +88 -0
- data/test/connection_test.rb +179 -0
- data/test/fixtures/hooked.rb +122 -0
- data/test/fixtures/test_fork_jobs.rb +72 -0
- data/test/fixtures/test_forking_jobs.rb +56 -0
- data/test/fixtures/test_jobs.rb +87 -0
- data/test/fixtures/test_queue_settings.rb +14 -0
- data/test/helpers/templogger.rb +22 -0
- data/test/helpers_test.rb +278 -0
- data/test/hooks_test.rb +112 -0
- data/test/job_test.rb +185 -0
- data/test/logger_test.rb +44 -0
- data/test/performable_test.rb +88 -0
- data/test/queue_test.rb +69 -0
- data/test/test_helper.rb +128 -0
- data/test/worker_test.rb +157 -0
- data/test/workers/forking_worker_test.rb +181 -0
- data/test/workers/simple_worker_test.rb +350 -0
- data/test/workers/threading_worker_test.rb +104 -0
- data/test/workers/threads_on_fork_worker_test.rb +484 -0
- metadata +217 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class AsyncUser; end
|
4
|
+
|
5
|
+
describe "Backburner::AsyncProxy class" do
|
6
|
+
before do
|
7
|
+
Backburner.default_queues.clear
|
8
|
+
clear_jobs!(Backburner.configuration.primary_queue)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "for method_missing enqueue" do
|
12
|
+
should "enqueue job onto worker with no args" do
|
13
|
+
@async = Backburner::AsyncProxy.new(AsyncUser, 10, :pri => 1000, :ttr => 100)
|
14
|
+
@async.foo
|
15
|
+
pop_one_job do |job, body|
|
16
|
+
assert_equal "AsyncUser", body["class"]
|
17
|
+
assert_equal [10, "foo"], body["args"]
|
18
|
+
assert_equal 100, job.ttr
|
19
|
+
assert_equal 1000, job.pri
|
20
|
+
job.delete
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
should "enqueue job onto worker with args" do
|
25
|
+
@async = Backburner::AsyncProxy.new(AsyncUser, 10, :pri => 1000, :ttr => 100)
|
26
|
+
@async.bar(1, 2, 3)
|
27
|
+
pop_one_job do |job, body|
|
28
|
+
assert_equal "AsyncUser", body["class"]
|
29
|
+
assert_equal [10, "bar", 1, 2, 3], body["args"]
|
30
|
+
assert_equal 100, job.ttr
|
31
|
+
assert_equal 1000, job.pri
|
32
|
+
job.delete
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end # method_missing
|
36
|
+
end # AsyncProxy
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
$backburner_sum = 0
|
4
|
+
$backburner_numbers = []
|
5
|
+
|
6
|
+
class TestBackburnerJob
|
7
|
+
include Backburner::Queue
|
8
|
+
queue "test.jobber"
|
9
|
+
|
10
|
+
def self.perform(value, number)
|
11
|
+
$backburner_sum += value
|
12
|
+
$backburner_numbers << number
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TestWorker < Backburner::Worker; end
|
17
|
+
|
18
|
+
describe "Backburner module" do
|
19
|
+
before { Backburner.default_queues.clear }
|
20
|
+
|
21
|
+
describe "for enqueue method" do
|
22
|
+
before do
|
23
|
+
Backburner.enqueue TestBackburnerJob, 5, 6
|
24
|
+
Backburner.enqueue TestBackburnerJob, 15, 10
|
25
|
+
silenced(2) do
|
26
|
+
worker = Backburner::Workers::Simple.new('test.jobber')
|
27
|
+
worker.prepare
|
28
|
+
2.times { worker.work_one_job }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can run jobs using #run method" do
|
33
|
+
assert_equal 20, $backburner_sum
|
34
|
+
assert_same_elements [6, 10], $backburner_numbers
|
35
|
+
end
|
36
|
+
end # enqueue
|
37
|
+
|
38
|
+
describe "for work method" do
|
39
|
+
it "invokes worker simple start" do
|
40
|
+
Backburner::Workers::Simple.expects(:start).with(["foo", "bar"])
|
41
|
+
Backburner.work("foo", "bar")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "invokes other worker if specified in configuration" do
|
45
|
+
Backburner.configure { |config| config.default_worker = TestWorker }
|
46
|
+
TestWorker.expects(:start).with(["foo", "bar"])
|
47
|
+
Backburner.work("foo", "bar")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "invokes other worker if specified in work method as options" do
|
51
|
+
TestWorker.expects(:start).with(["foo", "bar"])
|
52
|
+
Backburner.work("foo", "bar", :worker => TestWorker)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "invokes worker start with no args" do
|
56
|
+
Backburner::Workers::Simple.expects(:start).with([])
|
57
|
+
Backburner.work
|
58
|
+
end
|
59
|
+
end # work!
|
60
|
+
|
61
|
+
describe "for configuration" do
|
62
|
+
it "remembers the tube_namespace" do
|
63
|
+
assert_equal "demo.test", Backburner.configuration.tube_namespace
|
64
|
+
end
|
65
|
+
|
66
|
+
it "remembers the namespace_separator" do
|
67
|
+
assert_equal ".", Backburner.configuration.namespace_separator
|
68
|
+
end
|
69
|
+
|
70
|
+
it "disallows a reserved separator" do
|
71
|
+
assert_raises RuntimeError do
|
72
|
+
Backburner.configuration.namespace_separator = ':'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end # configuration
|
76
|
+
|
77
|
+
describe "for default_queues" do
|
78
|
+
it "supports assignment" do
|
79
|
+
Backburner.default_queues << "foo"
|
80
|
+
Backburner.default_queues << "bar"
|
81
|
+
assert_same_elements ["foo", "bar"], Backburner.default_queues
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
after do
|
86
|
+
Backburner.configure { |config| config.default_worker = Backburner::Workers::Simple }
|
87
|
+
end
|
88
|
+
end # Backburner
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe "Backburner::Connection class" do
|
4
|
+
describe "for initialize with single url" do
|
5
|
+
before do
|
6
|
+
@connection = Backburner::Connection.new("beanstalk://127.0.0.1")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should store url in accessor" do
|
10
|
+
assert_equal "beanstalk://127.0.0.1", @connection.url
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should setup beanstalk connection" do
|
14
|
+
assert_kind_of Beaneater, @connection.beanstalk
|
15
|
+
end
|
16
|
+
end # initialize single connection
|
17
|
+
|
18
|
+
describe "for initialize with url" do
|
19
|
+
it "should delegate the address url correctly" do
|
20
|
+
@connection = Backburner::Connection.new("beanstalk://127.0.0.1")
|
21
|
+
connection = @connection.beanstalk.connection
|
22
|
+
assert_equal '127.0.0.1:11300', connection.address
|
23
|
+
end
|
24
|
+
end # initialize
|
25
|
+
|
26
|
+
describe "for bad uri" do
|
27
|
+
it "should raise a BadUrl" do
|
28
|
+
assert_raises(Backburner::Connection::BadURL) {
|
29
|
+
@connection = Backburner::Connection.new("fake://foo")
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "for initialize with on_reconnect block" do
|
35
|
+
it "should store the block for use upon reconnect" do
|
36
|
+
callback = proc {}
|
37
|
+
connection = Backburner::Connection.new('beanstalk://127.0.0.1', &callback)
|
38
|
+
assert_equal callback, connection.on_reconnect
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "dealing with connecting and reconnecting" do
|
43
|
+
before do
|
44
|
+
@connection = Backburner::Connection.new('beanstalk://127.0.0.1')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should know if its connection is open" do
|
48
|
+
assert_equal true, @connection.connected?
|
49
|
+
@connection.close
|
50
|
+
assert_equal false, @connection.connected?
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should be able to attempt reconnecting to beanstalk" do
|
54
|
+
@connection.close
|
55
|
+
assert_equal false, @connection.connected?
|
56
|
+
@connection.reconnect!
|
57
|
+
assert_equal true, @connection.connected?
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should allow for retryable commands" do
|
61
|
+
@result = false
|
62
|
+
@connection.close
|
63
|
+
@connection.retryable { @result = true }
|
64
|
+
assert_equal true, @result
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should provide a hook when a retryable command successfully retries" do
|
68
|
+
@result = false
|
69
|
+
@retried = false
|
70
|
+
@connection.close
|
71
|
+
callback = proc { @result = true }
|
72
|
+
@connection.retryable(:on_retry => callback) do
|
73
|
+
unless @retried
|
74
|
+
@retried = true
|
75
|
+
raise Beaneater::NotConnected.new
|
76
|
+
end
|
77
|
+
end
|
78
|
+
assert_equal true, @result
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should provide a hook when the connection successfully reconnects" do
|
82
|
+
reconnected = false
|
83
|
+
retried = false
|
84
|
+
@connection.close
|
85
|
+
@connection.on_reconnect = proc { reconnected = true }
|
86
|
+
@connection.retryable do
|
87
|
+
unless retried
|
88
|
+
retried = true
|
89
|
+
raise Beaneater::NotConnected.new
|
90
|
+
end
|
91
|
+
end
|
92
|
+
assert_equal true, reconnected
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should call the on_reconnect hook before the on_retry hook" do
|
96
|
+
@result = []
|
97
|
+
@retried = false
|
98
|
+
@connection.close
|
99
|
+
@connection.on_reconnect = proc { @result << "reconnect" }
|
100
|
+
on_retry = proc { @result << "retry" }
|
101
|
+
@connection.retryable(:on_retry => on_retry) do
|
102
|
+
unless @retried
|
103
|
+
@retried = true
|
104
|
+
raise Beaneater::NotConnected.new
|
105
|
+
end
|
106
|
+
end
|
107
|
+
assert_equal %w(reconnect retry), @result
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "ensuring the connection is open" do
|
111
|
+
it "should reattempt the connection to beanstalk several times" do
|
112
|
+
stats = @connection.stats
|
113
|
+
simulate_disconnect(@connection)
|
114
|
+
new_connection = Beaneater.new('127.0.0.1:11300')
|
115
|
+
Beaneater.expects(:new).twice.raises(Beaneater::NotConnected).then.returns(new_connection)
|
116
|
+
@connection.tubes
|
117
|
+
assert_equal true, @connection.connected?
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should not attempt reconnecting if the current connection is open" do
|
121
|
+
assert_equal true, @connection.connected?
|
122
|
+
Beaneater.expects(:new).never
|
123
|
+
@connection.tubes
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "when reconnecting is successful" do
|
127
|
+
it "should allow for a callback" do
|
128
|
+
@result = false
|
129
|
+
simulate_disconnect(@connection)
|
130
|
+
@connection.on_reconnect = proc { @result = true }
|
131
|
+
@connection.tubes
|
132
|
+
assert_equal true, @result
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should pass self to the callback" do
|
136
|
+
result = nil
|
137
|
+
simulate_disconnect(@connection)
|
138
|
+
@connection.on_reconnect = lambda { |conn| result = conn }
|
139
|
+
@connection.tubes
|
140
|
+
assert_equal result, @connection
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe "when unable to ensure its connected" do
|
146
|
+
it "should raise Beaneater::NotConnected" do
|
147
|
+
Beaneater.stubs(:new).raises(Beaneater::NotConnected)
|
148
|
+
simulate_disconnect(@connection, 1) # since we're stubbing Beaneater.new above we only to simlulate the disconnect of our current connection
|
149
|
+
assert_raises Beaneater::NotConnected do
|
150
|
+
@connection.tubes
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe "when using the retryable method" do
|
156
|
+
it "should yield to the block multiple times" do
|
157
|
+
expected = 2
|
158
|
+
retry_count = 0
|
159
|
+
@connection.retryable(max_retries: expected) do
|
160
|
+
if retry_count < 2
|
161
|
+
retry_count += 1
|
162
|
+
raise Beaneater::NotConnected
|
163
|
+
end
|
164
|
+
end
|
165
|
+
assert_equal expected, retry_count
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "for delegated methods" do
|
171
|
+
before do
|
172
|
+
@connection = Backburner::Connection.new("beanstalk://127.0.0.1")
|
173
|
+
end
|
174
|
+
|
175
|
+
it "delegate methods to beanstalk connection" do
|
176
|
+
assert_equal "127.0.0.1", @connection.connection.host
|
177
|
+
end
|
178
|
+
end # delegator
|
179
|
+
end # Connection
|
@@ -0,0 +1,122 @@
|
|
1
|
+
$hooked_fail_count = 0
|
2
|
+
class HookFailError < RuntimeError; end
|
3
|
+
|
4
|
+
class HookedObjectBeforeEnqueueFail
|
5
|
+
include Backburner::Performable
|
6
|
+
|
7
|
+
def self.before_enqueue_abe(*args)
|
8
|
+
puts "!!before_enqueue_foo!! #{args.inspect}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.before_enqueue_bar(*args)
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
class HookedObjectAfterEnqueueFail
|
18
|
+
def self.after_enqueue_abe(*args)
|
19
|
+
puts "!!after_enqueue_foo!! #{args.inspect}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.after_enqueue_bar(*args)
|
23
|
+
raise HookFailError, "Fail HookedObjectAfterEnqueueFail"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class HookedObjectBeforePerformFail
|
28
|
+
include Backburner::Performable
|
29
|
+
|
30
|
+
def self.before_perform_abe(*args)
|
31
|
+
puts "!!before_perform_foo!! #{args.inspect}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.before_perform_foo(*args)
|
35
|
+
return false
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.foo(x)
|
39
|
+
puts "Fail ran!!"
|
40
|
+
raise HookFailError, "HookedObjectJobFailure on foo!"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class HookedObjectAfterPerformFail
|
45
|
+
def self.after_perform_abe(*args)
|
46
|
+
puts "!!after_perform_foo!! #{args.inspect}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.after_perform_bar(*args)
|
50
|
+
raise HookFailError, "Fail HookedObjectAfterEnqueueFail"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class HookedObjectJobFailure
|
55
|
+
def self.foo(x)
|
56
|
+
raise HookFailError, "HookedObjectJobFailure on foo!"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class HookedObjectSuccess
|
61
|
+
include Backburner::Performable
|
62
|
+
|
63
|
+
def self.before_enqueue_foo(*args)
|
64
|
+
puts "!!before_enqueue_foo!! #{args.inspect}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.before_enqueue_bar(*args)
|
68
|
+
puts "!!before_enqueue_bar!! #{args.inspect}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.after_enqueue_foo(*args)
|
72
|
+
puts "!!after_enqueue_foo!! #{args.inspect}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.after_enqueue_bar(*args)
|
76
|
+
puts "!!after_enqueue_bar!! #{args.inspect}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.before_perform_foo(*args)
|
80
|
+
puts "!!before_perform_foo!! #{args.inspect}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.after_perform_foo(*args)
|
84
|
+
puts "!!after_perform_foo!! #{args.inspect}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.around_perform_bar(*args)
|
88
|
+
puts "!!BEGIN around_perform_bar!! #{args.inspect}"
|
89
|
+
yield
|
90
|
+
puts "!!END around_perform_bar!! #{args.inspect}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.around_perform_cat(*args)
|
94
|
+
puts "!!BEGIN around_perform_cat!! #{args.inspect}"
|
95
|
+
yield
|
96
|
+
puts "!!END around_perform_cat!! #{args.inspect}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.on_failure_foo(ex, *args)
|
100
|
+
puts "!!on_failure_foo!! #{ex.inspect} #{args.inspect}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.on_bury_foo(*args)
|
104
|
+
puts "!!on_bury_foo!! #{args.inspect}"
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.on_retry_foo(retry_count, delay, *args)
|
108
|
+
puts "!!on_retry_foo!! #{retry_count} #{delay} #{args.inspect}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.foo(x)
|
112
|
+
$hooked_fail_count += 1
|
113
|
+
raise HookFailError, "Fail!" if $hooked_fail_count == 1
|
114
|
+
puts "This is the job running successfully!! #{x.inspect}"
|
115
|
+
end
|
116
|
+
end # HookedObjectSuccess
|
117
|
+
|
118
|
+
class HookedWorker < Backburner::Worker
|
119
|
+
def on_reconnect
|
120
|
+
puts "!!on_reconnect!!"
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class ResponseJob
|
2
|
+
include Backburner::Queue
|
3
|
+
queue_priority 1000
|
4
|
+
def self.perform(data)
|
5
|
+
$worker_test_count += data['worker_test_count'].to_i if data['worker_test_count']
|
6
|
+
$worker_success = data['worker_success'] if data['worker_success']
|
7
|
+
$worker_test_count = data['worker_test_count_set'].to_i if data['worker_test_count_set']
|
8
|
+
$worker_raise = data['worker_raise'] if data['worker_raise']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class TestJobFork
|
13
|
+
include Backburner::Queue
|
14
|
+
queue "test-job-fork"
|
15
|
+
queue_priority 1000
|
16
|
+
def self.perform(x, y)
|
17
|
+
Backburner::Workers::ThreadsOnFork.enqueue ResponseJob, [{
|
18
|
+
:worker_test_count_set => x + y
|
19
|
+
}], :queue => 'response'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class TestFailJobFork
|
24
|
+
include Backburner::Queue
|
25
|
+
queue "test-fail-job-fork"
|
26
|
+
def self.perform(x, y)
|
27
|
+
Backburner::Workers::ThreadsOnFork.enqueue ResponseJob, [{
|
28
|
+
:worker_raise => true
|
29
|
+
}], :queue => 'response'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class TestRetryJobFork
|
34
|
+
include Backburner::Queue
|
35
|
+
def self.perform(x, y)
|
36
|
+
$worker_test_count += 1
|
37
|
+
|
38
|
+
if $worker_test_count <= 2
|
39
|
+
Backburner::Workers::ThreadsOnFork.enqueue ResponseJob, [{
|
40
|
+
:worker_test_count => 1
|
41
|
+
}], :queue => 'response'
|
42
|
+
|
43
|
+
raise RuntimeError
|
44
|
+
else # succeeds
|
45
|
+
Backburner::Workers::ThreadsOnFork.enqueue ResponseJob, [{
|
46
|
+
:worker_test_count => 1,
|
47
|
+
:worker_success => true
|
48
|
+
}], :queue => 'response'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class TestAsyncJobFork
|
54
|
+
include Backburner::Performable
|
55
|
+
def self.foo(x, y)
|
56
|
+
Backburner::Workers::ThreadsOnFork.enqueue ResponseJob, [{
|
57
|
+
:worker_test_count_set => x * y
|
58
|
+
}], :queue => 'response'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class TestJobMultithreadFork
|
63
|
+
include Backburner::Queue
|
64
|
+
queue "test-job-multithread-fork"
|
65
|
+
queue_priority 1000
|
66
|
+
def self.perform(x, y)
|
67
|
+
sleep 1 # simluate work
|
68
|
+
Backburner::Workers::ThreadsOnFork.enqueue ResponseJob, [{
|
69
|
+
:worker_test_count_set => x + y
|
70
|
+
}], :queue => 'response'
|
71
|
+
end
|
72
|
+
end
|