message-driver 0.1.0 → 0.2.0.rc1
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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +18 -7
- data/CHANGELOG.md +12 -2
- data/Gemfile +17 -0
- data/Guardfile +8 -4
- data/README.md +14 -5
- data/Rakefile +44 -11
- data/examples/basic_producer_and_consumer/Gemfile +5 -0
- data/examples/basic_producer_and_consumer/common.rb +17 -0
- data/examples/basic_producer_and_consumer/consumer.rb +24 -0
- data/examples/basic_producer_and_consumer/producer.rb +33 -0
- data/features/.nav +8 -0
- data/features/CHANGELOG.md +12 -2
- data/features/amqp_specific_features/binding_amqp_destinations.feature +7 -7
- data/features/amqp_specific_features/declaring_amqp_exchanges.feature +3 -3
- data/features/amqp_specific_features/nack_redelivered_messages.feature +92 -0
- data/features/amqp_specific_features/requeueing_on_nack.feature +44 -0
- data/features/amqp_specific_features/server_named_destinations.feature +5 -5
- data/features/client_acks.feature +92 -0
- data/features/destination_metadata.feature +9 -11
- data/features/dynamic_destinations.feature +7 -7
- data/features/error_handling.feature +11 -9
- data/features/logging.feature +14 -0
- data/features/message_consumers/auto_ack_consumers.feature +79 -0
- data/features/message_consumers/manual_ack_consumers.feature +95 -0
- data/features/message_consumers/transactional_ack_consumers.feature +77 -0
- data/features/message_consumers.feature +54 -0
- data/features/publishing_a_message.feature +6 -10
- data/features/publishing_with_transactions.feature +10 -14
- data/features/rabbitmq_specific_features/dead_letter_queueing.feature +116 -0
- data/features/step_definitions/dynamic_destinations_steps.rb +3 -3
- data/features/step_definitions/error_handling_steps.rb +4 -2
- data/features/step_definitions/logging_steps.rb +28 -0
- data/features/step_definitions/message_consumers_steps.rb +29 -0
- data/features/step_definitions/steps.rb +60 -9
- data/features/support/broker_config_helper.rb +19 -0
- data/features/support/env.rb +1 -0
- data/features/support/firewall_helper.rb +8 -11
- data/features/support/message_table_matcher.rb +21 -5
- data/features/support/test_runner.rb +39 -16
- data/lib/message_driver/adapters/base.rb +51 -4
- data/lib/message_driver/adapters/bunny_adapter.rb +251 -127
- data/lib/message_driver/adapters/in_memory_adapter.rb +97 -18
- data/lib/message_driver/adapters/stomp_adapter.rb +127 -0
- data/lib/message_driver/broker.rb +23 -24
- data/lib/message_driver/client.rb +157 -0
- data/lib/message_driver/destination.rb +7 -4
- data/lib/message_driver/errors.rb +27 -0
- data/lib/message_driver/logging.rb +11 -0
- data/lib/message_driver/message.rb +8 -0
- data/lib/message_driver/subscription.rb +18 -0
- data/lib/message_driver/vendor/.document +0 -0
- data/lib/message_driver/vendor/nesty/nested_error.rb +26 -0
- data/lib/message_driver/vendor/nesty.rb +1 -0
- data/lib/message_driver/version.rb +1 -1
- data/lib/message_driver.rb +4 -2
- data/message-driver.gemspec +4 -4
- data/spec/integration/{amqp_integration_spec.rb → bunny/amqp_integration_spec.rb} +29 -28
- data/spec/integration/bunny/bunny_adapter_spec.rb +339 -0
- data/spec/integration/in_memory/in_memory_adapter_spec.rb +126 -0
- data/spec/integration/stomp/stomp_adapter_spec.rb +142 -0
- data/spec/spec_helper.rb +5 -2
- data/spec/support/shared/adapter_examples.rb +17 -0
- data/spec/support/shared/client_ack_examples.rb +18 -0
- data/spec/support/shared/context_examples.rb +14 -0
- data/spec/support/shared/destination_examples.rb +4 -5
- data/spec/support/shared/subscription_examples.rb +146 -0
- data/spec/support/shared/transaction_examples.rb +43 -0
- data/spec/support/utils.rb +14 -0
- data/spec/units/message_driver/adapters/base_spec.rb +38 -19
- data/spec/units/message_driver/broker_spec.rb +71 -18
- data/spec/units/message_driver/client_spec.rb +375 -0
- data/spec/units/message_driver/destination_spec.rb +9 -0
- data/spec/units/message_driver/logging_spec.rb +18 -0
- data/spec/units/message_driver/message_spec.rb +36 -0
- data/spec/units/message_driver/subscription_spec.rb +24 -0
- data/test_lib/broker_config.rb +50 -20
- metadata +83 -45
- data/.rbenv-version +0 -1
- data/lib/message_driver/exceptions.rb +0 -18
- data/lib/message_driver/message_publisher.rb +0 -15
- data/spec/integration/message_driver/adapters/bunny_adapter_spec.rb +0 -301
- data/spec/units/message_driver/adapters/in_memory_adapter_spec.rb +0 -43
- data/spec/units/message_driver/message_publisher_spec.rb +0 -65
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ee1e524ed1e97823d1bf57bebb54afdd7be3d377
|
4
|
+
data.tar.gz: a1e55de021a74bcbf71b4df3be92e3f28506464f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: aaa3bd79fe84ddb7020fbb1173824d4bd24dba54b86737712bf412f450d07bee650ea1636d411f55a7d19668a950e87d4a583ac28fd2f167814fad1ea253accb
|
7
|
+
data.tar.gz: b71dbc3eb07d9f75b00032ea1c8bdcf8412026cc8b51a77c257ec62b8b578d754efdbeaf7a2b5b3a46763f2723150bfd181d970756b3d7852cf01a254a205d4e
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -5,19 +5,30 @@ services:
|
|
5
5
|
before_script:
|
6
6
|
- sudo rabbitmqctl add_vhost message-driver-test
|
7
7
|
- sudo rabbitmqctl set_permissions -p message-driver-test guest ".*" ".*" ".*"
|
8
|
+
- sudo rabbitmq-plugins enable rabbitmq_stomp
|
9
|
+
- sudo service rabbitmq-server restart
|
10
|
+
env:
|
11
|
+
- ADAPTER=in_memory
|
12
|
+
- ADAPTER=bunny:0.9.0
|
13
|
+
- ADAPTER=bunny:0.10.0
|
14
|
+
- ADAPTER=stomp
|
15
|
+
- ADAPTER=bunny:1.0.0.pre
|
8
16
|
rvm:
|
9
|
-
- 1.9.2
|
10
|
-
- 1.9.3
|
11
17
|
- 2.0.0
|
18
|
+
- 1.9.3
|
19
|
+
- 1.9.2
|
12
20
|
- jruby-19mode
|
13
|
-
- ruby-head
|
14
21
|
- jruby-head
|
15
22
|
- rbx-19mode
|
16
|
-
env:
|
17
|
-
- ADAPTER=in_memory
|
18
|
-
- ADAPTER=bunny
|
19
23
|
matrix:
|
24
|
+
exclude:
|
25
|
+
- rvm: jruby-19mode
|
26
|
+
env: ADAPTER=bunny:0.9.0
|
27
|
+
- rvm: jruby-head
|
28
|
+
env: ADAPTER=bunny:0.9.0
|
20
29
|
allow_failures:
|
21
|
-
-
|
30
|
+
- env: ADAPTER=bunny:1.0.0.pre
|
22
31
|
- rvm: jruby-head
|
23
32
|
- rvm: rbx-19mode
|
33
|
+
- rvm: jruby-19mode
|
34
|
+
env: ADAPTER=stomp
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
#
|
1
|
+
# Changelog
|
2
2
|
|
3
|
-
## 0.
|
3
|
+
## 0.2.0.rc1 - 2013-09-23
|
4
|
+
|
5
|
+
* Features
|
6
|
+
* Message Consumers
|
7
|
+
* Bunny and InMemory adapters
|
8
|
+
* Client Acks
|
9
|
+
* Bunny adapter
|
10
|
+
* Adapters
|
11
|
+
* begin work on Stomp 1.1/1.2 adapter
|
12
|
+
|
13
|
+
## 0.1.0 - 2013-04-05
|
4
14
|
|
5
15
|
Initial Release
|
6
16
|
|
data/Gemfile
CHANGED
@@ -16,5 +16,22 @@ group :tools do
|
|
16
16
|
gem 'ruby_gntp'
|
17
17
|
gem 'rb-fsevent'
|
18
18
|
gem 'relish'
|
19
|
+
gem 'lunchy'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
require File.expand_path("../test_lib/broker_config", __FILE__)
|
24
|
+
|
25
|
+
adapter = BrokerConfig.current_adapter.to_s
|
26
|
+
version = BrokerConfig.adapter_version
|
27
|
+
|
28
|
+
case adapter
|
29
|
+
when 'in_memory'
|
30
|
+
else
|
31
|
+
case version
|
32
|
+
when nil
|
33
|
+
gem adapter
|
34
|
+
else
|
35
|
+
gem adapter.to_s, "~> #{version}"
|
19
36
|
end
|
20
37
|
end
|
data/Guardfile
CHANGED
@@ -8,8 +8,9 @@ guard 'bundler' do
|
|
8
8
|
watch(/^.+\.gemspec/)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
common_rspec_opts = {keep_failed: true, all_after_pass: true}
|
12
|
+
unit_spec_opts = common_rspec_opts.merge({spec_paths: ["spec/units"], cli: '-f doc', run_all: {cli: ''}})
|
13
|
+
integration_spec_opts = common_rspec_opts.merge({spec_paths: ["spec/integration/#{BrokerConfig.current_adapter}"], cli: '-f doc -t all_adapters', run_all: {cli: '-t all_adapters'}})
|
13
14
|
|
14
15
|
group 'specs' do
|
15
16
|
guard 'rspec', unit_spec_opts do
|
@@ -21,15 +22,18 @@ group 'specs' do
|
|
21
22
|
end
|
22
23
|
|
23
24
|
group 'integration' do
|
24
|
-
guard 'rspec',
|
25
|
+
guard 'rspec', integration_spec_opts do
|
25
26
|
watch(%r{^spec/integration/.+_spec\.rb$})
|
26
27
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/integration/#{m[1]}_spec.rb" }
|
27
28
|
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
28
29
|
watch('spec/spec_helper.rb') { "spec" }
|
29
30
|
end
|
31
|
+
end
|
30
32
|
|
33
|
+
group 'features' do
|
31
34
|
cucumber_cli = "--no-profile --color --format progress --strict --tag @all_adapters,@#{BrokerConfig.current_adapter} --tag ~@wip"
|
32
|
-
|
35
|
+
cucumber_run_all_cli = "#{cucumber_cli} --tag ~@slow"
|
36
|
+
guard 'cucumber', change_format: 'pretty', all_on_start: false, cli: cucumber_cli, run_all: { cli: cucumber_run_all_cli } do
|
33
37
|
watch(%r{^features/.+\.feature$})
|
34
38
|
watch(%r{^features/support/.+$}) { 'features' }
|
35
39
|
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
|
data/README.md
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
Easy message queues for ruby
|
4
4
|
|
5
|
-
[](http://badge.fury.io/rb/message-driver)
|
6
6
|
|
7
|
-
[](https://travis-ci.org/message-driver/message-driver)
|
8
8
|
|
9
|
-
[](https://gemnasium.com/message-driver/message-driver)
|
10
|
+
|
11
|
+
[](https://codeclimate.com/github/message-driver/message-driver)
|
10
12
|
|
11
13
|
## Installation
|
12
14
|
|
@@ -14,6 +16,11 @@ Add this line to your application's Gemfile:
|
|
14
16
|
|
15
17
|
gem 'message-driver'
|
16
18
|
|
19
|
+
You'll also want to add a driver gem:
|
20
|
+
|
21
|
+
gem 'bunny'
|
22
|
+
gem 'stomp'
|
23
|
+
|
17
24
|
And then execute:
|
18
25
|
|
19
26
|
$ bundle
|
@@ -22,9 +29,11 @@ Or install it yourself as:
|
|
22
29
|
|
23
30
|
$ gem install message-driver
|
24
31
|
|
25
|
-
##
|
32
|
+
## Documentation
|
33
|
+
|
34
|
+
You can find the main documentation here: https://www.relishapp.com/message-driver/message-driver
|
26
35
|
|
27
|
-
|
36
|
+
You can also take a look at the [examples](/examples)
|
28
37
|
|
29
38
|
## Contributing
|
30
39
|
|
data/Rakefile
CHANGED
@@ -1,23 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
1
4
|
require 'bundler/gem_tasks'
|
2
5
|
|
3
6
|
require 'rspec/core/rake_task'
|
4
7
|
require 'cucumber/rake/task'
|
5
8
|
|
6
|
-
require File.join(File.dirname(__FILE__), 'test_lib', 'broker_config')
|
9
|
+
#require File.join(File.dirname(__FILE__), 'test_lib', 'broker_config')
|
10
|
+
|
11
|
+
namespace :spec do
|
12
|
+
desc "Run unit specs"
|
13
|
+
RSpec::Core::RakeTask.new(:units) do |t|
|
14
|
+
t.pattern = "./spec/units{,/*/**}/*_spec.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the integration specs"
|
18
|
+
RSpec::Core::RakeTask.new(:integrations) do |t|
|
19
|
+
t.rspec_opts = "--tag all_adapters"
|
20
|
+
t.pattern = "./spec/integration/#{BrokerConfig.current_adapter}{,/*/**}/*_spec.rb"
|
21
|
+
end
|
22
|
+
|
23
|
+
cucumber_opts = "--format progress --tag @all_adapters,@#{BrokerConfig.current_adapter} --tag ~@wip"
|
24
|
+
cucumber_opts += " --tag ~@no_ci" if ENV['CI']=='true' && ENV['ADAPTER'] && ENV['ADAPTER'].start_with?('bunny')
|
25
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
26
|
+
t.cucumber_opts = cucumber_opts
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "run all the specs"
|
30
|
+
task :all => [:units, :integrations, :features]
|
7
31
|
|
8
|
-
|
9
|
-
|
32
|
+
desc "run all the specs for each adapter"
|
33
|
+
task :all_adapters do
|
34
|
+
current_adapter = BrokerConfig.current_adapter
|
35
|
+
BrokerConfig.all_adapters.each do |adapter|
|
36
|
+
set_adapter_under_test(adapter)
|
37
|
+
system("rake spec:all")
|
38
|
+
end
|
39
|
+
set_adapter_under_test(current_adapter)
|
40
|
+
end
|
10
41
|
end
|
11
42
|
|
12
|
-
|
13
|
-
|
14
|
-
t.pattern = "./spec/integration{,/*/**}/*_spec.rb"
|
43
|
+
def set_adapter_under_test(adapter)
|
44
|
+
system "echo #{adapter} > #{File.join(File.dirname(__FILE__), '.adapter_under_test')}"
|
15
45
|
end
|
16
46
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
47
|
+
namespace :undertest do
|
48
|
+
BrokerConfig.all_adapters.each do |adapter|
|
49
|
+
desc "set the adapter under test to #{adapter}"
|
50
|
+
task adapter do
|
51
|
+
set_adapter_under_test(adapter)
|
52
|
+
end
|
53
|
+
end
|
21
54
|
end
|
22
55
|
|
23
|
-
task :default => [
|
56
|
+
task :default => ["spec:all"]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'message-driver'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
LOG = Logger.new(STDOUT)
|
6
|
+
LOG.level = Logger::DEBUG
|
7
|
+
|
8
|
+
MessageDriver.configure(
|
9
|
+
adapter: "bunny",
|
10
|
+
vhost: "message-driver-dev",
|
11
|
+
heartbeat_interval: 2,
|
12
|
+
logger: LOG
|
13
|
+
)
|
14
|
+
|
15
|
+
MessageDriver::Broker.define do |b|
|
16
|
+
b.destination :basic_consumer_producer, "basic.consumer.producer", durable: true
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative "./common"
|
2
|
+
|
3
|
+
LOG.info("starting consumer")
|
4
|
+
|
5
|
+
end_thread = Thread.new do
|
6
|
+
Thread.stop
|
7
|
+
LOG.info("stopping consumer")
|
8
|
+
MessageDriver::Broker.stop
|
9
|
+
end
|
10
|
+
|
11
|
+
ending_proc = proc do
|
12
|
+
end_thread.wakeup
|
13
|
+
end
|
14
|
+
|
15
|
+
trap "TERM", &ending_proc
|
16
|
+
trap "INT", &ending_proc
|
17
|
+
|
18
|
+
MessageDriver::Broker.consumer(:basic_consumer) do |message|
|
19
|
+
LOG.info("I got a message! #{message.body}")
|
20
|
+
end
|
21
|
+
|
22
|
+
MessageDriver::Client.subscribe(:basic_consumer_producer, :basic_consumer)
|
23
|
+
|
24
|
+
end_thread.join
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative "./common"
|
2
|
+
|
3
|
+
LOG.info("starting producer")
|
4
|
+
|
5
|
+
stopping = false
|
6
|
+
|
7
|
+
ending_proc = proc do
|
8
|
+
stopping = true
|
9
|
+
end
|
10
|
+
|
11
|
+
trap "TERM", &ending_proc
|
12
|
+
trap "INT", &ending_proc
|
13
|
+
|
14
|
+
counter = 0
|
15
|
+
|
16
|
+
while !stopping do
|
17
|
+
10.times do
|
18
|
+
counter += 1
|
19
|
+
begin
|
20
|
+
MessageDriver::Client.publish(:basic_consumer_producer, "message #{counter}")
|
21
|
+
rescue MessageDriver::ConnectionError => e
|
22
|
+
LOG.info("The connection is closed! #{e}")
|
23
|
+
sleep 1
|
24
|
+
LOG.info("retrying...")
|
25
|
+
retry
|
26
|
+
end
|
27
|
+
end
|
28
|
+
LOG.info("sent 10 more messages for a total of #{counter}")
|
29
|
+
sleep 1
|
30
|
+
end
|
31
|
+
|
32
|
+
LOG.info("stopping producer")
|
33
|
+
MessageDriver::Broker.stop
|
data/features/.nav
CHANGED
@@ -4,9 +4,17 @@
|
|
4
4
|
- publishing_with_transactions.feature
|
5
5
|
- dynamic_destinations.feature
|
6
6
|
- destination_metadata.feature
|
7
|
+
- client_acks.feature
|
8
|
+
- logging.feature
|
9
|
+
- message_consumers.feature
|
10
|
+
- message_consumers
|
11
|
+
- auto_ack_consumers.feature
|
12
|
+
- manual_ack_consumers.feature
|
13
|
+
- transactional_ack_consumers.feature
|
7
14
|
- amqp_specific_features (AMQP-Specific Features):
|
8
15
|
- declaring_amqp_destinations.feature
|
9
16
|
- binding_amqp_destinations.feature
|
10
17
|
- server_named_desitnations.feature
|
18
|
+
- requeueing_on_nack.feature
|
11
19
|
- error_handling.feature
|
12
20
|
- Rails.md
|
data/features/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
#
|
1
|
+
# Changelog
|
2
2
|
|
3
|
-
## 0.
|
3
|
+
## 0.2.0.rc1 - 2013-09-23
|
4
|
+
|
5
|
+
* Features
|
6
|
+
* Message Consumers
|
7
|
+
* Bunny and InMemory adapters
|
8
|
+
* Client Acks
|
9
|
+
* Bunny adapter
|
10
|
+
* Adapters
|
11
|
+
* begin work on Stomp 1.1/1.2 adapter
|
12
|
+
|
13
|
+
## 0.1.0 - 2013-04-05
|
4
14
|
|
5
15
|
Initial Release
|
6
16
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
@bunny
|
2
2
|
Feature: Binding AMQP destinations to exchanges
|
3
3
|
Background:
|
4
|
-
Given the following broker configuration
|
4
|
+
Given the following broker configuration
|
5
5
|
"""ruby
|
6
6
|
MessageDriver::Broker.define do |b|
|
7
7
|
b.destination :direct_exchange, "amq.direct", type: :exchange
|
@@ -9,10 +9,10 @@ Feature: Binding AMQP destinations to exchanges
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
Scenario: Binding a queue to an exchange
|
12
|
-
When I execute the following code
|
12
|
+
When I execute the following code
|
13
13
|
"""ruby
|
14
14
|
MessageDriver::Broker.define do |b|
|
15
|
-
b.destination :my_queue, "
|
15
|
+
b.destination :my_queue, "my_bound_queue", exclusive: true, bindings: [
|
16
16
|
{source: "amq.direct", args: {routing_key: "test_binding"}},
|
17
17
|
{source: "amq.direct", args: {routing_key: "spec_binding"}}
|
18
18
|
]
|
@@ -22,7 +22,7 @@ Feature: Binding AMQP destinations to exchanges
|
|
22
22
|
publish(:direct_exchange, "Spec Message", {}, {routing_key: "spec_binding"})
|
23
23
|
"""
|
24
24
|
|
25
|
-
Then I expect to find 2 messages on :my_queue
|
25
|
+
Then I expect to find the following 2 messages on :my_queue
|
26
26
|
| body |
|
27
27
|
| Test Message |
|
28
28
|
| Spec Message |
|
@@ -30,21 +30,21 @@ Feature: Binding AMQP destinations to exchanges
|
|
30
30
|
Scenario: Binding an exchange to an exchange
|
31
31
|
RabbitMQ's AMQP 0.9 extenstions support binding exchanges to exchanges
|
32
32
|
|
33
|
-
When I execute the following code
|
33
|
+
When I execute the following code
|
34
34
|
"""ruby
|
35
35
|
MessageDriver::Broker.define do |b|
|
36
36
|
b.destination :fanout, "amq.fanout", type: :exchange, bindings: [
|
37
37
|
{source: "amq.direct", args: {routing_key: "test_binding"}},
|
38
38
|
{source: "amq.direct", args: {routing_key: "spec_binding"}}
|
39
39
|
]
|
40
|
-
b.destination :my_queue, "
|
40
|
+
b.destination :my_queue, "my_bound_queue", exclusive: true, bindings: [{source: "amq.fanout"}]
|
41
41
|
end
|
42
42
|
|
43
43
|
publish(:direct_exchange, "Test Message", {}, {routing_key: "test_binding"})
|
44
44
|
publish(:direct_exchange, "Spec Message", {}, {routing_key: "spec_binding"})
|
45
45
|
"""
|
46
46
|
|
47
|
-
Then I expect to find 2 messages on :my_queue
|
47
|
+
Then I expect to find the following 2 messages on :my_queue
|
48
48
|
| body |
|
49
49
|
| Test Message |
|
50
50
|
| Spec Message |
|
@@ -7,16 +7,16 @@ Feature: Declaring AMQP exchanges
|
|
7
7
|
Given I am connected to the broker
|
8
8
|
|
9
9
|
Scenario: Declaring a direct exchange
|
10
|
-
When I execute the following code
|
10
|
+
When I execute the following code
|
11
11
|
"""ruby
|
12
12
|
MessageDriver::Broker.define do |b|
|
13
13
|
b.destination :my_exchange, "my_exchange", type: :exchange, declare: {type: :direct, auto_delete: true}
|
14
|
-
b.destination :my_queue, "
|
14
|
+
b.destination :my_queue, "", exclusive: true, bindings: [{source: "my_exchange", routing_key: "my_queue"}]
|
15
15
|
end
|
16
16
|
|
17
17
|
publish(:my_exchange, "Test My New Exchange", routing_key: "my_queue")
|
18
18
|
"""
|
19
19
|
|
20
|
-
Then I expect to find
|
20
|
+
Then I expect to find the following message on :my_queue
|
21
21
|
| body |
|
22
22
|
| Test My New Exchange |
|
@@ -0,0 +1,92 @@
|
|
1
|
+
@bunny
|
2
|
+
Feature: Nacking Redelievered Messages from a consumer
|
3
|
+
|
4
|
+
You can configure the consumer to nack a re-delievered message. In this example, we use
|
5
|
+
a dead letter exchange to show how things end up working.
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given the following broker configuration
|
9
|
+
"""ruby
|
10
|
+
MessageDriver::Broker.define do |b|
|
11
|
+
# declare a dead letter exchange
|
12
|
+
b.destination :rabbit_dlx, "rabbit.dead.letter.exchange", type: :exchange, declare: { type: :fanout }
|
13
|
+
|
14
|
+
# declare a dead letter queue and bind it to the exchange
|
15
|
+
b.destination :rabbit_dlq, "rabbit.dead.letter.queue", bindings: [
|
16
|
+
{ source: "rabbit.dead.letter.exchange" }
|
17
|
+
]
|
18
|
+
|
19
|
+
# declare a work queue that sends dead letters to our dead letter queue
|
20
|
+
b.destination :rabbit_work, "rabbit.work", arguments: { :"x-dead-letter-exchange" => "rabbit.dead.letter.exchange" }
|
21
|
+
end
|
22
|
+
"""
|
23
|
+
And I have no messages on :rabbit_work
|
24
|
+
And I have no messages on :rabbit_dlq
|
25
|
+
And I have a destination :rabbit_track with no messages on it
|
26
|
+
|
27
|
+
|
28
|
+
Scenario: Raising a DontRequeueError in an auto_ack consumer
|
29
|
+
Given I have a message consumer
|
30
|
+
"""ruby
|
31
|
+
MessageDriver::Broker.consumer(:manual_redeliver) do |message|
|
32
|
+
publish(:rabbit_track, "#{message.body} Attempt")
|
33
|
+
raise "oh nos!"
|
34
|
+
end
|
35
|
+
"""
|
36
|
+
And I create a subscription
|
37
|
+
"""ruby
|
38
|
+
MessageDriver::Client.subscribe(:rabbit_work, :manual_redeliver, ack: :auto, retry_redelivered: false)
|
39
|
+
"""
|
40
|
+
|
41
|
+
When I send the following messages to :rabbit_work
|
42
|
+
| body |
|
43
|
+
| Auto Retry 1 |
|
44
|
+
| Auto Retry 2 |
|
45
|
+
And I let the subscription process
|
46
|
+
|
47
|
+
Then I expect to find no messages on :rabbit_work
|
48
|
+
And I expect to find the following 2 messages on :rabbit_dlq
|
49
|
+
| body |
|
50
|
+
| Auto Retry 1 |
|
51
|
+
| Auto Retry 2 |
|
52
|
+
And I expect to find the following 4 messages on :rabbit_track
|
53
|
+
| body |
|
54
|
+
| Auto Retry 1 Attempt |
|
55
|
+
| Auto Retry 2 Attempt |
|
56
|
+
| Auto Retry 1 Attempt |
|
57
|
+
| Auto Retry 2 Attempt |
|
58
|
+
|
59
|
+
|
60
|
+
Scenario: Raising a DontRequeueError in a transactional consumer
|
61
|
+
Given I have a message consumer
|
62
|
+
"""ruby
|
63
|
+
@attempts = 0
|
64
|
+
MessageDriver::Broker.consumer(:transactional_redeliver) do |message|
|
65
|
+
publish(:rabbit_track, "#{message.body} Attempt")
|
66
|
+
@attempts += 1
|
67
|
+
raise "oh nos!"
|
68
|
+
end
|
69
|
+
"""
|
70
|
+
And I create a subscription
|
71
|
+
"""ruby
|
72
|
+
MessageDriver::Client.subscribe(:rabbit_work, :transactional_redeliver, ack: :transactional, retry_redelivered: false)
|
73
|
+
"""
|
74
|
+
|
75
|
+
When I send the following messages to :rabbit_work
|
76
|
+
| body |
|
77
|
+
| Transactional Redeliver 1 |
|
78
|
+
| Transactional Redeliver 2 |
|
79
|
+
And I let the subscription process
|
80
|
+
And I restart the subscription
|
81
|
+
And I let the subscription process
|
82
|
+
|
83
|
+
Then I expect to find no messages on :rabbit_track
|
84
|
+
Then I expect to find no messages on :rabbit_work
|
85
|
+
Then I expect the following check to pass
|
86
|
+
"""ruby
|
87
|
+
expect(@attempts).to eq(4)
|
88
|
+
"""
|
89
|
+
Then I expect to find the following 2 messages on :rabbit_dlq
|
90
|
+
| body |
|
91
|
+
| Transactional Redeliver 1 |
|
92
|
+
| Transactional Redeliver 2 |
|
@@ -0,0 +1,44 @@
|
|
1
|
+
@bunny
|
2
|
+
Feature: Controlling requeue on message nack
|
3
|
+
You can control whether or not a message is requeued when you nack the message.
|
4
|
+
Exact behavior when requeue is false is specific to your broker's setup.
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am connected to the broker
|
8
|
+
And I have a destination :source_queue
|
9
|
+
And I have the following messages on :source_queue
|
10
|
+
| body |
|
11
|
+
| Test Message |
|
12
|
+
|
13
|
+
Scenario: Requeue by default
|
14
|
+
When I execute the following code
|
15
|
+
"""ruby
|
16
|
+
message = MessageDriver::Client.pop_message(:source_queue, client_ack: true)
|
17
|
+
message.nack
|
18
|
+
"""
|
19
|
+
|
20
|
+
Then I expect to find the following message on :source_queue
|
21
|
+
| body |
|
22
|
+
| Test Message |
|
23
|
+
|
24
|
+
|
25
|
+
Scenario: Requeue is true
|
26
|
+
When I execute the following code
|
27
|
+
"""ruby
|
28
|
+
message = MessageDriver::Client.pop_message(:source_queue, client_ack: true)
|
29
|
+
message.nack(requeue: true)
|
30
|
+
"""
|
31
|
+
|
32
|
+
Then I expect to find the following message on :source_queue
|
33
|
+
| body |
|
34
|
+
| Test Message |
|
35
|
+
|
36
|
+
|
37
|
+
Scenario: Requeue is false
|
38
|
+
When I execute the following code
|
39
|
+
"""ruby
|
40
|
+
message = MessageDriver::Client.pop_message(:source_queue, client_ack: true)
|
41
|
+
message.nack(requeue: false)
|
42
|
+
"""
|
43
|
+
|
44
|
+
Then I expect to find no messages on :source_queue
|
@@ -9,7 +9,7 @@ Feature: Server-Named Destinations
|
|
9
9
|
Scenario: Creating a server-named queue
|
10
10
|
I expect my destination to have the queue name given to it by the server
|
11
11
|
|
12
|
-
When I execute the following code
|
12
|
+
When I execute the following code
|
13
13
|
"""ruby
|
14
14
|
destination = MessageDriver::Broker.dynamic_destination("", exclusive: true)
|
15
15
|
expect(destination.name).to_not be_empty
|
@@ -18,18 +18,18 @@ Feature: Server-Named Destinations
|
|
18
18
|
Then I expect to have no errors
|
19
19
|
|
20
20
|
Scenario: sending and receiving messages through a server-named queue
|
21
|
-
Given the following broker configuration
|
21
|
+
Given the following broker configuration
|
22
22
|
"""ruby
|
23
23
|
MessageDriver::Broker.define do |b|
|
24
|
-
b.destination :my_queue, "
|
24
|
+
b.destination :my_queue, "", exclusive: true
|
25
25
|
end
|
26
26
|
"""
|
27
27
|
|
28
|
-
When I execute the following code
|
28
|
+
When I execute the following code
|
29
29
|
"""ruby
|
30
30
|
publish(:my_queue, "server-named queue message")
|
31
31
|
"""
|
32
32
|
|
33
|
-
Then I expect to find
|
33
|
+
Then I expect to find the following message on :my_queue
|
34
34
|
| body |
|
35
35
|
| server-named queue message |
|