euston-rabbitmq 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Gemfile.lock +103 -0
- data/Rakefile +182 -0
- data/euston-rabbitmq.gemspec +74 -0
- data/lib/euston-rabbitmq/buffered_message_dispatcher.rb +48 -0
- data/lib/euston-rabbitmq/command_handler_bindings.rb +30 -0
- data/lib/euston-rabbitmq/command_handlers/retry_failed_message.rb +29 -0
- data/lib/euston-rabbitmq/errors.rb +5 -0
- data/lib/euston-rabbitmq/event_handler_binding.rb +114 -0
- data/lib/euston-rabbitmq/event_handler_bindings.rb +30 -0
- data/lib/euston-rabbitmq/event_handlers/message_failure.rb +27 -0
- data/lib/euston-rabbitmq/event_store_dispatcher.rb +45 -0
- data/lib/euston-rabbitmq/exchanges.rb +17 -0
- data/lib/euston-rabbitmq/handler_bindings.rb +115 -0
- data/lib/euston-rabbitmq/message_buffer.rb +68 -0
- data/lib/euston-rabbitmq/message_logger.rb +50 -0
- data/lib/euston-rabbitmq/queue.rb +30 -0
- data/lib/euston-rabbitmq/queues.rb +13 -0
- data/lib/euston-rabbitmq/read_model/failed_message.rb +36 -0
- data/lib/euston-rabbitmq/read_model/message_buffer.rb +52 -0
- data/lib/euston-rabbitmq/read_model/message_log.rb +37 -0
- data/lib/euston-rabbitmq/version.rb +5 -0
- data/lib/euston-rabbitmq.rb +28 -0
- data/spec/command_buffer_spec.rb +69 -0
- data/spec/event_buffer_spec.rb +69 -0
- data/spec/exchange_declaration_spec.rb +28 -0
- data/spec/message_failure_spec.rb +77 -0
- data/spec/mt_safe_queue_subscription_spec.rb +72 -0
- data/spec/safe_queue_subscription_spec.rb +50 -0
- data/spec/spec_helper.rb +65 -0
- data/spec/support/factories.rb +18 -0
- metadata +265 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.expand_path('../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
unless RUBY_PLATFORM == 'java'
|
4
|
+
module MessageFailureTracking
|
5
|
+
module FailingCommandHandlers
|
6
|
+
class DeliverWidget
|
7
|
+
class << self
|
8
|
+
attr_accessor :fail_next
|
9
|
+
end
|
10
|
+
|
11
|
+
include Euston::CommandHandler
|
12
|
+
|
13
|
+
version 1 do |headers, command|
|
14
|
+
if self.class.fail_next
|
15
|
+
raise 'User-generated failure'
|
16
|
+
else
|
17
|
+
publish headers, command
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'message failure tracking' do
|
25
|
+
include EustonRmqSpec
|
26
|
+
include Euston::RabbitMq::Exchanges
|
27
|
+
include Euston::RabbitMq::Queues
|
28
|
+
|
29
|
+
amqp_before do
|
30
|
+
@exchange = get_exchange @channel, :commands
|
31
|
+
@handler = ::MessageFailureTracking::FailingCommandHandlers::DeliverWidget
|
32
|
+
|
33
|
+
command_handlers = Euston::RabbitMq::CommandHandlerBindings.new @channel
|
34
|
+
command_handlers.add_namespace Euston::RabbitMq::CommandHandlers
|
35
|
+
command_handlers.add_namespace ::MessageFailureTracking::FailingCommandHandlers
|
36
|
+
command_handlers.finalize_bindings
|
37
|
+
|
38
|
+
event_handlers = Euston::RabbitMq::EventHandlerBindings.new @channel
|
39
|
+
event_handlers.add_namespace Euston::RabbitMq::EventHandlers
|
40
|
+
event_handlers.finalize_bindings
|
41
|
+
|
42
|
+
@command = { :headers => { :id => Euston.uuid.generate,
|
43
|
+
:type => 'deliver_widget',
|
44
|
+
:version => 1 },
|
45
|
+
:body => { :id => Euston.uuid.generate,
|
46
|
+
:name => 'Bill Smith' } }
|
47
|
+
end
|
48
|
+
|
49
|
+
def publish
|
50
|
+
json = ::ActiveSupport::JSON.encode(@command)
|
51
|
+
opts = default_publish_options.merge(:routing_key => 'commands.deliver_widget')
|
52
|
+
delayed(0.3) { @exchange.publish json, opts }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'a failing command is published' do
|
56
|
+
it 'moves the message to the failed-messages queue' do
|
57
|
+
@handler.fail_next = true
|
58
|
+
received = 0
|
59
|
+
|
60
|
+
delayed(0.3) {
|
61
|
+
@queue = get_queue @channel, :message_failure
|
62
|
+
@queue.when(:message_received => ->(message) { received = received + 1 })
|
63
|
+
|
64
|
+
publish
|
65
|
+
}
|
66
|
+
|
67
|
+
done(3) {
|
68
|
+
received.should == 1
|
69
|
+
}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'a failed message is retried' do
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.expand_path('../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
if RUBY_PLATFORM == 'java'
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe 'message-failure-aware queue subscription' do
|
7
|
+
include EustonRmqSpec
|
8
|
+
|
9
|
+
PUBLISH_OPTS = { :immediate => false,
|
10
|
+
:mandatory => true,
|
11
|
+
:persistent => true,
|
12
|
+
:routing_key => 'messages.xyz' }
|
13
|
+
|
14
|
+
before :each do
|
15
|
+
@queue = @exchange = nil
|
16
|
+
@exchange = @channel.topic "test-#{Euston.uuid.generate}", :durable => true, :nowait => false
|
17
|
+
@queue = @channel.queue "test-#{Euston.uuid.generate}", :durable => true, :nowait => false
|
18
|
+
|
19
|
+
@queue.bind @exchange, :routing_key => 'messages.#'
|
20
|
+
@th = Thread.new do
|
21
|
+
Thread.current[:failed_count] = 0
|
22
|
+
Thread.current[:succeed_count] = 0
|
23
|
+
|
24
|
+
def on_message_decode_failed(message, error)
|
25
|
+
Thread.current[:failed_count] += 1
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_message_failed(message, error, msg)
|
29
|
+
Thread.current[:failed_count] += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def on_message_received(message)
|
33
|
+
if message[:a] == 'oops'
|
34
|
+
raise 'Something bad happened'
|
35
|
+
else
|
36
|
+
Thread.current[:succeed_count] += 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
@queue.when(:message_decode_failed => method(:on_message_decode_failed),
|
41
|
+
:message_failed => method(:on_message_failed),
|
42
|
+
:message_received => method(:on_message_received))
|
43
|
+
|
44
|
+
@queue.safe_subscribe
|
45
|
+
end
|
46
|
+
|
47
|
+
@th.abort_on_exception = true
|
48
|
+
end
|
49
|
+
|
50
|
+
after :each do
|
51
|
+
@th.kill
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'adds a failure-aware subscription function to the amqp queue object' do
|
55
|
+
@queue.class.should == AMQP::Queue
|
56
|
+
@queue.should respond_to(:safe_subscribe)
|
57
|
+
|
58
|
+
@exchange.publish ' *897d- -', PUBLISH_OPTS
|
59
|
+
sleep 0.25
|
60
|
+
@th[:failed_count].should == 1
|
61
|
+
|
62
|
+
jsn = JSON.generate({ :a => :b })
|
63
|
+
@exchange.publish jsn, PUBLISH_OPTS
|
64
|
+
sleep 0.25
|
65
|
+
@th[:succeed_count].should == 1
|
66
|
+
|
67
|
+
@exchange.publish JSON.generate({ :a => 'oops' }), PUBLISH_OPTS
|
68
|
+
sleep 0.25
|
69
|
+
@th[:failed_count].should == 2
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path('../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
unless RUBY_PLATFORM == 'java'
|
4
|
+
describe 'message-failure-aware queue subscription' do
|
5
|
+
include EustonRmqSpec
|
6
|
+
|
7
|
+
PUBLISH_OPTS = { :immediate => false,
|
8
|
+
:mandatory => true,
|
9
|
+
:persistent => true,
|
10
|
+
:routing_key => 'messages.xyz' }
|
11
|
+
|
12
|
+
amqp_before do
|
13
|
+
@exchange = @channel.topic "test-#{Euston.uuid.generate}", :durable => true, :nowait => false
|
14
|
+
@queue = @channel.queue "test-#{Euston.uuid.generate}", :durable => true, :nowait => false
|
15
|
+
@queue.bind @exchange, :routing_key => 'messages.#'
|
16
|
+
@queue.safe_subscribe
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'adds a failure-aware subscription function to the amqp queue object' do
|
20
|
+
@queue.should respond_to(:safe_subscribe)
|
21
|
+
|
22
|
+
done 1
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'publishes the message-decode-failed event when a non-json message is received by the queue' do
|
26
|
+
count = 0
|
27
|
+
@queue.when :message_decode_failed => ->(message, error) { count = count + 1 }
|
28
|
+
|
29
|
+
delayed(0.3) { @exchange.publish ' *897d- -', PUBLISH_OPTS }
|
30
|
+
done(1) { count.should == 1 }
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'publishes the message-received event when a message is received by the queue' do
|
34
|
+
count = 0
|
35
|
+
@queue.when :message_received => ->(message) { count = count + 1 }
|
36
|
+
|
37
|
+
delayed(0.3) { @exchange.publish ::ActiveSupport::JSON.encode({ :a => :b }), PUBLISH_OPTS }
|
38
|
+
done(1) { count.should == 1 }
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'publishes the message-failed event when an exception occurs during the message-received handler' do
|
42
|
+
count = 0
|
43
|
+
@queue.when(:message_failed => ->(message, error, header) { count = count + 1 },
|
44
|
+
:message_received => ->(message) { raise 'Something bad happened' })
|
45
|
+
|
46
|
+
delayed(0.3) { @exchange.publish ::ActiveSupport::JSON.encode({ :a => :b }), PUBLISH_OPTS }
|
47
|
+
done(1) { count.should == 1 }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
AMQP_OPTS = { :user => 'euston-rabbitmq-tester',
|
2
|
+
:pass => 'password',
|
3
|
+
:host => 'localhost',
|
4
|
+
:vhost => '/euston-rabbitmq-test' }
|
5
|
+
|
6
|
+
require 'ap'
|
7
|
+
require 'euston-rabbitmq'
|
8
|
+
require 'evented-spec' unless RUBY_PLATFORM == 'java'
|
9
|
+
require 'faker'
|
10
|
+
require_rel 'support'
|
11
|
+
|
12
|
+
def trim_array_ends array
|
13
|
+
array.shift
|
14
|
+
array.pop
|
15
|
+
array
|
16
|
+
end
|
17
|
+
|
18
|
+
module EustonRmqSpec
|
19
|
+
def self.included scope
|
20
|
+
unless RUBY_PLATFORM == 'java'
|
21
|
+
scope.send :include, EventedSpec::AMQPSpec
|
22
|
+
scope.send :default_options, AMQP_OPTS
|
23
|
+
scope.send :default_timeout, 60
|
24
|
+
end
|
25
|
+
|
26
|
+
scope.send :before, :each do
|
27
|
+
vhosts = `rabbitmqctl list_vhosts`.split("\n")
|
28
|
+
vhosts = trim_array_ends vhosts
|
29
|
+
vhost = '/euston-rabbitmq-test'
|
30
|
+
|
31
|
+
`rabbitmqctl delete_vhost #{vhost}` if vhosts.include? vhost
|
32
|
+
`rabbitmqctl add_vhost #{vhost}`
|
33
|
+
|
34
|
+
users = `rabbitmqctl list_users`.split("\n")
|
35
|
+
users = trim_array_ends users
|
36
|
+
users = users.map { |u| u.split("\t").shift }
|
37
|
+
|
38
|
+
user, password = 'euston-rabbitmq-tester', 'password'
|
39
|
+
|
40
|
+
`rabbitmqctl delete_user #{user}` if users.include? user
|
41
|
+
`rabbitmqctl add_user #{user} #{password}`
|
42
|
+
`rabbitmqctl set_permissions -p #{vhost} #{user} ".*" ".*" ".*"`
|
43
|
+
`rabbitmqctl set_permissions -p #{vhost} guest ".*" ".*" ".*"` if users.include? 'guest'
|
44
|
+
end
|
45
|
+
|
46
|
+
scope.send :before, :each do
|
47
|
+
connection = Mongo::Connection.new('localhost', 27017)
|
48
|
+
db = connection.db('euston-rabbitmq-test-event-store')
|
49
|
+
db.collections.select { |c| c.name !~ /system/ }.each { |c| db.drop_collection c.name }
|
50
|
+
Euston::RabbitMq.event_store_mongodb = db
|
51
|
+
end
|
52
|
+
|
53
|
+
if RUBY_PLATFORM == 'java'
|
54
|
+
scope.send :before, :each do
|
55
|
+
AMQP.settings.merge! AMQP_OPTS
|
56
|
+
@channel = AMQP::Channel.new
|
57
|
+
end
|
58
|
+
else
|
59
|
+
scope.send :amqp_before do
|
60
|
+
@channel = AMQP::Channel.new
|
61
|
+
@channel.should be_open
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Factory
|
2
|
+
class << self
|
3
|
+
def command_headers
|
4
|
+
{
|
5
|
+
:id => Euston.uuid.generate,
|
6
|
+
:type => Faker::Lorem.words(2).join('_'),
|
7
|
+
:version => 1
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def command
|
12
|
+
{
|
13
|
+
:headers => Factory.command_headers,
|
14
|
+
:body => Hash[Faker::Lorem.words(3).map { |w| [w.downcase.to_sym, Faker::Lorem.words(3).join(' ')] }]
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: euston-rabbitmq
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Lee Henson
|
9
|
+
- Guy Boertje
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2011-09-16 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activesupport
|
17
|
+
requirement: &78505630 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *78505630
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: euston
|
28
|
+
requirement: &78505280 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *78505280
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: euston-eventstore
|
39
|
+
requirement: &78504740 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 1.0.0
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *78504740
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: hash-keys
|
50
|
+
requirement: &78504280 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.0.0
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *78504280
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: hollywood
|
61
|
+
requirement: &78503980 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.0.0
|
67
|
+
type: :runtime
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *78503980
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: require_all
|
72
|
+
requirement: &78503200 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.2.0
|
78
|
+
type: :runtime
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *78503200
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: robustthread
|
83
|
+
requirement: &78502800 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.5.2
|
89
|
+
type: :runtime
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: *78502800
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: safely
|
94
|
+
requirement: &78502520 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.3.0
|
100
|
+
type: :runtime
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *78502520
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: amqp
|
105
|
+
requirement: &78502200 !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.8.0
|
111
|
+
type: :runtime
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: *78502200
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: bson_ext
|
116
|
+
requirement: &78490410 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ~>
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: 1.3.1
|
122
|
+
type: :runtime
|
123
|
+
prerelease: false
|
124
|
+
version_requirements: *78490410
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: eventmachine
|
127
|
+
requirement: &78490140 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ~>
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.12.10
|
133
|
+
type: :runtime
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *78490140
|
136
|
+
- !ruby/object:Gem::Dependency
|
137
|
+
name: mongo
|
138
|
+
requirement: &78489850 !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ~>
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: 1.3.1
|
144
|
+
type: :runtime
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: *78489850
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
name: evented-spec
|
149
|
+
requirement: &78489210 !ruby/object:Gem::Requirement
|
150
|
+
none: false
|
151
|
+
requirements:
|
152
|
+
- - ~>
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 0.9.0
|
155
|
+
type: :development
|
156
|
+
prerelease: false
|
157
|
+
version_requirements: *78489210
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: awesome_print
|
160
|
+
requirement: &78488670 !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ~>
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.4.0
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: *78488670
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: faker
|
171
|
+
requirement: &78487990 !ruby/object:Gem::Requirement
|
172
|
+
none: false
|
173
|
+
requirements:
|
174
|
+
- - ~>
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: 1.0.0
|
177
|
+
type: :development
|
178
|
+
prerelease: false
|
179
|
+
version_requirements: *78487990
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
name: fuubar
|
182
|
+
requirement: &78487720 !ruby/object:Gem::Requirement
|
183
|
+
none: false
|
184
|
+
requirements:
|
185
|
+
- - ~>
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 0.0.0
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: *78487720
|
191
|
+
- !ruby/object:Gem::Dependency
|
192
|
+
name: rspec
|
193
|
+
requirement: &78487480 !ruby/object:Gem::Requirement
|
194
|
+
none: false
|
195
|
+
requirements:
|
196
|
+
- - ~>
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: 2.6.0
|
199
|
+
type: :development
|
200
|
+
prerelease: false
|
201
|
+
version_requirements: *78487480
|
202
|
+
description: JRuby RabbitMq bindings
|
203
|
+
email:
|
204
|
+
- lee.m.henson@gmail.com
|
205
|
+
- guyboertje@gmail.com
|
206
|
+
executables: []
|
207
|
+
extensions: []
|
208
|
+
extra_rdoc_files: []
|
209
|
+
files:
|
210
|
+
- Gemfile
|
211
|
+
- Gemfile.lock
|
212
|
+
- Rakefile
|
213
|
+
- euston-rabbitmq.gemspec
|
214
|
+
- lib/euston-rabbitmq.rb
|
215
|
+
- lib/euston-rabbitmq/buffered_message_dispatcher.rb
|
216
|
+
- lib/euston-rabbitmq/command_handler_bindings.rb
|
217
|
+
- lib/euston-rabbitmq/command_handlers/retry_failed_message.rb
|
218
|
+
- lib/euston-rabbitmq/errors.rb
|
219
|
+
- lib/euston-rabbitmq/event_handler_binding.rb
|
220
|
+
- lib/euston-rabbitmq/event_handler_bindings.rb
|
221
|
+
- lib/euston-rabbitmq/event_handlers/message_failure.rb
|
222
|
+
- lib/euston-rabbitmq/event_store_dispatcher.rb
|
223
|
+
- lib/euston-rabbitmq/exchanges.rb
|
224
|
+
- lib/euston-rabbitmq/handler_bindings.rb
|
225
|
+
- lib/euston-rabbitmq/message_buffer.rb
|
226
|
+
- lib/euston-rabbitmq/message_logger.rb
|
227
|
+
- lib/euston-rabbitmq/queue.rb
|
228
|
+
- lib/euston-rabbitmq/queues.rb
|
229
|
+
- lib/euston-rabbitmq/read_model/failed_message.rb
|
230
|
+
- lib/euston-rabbitmq/read_model/message_buffer.rb
|
231
|
+
- lib/euston-rabbitmq/read_model/message_log.rb
|
232
|
+
- lib/euston-rabbitmq/version.rb
|
233
|
+
- spec/command_buffer_spec.rb
|
234
|
+
- spec/event_buffer_spec.rb
|
235
|
+
- spec/exchange_declaration_spec.rb
|
236
|
+
- spec/message_failure_spec.rb
|
237
|
+
- spec/mt_safe_queue_subscription_spec.rb
|
238
|
+
- spec/safe_queue_subscription_spec.rb
|
239
|
+
- spec/spec_helper.rb
|
240
|
+
- spec/support/factories.rb
|
241
|
+
homepage: http://github.com/leemhenson/euston-rabbitmq
|
242
|
+
licenses: []
|
243
|
+
post_install_message:
|
244
|
+
rdoc_options: []
|
245
|
+
require_paths:
|
246
|
+
- lib
|
247
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
248
|
+
none: false
|
249
|
+
requirements:
|
250
|
+
- - ! '>='
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
version: '0'
|
253
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
254
|
+
none: false
|
255
|
+
requirements:
|
256
|
+
- - ! '>='
|
257
|
+
- !ruby/object:Gem::Version
|
258
|
+
version: '0'
|
259
|
+
requirements: []
|
260
|
+
rubyforge_project:
|
261
|
+
rubygems_version: 1.8.10
|
262
|
+
signing_key:
|
263
|
+
specification_version: 3
|
264
|
+
summary: RabbitMq bindings for Euston.
|
265
|
+
test_files: []
|