queueing_rabbit 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +1 -0
- data/lib/queueing_rabbit.rb +23 -4
- data/lib/queueing_rabbit/callbacks.rb +1 -1
- data/lib/queueing_rabbit/client/amqp.rb +5 -1
- data/lib/queueing_rabbit/client/bunny.rb +44 -0
- data/lib/queueing_rabbit/extensions/threaded.rb +64 -0
- data/lib/queueing_rabbit/version.rb +1 -1
- data/lib/queueing_rabbit/worker.rb +4 -7
- data/spec/integration/asynchronous_publishing_and_consuming_spec.rb +1 -0
- data/spec/integration/asynchronous_publishing_and_consuming_with_retries_spec.rb +1 -0
- data/spec/integration/binary_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb +2 -0
- data/spec/integration/configuration_spec.rb +2 -0
- data/spec/integration/direct_exchange_asynchronous_publishing_and_consuming_spec.rb +1 -0
- data/spec/integration/jobs/json_threaded_print_line_job.rb +24 -0
- data/spec/integration/jobs/print_line_job.rb +2 -0
- data/spec/integration/json_job_asynchronous_publishing_and_consuming_spec.rb +1 -0
- data/spec/integration/json_job_synchronous_publishing_and_consuming_spec.rb +50 -0
- data/spec/integration/json_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb +2 -0
- data/spec/integration/persistent_asynchronous_publishing_and_consuming_spec.rb +1 -0
- data/spec/integration/synchronous_publishing_and_asynchronous_consuming_spec.rb +2 -0
- data/spec/integration/synchronous_publishing_and_consuming_spec.rb +29 -0
- data/spec/integration/synchronous_publishing_and_threaded_consuming_spec.rb +59 -0
- data/spec/integration/synchronous_publishing_spec.rb +1 -0
- data/spec/spec_helper.rb +0 -4
- data/spec/support/shared_contexts.rb +18 -1
- data/spec/unit/queueing_rabbit/client/amqp_spec.rb +3 -2
- data/spec/unit/queueing_rabbit/client/bunny_spec.rb +3 -0
- data/spec/unit/queueing_rabbit/extensions/new_relic_spec.rb +1 -0
- data/spec/unit/queueing_rabbit/extensions/threaded_spec.rb +42 -0
- data/spec/unit/queueing_rabbit/jobs/abstract_job_spec.rb +1 -0
- data/spec/unit/queueing_rabbit/worker_spec.rb +2 -7
- data/spec/unit/queueing_rabbit_spec.rb +14 -2
- metadata +32 -5
- checksums.yaml +0 -15
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/lib/queueing_rabbit.rb
CHANGED
@@ -23,6 +23,7 @@ module QueueingRabbit
|
|
23
23
|
extend Logging
|
24
24
|
extend Callbacks
|
25
25
|
extend Configuration
|
26
|
+
extend MonitorMixin
|
26
27
|
|
27
28
|
class QueueingRabbitError < Exception; end
|
28
29
|
class JobNotFoundError < QueueingRabbitError; end
|
@@ -31,13 +32,25 @@ module QueueingRabbit
|
|
31
32
|
attr_accessor :logger, :client
|
32
33
|
|
33
34
|
def connect
|
34
|
-
|
35
|
+
synchronize do
|
36
|
+
@connection ||= client.connect
|
37
|
+
end
|
38
|
+
end
|
39
|
+
alias_method :conn, :connect
|
40
|
+
alias_method :connection, :connect
|
41
|
+
|
42
|
+
def disconnect
|
43
|
+
synchronize do
|
44
|
+
if connected?
|
45
|
+
@connection.close
|
46
|
+
end
|
47
|
+
drop_connection
|
48
|
+
end
|
35
49
|
end
|
36
50
|
|
37
|
-
def
|
38
|
-
@connection
|
51
|
+
def connected?
|
52
|
+
@connection && @connection.open?
|
39
53
|
end
|
40
|
-
alias_method :conn, :connection
|
41
54
|
|
42
55
|
def drop_connection
|
43
56
|
@connection = nil
|
@@ -63,6 +76,12 @@ module QueueingRabbit
|
|
63
76
|
end
|
64
77
|
end
|
65
78
|
|
79
|
+
def begin_worker_loop
|
80
|
+
conn.begin_worker_loop do
|
81
|
+
yield
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
66
85
|
def follow_job_requirements(job)
|
67
86
|
follow_bus_requirements(job) do |ch, ex|
|
68
87
|
conn.define_queue(ch, job.queue_name, job.queue_options) do |q|
|
@@ -71,7 +71,11 @@ module QueueingRabbit
|
|
71
71
|
@event_machine_thread.join if @event_machine_thread
|
72
72
|
end
|
73
73
|
|
74
|
-
def
|
74
|
+
def open?
|
75
|
+
EM.reactor_running? && @connection.open?
|
76
|
+
end
|
77
|
+
|
78
|
+
def close
|
75
79
|
info "closing AMQP broker connection..."
|
76
80
|
|
77
81
|
connection.close do
|
@@ -6,6 +6,26 @@ module QueueingRabbit
|
|
6
6
|
|
7
7
|
class Bunny
|
8
8
|
|
9
|
+
class Metadata
|
10
|
+
|
11
|
+
def initialize(channel, delivery_info, properties)
|
12
|
+
@channel = channel
|
13
|
+
@delivery_info = delivery_info
|
14
|
+
@properties = properties
|
15
|
+
end
|
16
|
+
|
17
|
+
def ack
|
18
|
+
@channel.ack(@delivery_info.delivery_tag, false)
|
19
|
+
end
|
20
|
+
|
21
|
+
def headers
|
22
|
+
@properties.headers
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
include QueueingRabbit::Logging
|
28
|
+
|
9
29
|
attr_reader :connection
|
10
30
|
|
11
31
|
def self.connect
|
@@ -50,6 +70,30 @@ module QueueingRabbit
|
|
50
70
|
queue.status[:message_count]
|
51
71
|
end
|
52
72
|
|
73
|
+
def listen_queue(queue, options = {})
|
74
|
+
queue.subscribe(options) do |delivery_info, properties, payload|
|
75
|
+
begin
|
76
|
+
yield payload, Metadata.new(queue.channel, delivery_info, properties)
|
77
|
+
rescue => e
|
78
|
+
error "unexpected error #{e.class} occured: #{e.message}"
|
79
|
+
debug e
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def close
|
85
|
+
@connection.close
|
86
|
+
end
|
87
|
+
|
88
|
+
def open?
|
89
|
+
@connection.open?
|
90
|
+
end
|
91
|
+
|
92
|
+
def begin_worker_loop
|
93
|
+
yield
|
94
|
+
@connection.reader_loop.join
|
95
|
+
end
|
96
|
+
|
53
97
|
private
|
54
98
|
|
55
99
|
def initialize(connection)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'celluloid'
|
2
|
+
|
3
|
+
module QueueingRabbit
|
4
|
+
|
5
|
+
module JobExtensions
|
6
|
+
|
7
|
+
class Monitor
|
8
|
+
|
9
|
+
include Celluloid
|
10
|
+
|
11
|
+
trap_exit :report_error
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@logger = QueueingRabbit.logger
|
15
|
+
end
|
16
|
+
|
17
|
+
def report_error(obj, e)
|
18
|
+
return unless e
|
19
|
+
@logger.error "unexpected error #{e.class} occured."
|
20
|
+
@logger.debug e
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
module Threaded
|
26
|
+
|
27
|
+
def self.included(klass)
|
28
|
+
klass.send(:include, Celluloid)
|
29
|
+
klass.extend(ClassMethods)
|
30
|
+
end
|
31
|
+
|
32
|
+
def perform_and_terminate
|
33
|
+
perform
|
34
|
+
terminate
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
|
39
|
+
def perform(payload, metadata)
|
40
|
+
job = self.new(payload, metadata)
|
41
|
+
monitor.link(job)
|
42
|
+
job.async.perform_and_terminate
|
43
|
+
end
|
44
|
+
|
45
|
+
def monitor
|
46
|
+
create_monitor unless Celluloid::Actor[monitor_name]
|
47
|
+
Celluloid::Actor[monitor_name]
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_monitor
|
51
|
+
Monitor.supervise_as(monitor_name)
|
52
|
+
end
|
53
|
+
|
54
|
+
def monitor_name
|
55
|
+
:queueing_rabbit_monitor
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -10,20 +10,21 @@ module QueueingRabbit
|
|
10
10
|
sync_stdio
|
11
11
|
validate_jobs
|
12
12
|
constantize_jobs
|
13
|
-
use_asynchronous_client
|
14
13
|
end
|
15
14
|
|
16
15
|
def work
|
17
16
|
conn = QueueingRabbit.connection
|
18
17
|
trap_signals(conn)
|
19
18
|
|
19
|
+
QueueingRabbit.trigger_event(:worker_ready)
|
20
|
+
|
20
21
|
jobs.each { |job| run_job(conn, job) }
|
21
22
|
|
22
23
|
QueueingRabbit.trigger_event(:consuming_started)
|
23
24
|
end
|
24
25
|
|
25
26
|
def work!
|
26
|
-
|
27
|
+
QueueingRabbit.begin_worker_loop do
|
27
28
|
work
|
28
29
|
end
|
29
30
|
end
|
@@ -46,10 +47,6 @@ module QueueingRabbit
|
|
46
47
|
|
47
48
|
private
|
48
49
|
|
49
|
-
def use_asynchronous_client
|
50
|
-
QueueingRabbit.client = QueueingRabbit::Client::AMQP
|
51
|
-
end
|
52
|
-
|
53
50
|
def validate_jobs
|
54
51
|
if jobs.nil? || jobs.empty?
|
55
52
|
fatal "no jobs specified to work on."
|
@@ -94,7 +91,7 @@ module QueueingRabbit
|
|
94
91
|
|
95
92
|
def trap_signals(connection)
|
96
93
|
handler = Proc.new do
|
97
|
-
connection.
|
94
|
+
connection.close {
|
98
95
|
QueueingRabbit.trigger_event(:consuming_done)
|
99
96
|
remove_pidfile
|
100
97
|
}
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'integration/jobs/print_line_job'
|
3
3
|
|
4
4
|
describe 'Binary synchronous publishing via bus and asynchronous consuming via job' do
|
5
|
+
include_context "Auto-disconnect"
|
5
6
|
include_context "StringIO logger"
|
6
7
|
include_context "Evented spec"
|
7
8
|
|
@@ -19,6 +20,7 @@ describe 'Binary synchronous publishing via bus and asynchronous consuming via j
|
|
19
20
|
job.io = io
|
20
21
|
bus.publish(line)
|
21
22
|
QueueingRabbit.drop_connection
|
23
|
+
QueueingRabbit.client = QueueingRabbit::Client::AMQP
|
22
24
|
end
|
23
25
|
|
24
26
|
it "works" do
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'queueing_rabbit/extensions/threaded'
|
2
|
+
|
3
|
+
class JSONThreadedPrintLineJob < QueueingRabbit::JSONJob
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :io
|
7
|
+
end
|
8
|
+
|
9
|
+
include QueueingRabbit::JobExtensions::Threaded
|
10
|
+
|
11
|
+
queue :auto_delete => true
|
12
|
+
|
13
|
+
listen :ack => true,
|
14
|
+
:block => false,
|
15
|
+
:consumer_tag => 'threaded-json-consumer'
|
16
|
+
|
17
|
+
def perform
|
18
|
+
raise arguments[:raise_error] if arguments[:raise_error]
|
19
|
+
|
20
|
+
self.class.io.puts arguments[:line]
|
21
|
+
acknowledge
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'integration/jobs/print_line_job'
|
3
|
+
|
4
|
+
describe "Synchronous publishing and consuming with JSON serialization" do
|
5
|
+
include_context "Auto-disconnect"
|
6
|
+
include_context "StringIO logger"
|
7
|
+
|
8
|
+
context "basic consuming" do
|
9
|
+
let(:line) { "Hello, world!" }
|
10
|
+
let(:job) {
|
11
|
+
Class.new(QueueingRabbit::JSONJob) do
|
12
|
+
class << self
|
13
|
+
attr_accessor :io
|
14
|
+
end
|
15
|
+
|
16
|
+
def perform
|
17
|
+
PrintLineFromJSONJob.io.puts arguments[:line]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
}
|
21
|
+
let(:job_name) { 'PrintLineFromJSONJob' }
|
22
|
+
let(:io) { StringIO.new }
|
23
|
+
let(:worker) { QueueingRabbit::Worker.new(job_name) }
|
24
|
+
|
25
|
+
before do
|
26
|
+
job.io = io
|
27
|
+
stub_const(job_name, job)
|
28
|
+
end
|
29
|
+
|
30
|
+
after do
|
31
|
+
QueueingRabbit.drop_connection
|
32
|
+
end
|
33
|
+
|
34
|
+
it "processes enqueued jobs" do
|
35
|
+
3.times { job.enqueue(:line => line) }
|
36
|
+
job.queue_size.should == 3
|
37
|
+
worker.work
|
38
|
+
job.queue_size.should be_zero
|
39
|
+
end
|
40
|
+
|
41
|
+
it "actually outputs the line" do
|
42
|
+
job.enqueue(:line => line)
|
43
|
+
worker.work
|
44
|
+
job.io.string.should include(line)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
data/spec/integration/json_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'integration/jobs/print_line_job'
|
3
3
|
|
4
4
|
describe 'JSON synchronous publishing via bus and asynchronous consuming via job' do
|
5
|
+
include_context "Auto-disconnect"
|
5
6
|
include_context "StringIO logger"
|
6
7
|
include_context "Evented spec"
|
7
8
|
|
@@ -36,6 +37,7 @@ describe 'JSON synchronous publishing via bus and asynchronous consuming via job
|
|
36
37
|
job.io = io
|
37
38
|
bus.publish(:line => line)
|
38
39
|
QueueingRabbit.drop_connection
|
40
|
+
QueueingRabbit.client = QueueingRabbit::Client::AMQP
|
39
41
|
end
|
40
42
|
|
41
43
|
it "works" do
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'integration/jobs/print_line_job'
|
3
3
|
|
4
4
|
describe "Synchronous publishing and asynchronous consuming example" do
|
5
|
+
include_context "Auto-disconnect"
|
5
6
|
include_context "StringIO logger"
|
6
7
|
include_context "Evented spec"
|
7
8
|
|
@@ -19,6 +20,7 @@ describe "Synchronous publishing and asynchronous consuming example" do
|
|
19
20
|
job.io = io
|
20
21
|
job.enqueue(line)
|
21
22
|
QueueingRabbit.drop_connection
|
23
|
+
QueueingRabbit.client = QueueingRabbit::Client::AMQP
|
22
24
|
end
|
23
25
|
|
24
26
|
it "works" do
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'integration/jobs/print_line_job'
|
3
|
+
|
4
|
+
describe "Synchronous publishing and asynchronous consuming example" do
|
5
|
+
include_context "Auto-disconnect"
|
6
|
+
include_context "StringIO logger"
|
7
|
+
|
8
|
+
let(:job) { PrintLineJob }
|
9
|
+
let(:line) { "Hello, world!" }
|
10
|
+
|
11
|
+
context "when a message is published and consumed synchronously" do
|
12
|
+
|
13
|
+
let(:worker) { QueueingRabbit::Worker.new(job.to_s) }
|
14
|
+
let(:io) { StringIO.new }
|
15
|
+
|
16
|
+
before do
|
17
|
+
job.io = io
|
18
|
+
job.enqueue(line)
|
19
|
+
end
|
20
|
+
|
21
|
+
specify do
|
22
|
+
worker.work
|
23
|
+
sleep 0.5
|
24
|
+
io.string.should include(line)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'integration/jobs/json_threaded_print_line_job' unless RUBY_VERSION == '1.8.7'
|
3
|
+
|
4
|
+
describe "Synchronous publishing and threaded consuming", :ruby => '1.8.7' do
|
5
|
+
include_context "Auto-disconnect"
|
6
|
+
include_context "StringIO logger"
|
7
|
+
|
8
|
+
context "basic consuming" do
|
9
|
+
|
10
|
+
let(:line) { "Hello, world!" }
|
11
|
+
let(:job) { JSONThreadedPrintLineJob }
|
12
|
+
let(:job_name) { 'JSONThreadedPrintLineJob' }
|
13
|
+
let(:io) { StringIO.new }
|
14
|
+
let(:worker) { QueueingRabbit::Worker.new(job_name) }
|
15
|
+
|
16
|
+
before do
|
17
|
+
QueueingRabbit.purge_queue(job)
|
18
|
+
Celluloid.logger = nil
|
19
|
+
job.io = io
|
20
|
+
end
|
21
|
+
|
22
|
+
it "processes enqueued jobs" do
|
23
|
+
worker.work
|
24
|
+
|
25
|
+
3.times { job.enqueue(:line => line) }
|
26
|
+
|
27
|
+
sleep 1
|
28
|
+
|
29
|
+
job.queue_size.should be_zero
|
30
|
+
end
|
31
|
+
|
32
|
+
it "actually outputs the line" do
|
33
|
+
worker.work
|
34
|
+
|
35
|
+
job.enqueue(:line => line)
|
36
|
+
|
37
|
+
sleep 0.5
|
38
|
+
|
39
|
+
job.io.string.should include(line)
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'on failure' do
|
43
|
+
|
44
|
+
it "handles errors gracefully" do
|
45
|
+
worker.work
|
46
|
+
|
47
|
+
job.enqueue({:raise_error => 'Some very unique message'})
|
48
|
+
|
49
|
+
sleep 0.5
|
50
|
+
|
51
|
+
@session_log.string.should include('Some very unique message')
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -3,7 +3,8 @@ require 'stringio'
|
|
3
3
|
shared_context "StringIO logger" do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
|
6
|
+
@session_log = StringIO.new
|
7
|
+
QueueingRabbit.logger = Logger.new(@session_log)
|
7
8
|
end
|
8
9
|
|
9
10
|
after(:all) do
|
@@ -12,6 +13,22 @@ shared_context "StringIO logger" do
|
|
12
13
|
|
13
14
|
end
|
14
15
|
|
16
|
+
shared_context "Auto-disconnect" do
|
17
|
+
|
18
|
+
after(:each) do
|
19
|
+
QueueingRabbit.disconnect
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
shared_context "No existing connections" do
|
25
|
+
|
26
|
+
before(:each) do
|
27
|
+
QueueingRabbit.drop_connection
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
15
32
|
shared_context "Evented spec" do
|
16
33
|
include EventedSpec::SpecHelper
|
17
34
|
end
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe QueueingRabbit::Client::AMQP do
|
4
4
|
|
5
5
|
include_context "StringIO logger"
|
6
|
+
include_context "No existing connections"
|
6
7
|
|
7
8
|
let(:connection) { mock :on_tcp_connection_loss => nil, :on_recovery => nil }
|
8
9
|
|
@@ -168,7 +169,7 @@ describe QueueingRabbit::Client::AMQP do
|
|
168
169
|
end
|
169
170
|
end
|
170
171
|
|
171
|
-
describe '#
|
172
|
+
describe '#close' do
|
172
173
|
before do
|
173
174
|
subject.should_receive(:info)
|
174
175
|
connection.should_receive(:close).and_yield
|
@@ -176,7 +177,7 @@ describe QueueingRabbit::Client::AMQP do
|
|
176
177
|
end
|
177
178
|
|
178
179
|
it 'writes the log, closes connection and stops the reactor' do
|
179
|
-
client.
|
180
|
+
client.close
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
if RUBY_VERSION != '1.8.7'
|
4
|
+
require 'queueing_rabbit/extensions/threaded'
|
5
|
+
else
|
6
|
+
class QueueingRabbit::JobExtensions::Threaded; end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe QueueingRabbit::JobExtensions::Threaded, :ruby => '1.8.7' do
|
10
|
+
|
11
|
+
let(:test_job) {
|
12
|
+
Class.new(QueueingRabbit::AbstractJob) do
|
13
|
+
|
14
|
+
include QueueingRabbit::JobExtensions::Threaded
|
15
|
+
|
16
|
+
exchange 'test_job'
|
17
|
+
queue 'test_queue'
|
18
|
+
|
19
|
+
def perform
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
}
|
24
|
+
|
25
|
+
before do
|
26
|
+
Celluloid.logger = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'new class methods' do
|
30
|
+
subject { test_job }
|
31
|
+
|
32
|
+
it { should respond_to(:perform).with(2).arguments }
|
33
|
+
it { should respond_to(:monitor) }
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'new instance methods' do
|
37
|
+
subject { test_job.new(mock, mock) }
|
38
|
+
|
39
|
+
it { should respond_to(:perform_and_terminate) }
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -56,11 +56,6 @@ describe QueueingRabbit::Worker do
|
|
56
56
|
|
57
57
|
it { should be }
|
58
58
|
it { should respond_to(:jobs) }
|
59
|
-
it 'changes used client to asynchronous' do
|
60
|
-
expect { creation.call }.to change { QueueingRabbit.client.to_s }.
|
61
|
-
from(QueueingRabbit::Client::Bunny.to_s).
|
62
|
-
to(QueueingRabbit::Client::AMQP.to_s)
|
63
|
-
end
|
64
59
|
end
|
65
60
|
end
|
66
61
|
|
@@ -100,8 +95,8 @@ describe QueueingRabbit::Worker do
|
|
100
95
|
end
|
101
96
|
|
102
97
|
describe '#work!' do
|
103
|
-
it 'runs #work and joins the
|
104
|
-
|
98
|
+
it 'runs #work and joins the connection thread' do
|
99
|
+
QueueingRabbit.should_receive(:begin_worker_loop).and_yield
|
105
100
|
subject.work!
|
106
101
|
end
|
107
102
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe QueueingRabbit do
|
4
|
+
include_context "No existing connections"
|
4
5
|
include_context "StringIO logger"
|
5
6
|
|
6
7
|
let(:connection) { mock }
|
@@ -23,8 +24,6 @@ describe QueueingRabbit do
|
|
23
24
|
:bind_queue? => true)
|
24
25
|
}
|
25
26
|
|
26
|
-
before(:each) { subject.drop_connection }
|
27
|
-
|
28
27
|
it { should respond_to(:logger) }
|
29
28
|
it { should respond_to(:client) }
|
30
29
|
|
@@ -67,6 +66,19 @@ describe QueueingRabbit do
|
|
67
66
|
end
|
68
67
|
end
|
69
68
|
|
69
|
+
describe '.begin_worker_loop' do
|
70
|
+
|
71
|
+
before do
|
72
|
+
subject.instance_variable_set(:@connection, connection)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'begins the worker loop on opened connection' do
|
76
|
+
connection.should_receive(:begin_worker_loop).and_yield
|
77
|
+
expect { |b| subject.begin_worker_loop(&b) }.to yield_control
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
70
82
|
describe '.follow_job_requirements' do
|
71
83
|
let(:channel) { mock }
|
72
84
|
let(:exchange) { mock }
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: queueing_rabbit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Artem Chistyakov
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2014-01-02 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: amqp
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ~>
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: bunny
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rake
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: json
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -102,6 +111,7 @@ files:
|
|
102
111
|
- lib/queueing_rabbit/extensions/direct_exchange.rb
|
103
112
|
- lib/queueing_rabbit/extensions/new_relic.rb
|
104
113
|
- lib/queueing_rabbit/extensions/retryable.rb
|
114
|
+
- lib/queueing_rabbit/extensions/threaded.rb
|
105
115
|
- lib/queueing_rabbit/job.rb
|
106
116
|
- lib/queueing_rabbit/jobs/abstract_job.rb
|
107
117
|
- lib/queueing_rabbit/jobs/json_job.rb
|
@@ -118,11 +128,15 @@ files:
|
|
118
128
|
- spec/integration/binary_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb
|
119
129
|
- spec/integration/configuration_spec.rb
|
120
130
|
- spec/integration/direct_exchange_asynchronous_publishing_and_consuming_spec.rb
|
131
|
+
- spec/integration/jobs/json_threaded_print_line_job.rb
|
121
132
|
- spec/integration/jobs/print_line_job.rb
|
122
133
|
- spec/integration/json_job_asynchronous_publishing_and_consuming_spec.rb
|
134
|
+
- spec/integration/json_job_synchronous_publishing_and_consuming_spec.rb
|
123
135
|
- spec/integration/json_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb
|
124
136
|
- spec/integration/persistent_asynchronous_publishing_and_consuming_spec.rb
|
125
137
|
- spec/integration/synchronous_publishing_and_asynchronous_consuming_spec.rb
|
138
|
+
- spec/integration/synchronous_publishing_and_consuming_spec.rb
|
139
|
+
- spec/integration/synchronous_publishing_and_threaded_consuming_spec.rb
|
126
140
|
- spec/integration/synchronous_publishing_spec.rb
|
127
141
|
- spec/spec_helper.rb
|
128
142
|
- spec/support/shared_contexts.rb
|
@@ -136,6 +150,7 @@ files:
|
|
136
150
|
- spec/unit/queueing_rabbit/extensions/direct_exchange_spec.rb
|
137
151
|
- spec/unit/queueing_rabbit/extensions/new_relic_spec.rb
|
138
152
|
- spec/unit/queueing_rabbit/extensions/retryable_spec.rb
|
153
|
+
- spec/unit/queueing_rabbit/extensions/threaded_spec.rb
|
139
154
|
- spec/unit/queueing_rabbit/jobs/abstract_job_spec.rb
|
140
155
|
- spec/unit/queueing_rabbit/jobs/json_job_spec.rb
|
141
156
|
- spec/unit/queueing_rabbit/logging_spec.rb
|
@@ -144,27 +159,34 @@ files:
|
|
144
159
|
- spec/unit/queueing_rabbit_spec.rb
|
145
160
|
homepage: https://github.com/temochka/queueing_rabbit
|
146
161
|
licenses: []
|
147
|
-
metadata: {}
|
148
162
|
post_install_message:
|
149
163
|
rdoc_options:
|
150
164
|
- --charset=UTF-8
|
151
165
|
require_paths:
|
152
166
|
- lib
|
153
167
|
required_ruby_version: !ruby/object:Gem::Requirement
|
168
|
+
none: false
|
154
169
|
requirements:
|
155
170
|
- - ! '>='
|
156
171
|
- !ruby/object:Gem::Version
|
157
172
|
version: '0'
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
hash: -573605060713824976
|
158
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
159
178
|
requirements:
|
160
179
|
- - ! '>='
|
161
180
|
- !ruby/object:Gem::Version
|
162
181
|
version: '0'
|
182
|
+
segments:
|
183
|
+
- 0
|
184
|
+
hash: -573605060713824976
|
163
185
|
requirements: []
|
164
186
|
rubyforge_project:
|
165
|
-
rubygems_version:
|
187
|
+
rubygems_version: 1.8.23
|
166
188
|
signing_key:
|
167
|
-
specification_version:
|
189
|
+
specification_version: 3
|
168
190
|
summary: QueueingRabbit is an AMQP-based queueing system
|
169
191
|
test_files:
|
170
192
|
- spec/integration/asynchronous_publishing_and_consuming_spec.rb
|
@@ -172,11 +194,15 @@ test_files:
|
|
172
194
|
- spec/integration/binary_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb
|
173
195
|
- spec/integration/configuration_spec.rb
|
174
196
|
- spec/integration/direct_exchange_asynchronous_publishing_and_consuming_spec.rb
|
197
|
+
- spec/integration/jobs/json_threaded_print_line_job.rb
|
175
198
|
- spec/integration/jobs/print_line_job.rb
|
176
199
|
- spec/integration/json_job_asynchronous_publishing_and_consuming_spec.rb
|
200
|
+
- spec/integration/json_job_synchronous_publishing_and_consuming_spec.rb
|
177
201
|
- spec/integration/json_synchronous_publishing_via_bus_and_asynchronous_consuming_via_job_spec.rb
|
178
202
|
- spec/integration/persistent_asynchronous_publishing_and_consuming_spec.rb
|
179
203
|
- spec/integration/synchronous_publishing_and_asynchronous_consuming_spec.rb
|
204
|
+
- spec/integration/synchronous_publishing_and_consuming_spec.rb
|
205
|
+
- spec/integration/synchronous_publishing_and_threaded_consuming_spec.rb
|
180
206
|
- spec/integration/synchronous_publishing_spec.rb
|
181
207
|
- spec/spec_helper.rb
|
182
208
|
- spec/support/shared_contexts.rb
|
@@ -190,6 +216,7 @@ test_files:
|
|
190
216
|
- spec/unit/queueing_rabbit/extensions/direct_exchange_spec.rb
|
191
217
|
- spec/unit/queueing_rabbit/extensions/new_relic_spec.rb
|
192
218
|
- spec/unit/queueing_rabbit/extensions/retryable_spec.rb
|
219
|
+
- spec/unit/queueing_rabbit/extensions/threaded_spec.rb
|
193
220
|
- spec/unit/queueing_rabbit/jobs/abstract_job_spec.rb
|
194
221
|
- spec/unit/queueing_rabbit/jobs/json_job_spec.rb
|
195
222
|
- spec/unit/queueing_rabbit/logging_spec.rb
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
ZTk3ODlhMzY4N2ZkOGVmYWRkZmE3YzM2NDRkNzdkZDE3ZjhlZTZlMA==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
Y2QzZDZkNzdiMmM1NmY4ZWZhMTE4ZGQzNTFmM2U5N2YyMDMyZmEwMA==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MjFlYjE1ZmQ4ZGQ4MGQ1MGRmNjVjNGQzYzgxMGQ5NzAwNmE0NTY3M2IyMGI2
|
10
|
-
ZDNlYzRlZjFkZGQ3MTE0YmZmMGIzZjA3Njk0MjdiNTQ0ZWFkYmJiNzJlZDVj
|
11
|
-
NjRkZTllYTQwYzU5OWFlMmU4Njc0YjU5YTRhNDE2ZDcxOGYwODk=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OTNlYTBiMjJiNjcyYzEyZGQ4N2YzMjJjMTA1Yjg2NTRiZmQyNzc3OWQyOWZl
|
14
|
-
YWFiOTEzMTIwNTY3NzNhNzZkZDVhYWJlYmFlOWYxY2JiMjdlODQ0MjlkYTcx
|
15
|
-
ODI3NTJjOTEyZThlNTYyNTg4YWVlODk1MDg1MGQ1ODVjNjFmMGM=
|