message-driver 0.2.2 → 0.3.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.
- checksums.yaml +4 -4
- data/.travis.yml +7 -17
- data/CHANGELOG.md +6 -1
- data/Guardfile +3 -3
- data/Rakefile +0 -2
- data/ci/reset_vhost +5 -0
- data/ci/travis_setup +10 -0
- data/features/.nav +5 -2
- data/features/CHANGELOG.md +6 -1
- data/features/amqp_specific_features/declaring_amqp_exchanges.feature +3 -3
- data/features/amqp_specific_features/nack_redelivered_messages.feature +2 -2
- data/features/amqp_specific_features/server_named_destinations.feature +3 -4
- data/features/connecting_to_multiple_brokers.feature +51 -0
- data/features/destination_metadata.feature +2 -2
- data/features/dynamic_destinations.feature +2 -2
- data/features/error_handling.feature +2 -4
- data/features/logging.feature +3 -2
- data/features/message_consumers/auto_ack_consumers.feature +4 -4
- data/features/{message_consumers.feature → message_consumers/basics.feature} +2 -2
- data/features/message_consumers/manual_ack_consumers.feature +5 -5
- data/features/message_consumers/prefetch_size.feature +4 -4
- data/features/message_consumers/transactional_ack_consumers.feature +7 -4
- data/features/rabbitmq_specific_features/dead_letter_queueing.feature +3 -3
- data/features/step_definitions/dynamic_destinations_steps.rb +2 -2
- data/features/step_definitions/logging_steps.rb +5 -1
- data/features/step_definitions/message_consumers_steps.rb +1 -1
- data/features/step_definitions/steps.rb +13 -4
- data/features/support/env.rb +1 -1
- data/features/support/test_runner.rb +6 -1
- data/lib/message_driver/adapters/base.rb +7 -1
- data/lib/message_driver/adapters/bunny_adapter.rb +22 -57
- data/lib/message_driver/adapters/in_memory_adapter.rb +3 -2
- data/lib/message_driver/adapters/stomp_adapter.rb +6 -6
- data/lib/message_driver/broker.rb +80 -19
- data/lib/message_driver/client.rb +50 -29
- data/lib/message_driver/destination.rb +2 -2
- data/lib/message_driver/errors.rb +2 -0
- data/lib/message_driver/logging.rb +7 -1
- data/lib/message_driver/message.rb +15 -4
- data/lib/message_driver/version.rb +1 -1
- data/lib/message_driver.rb +12 -5
- data/spec/integration/bunny/amqp_integration_spec.rb +15 -20
- data/spec/integration/bunny/bunny_adapter_spec.rb +13 -13
- data/spec/integration/in_memory/in_memory_adapter_spec.rb +2 -1
- data/spec/integration/stomp/stomp_adapter_spec.rb +6 -8
- data/spec/spec_helper.rb +9 -0
- data/spec/support/shared/adapter_examples.rb +6 -0
- data/spec/support/shared/context_examples.rb +2 -0
- data/spec/support/shared/destination_examples.rb +2 -0
- data/spec/units/message_driver/adapters/base_spec.rb +0 -8
- data/spec/units/message_driver/broker_spec.rb +240 -109
- data/spec/units/message_driver/client_spec.rb +69 -62
- data/spec/units/message_driver/message_spec.rb +59 -22
- data/test_lib/broker_config.rb +2 -1
- metadata +8 -7
- data/lib/bunny/session_patch.rb +0 -19
- data/spec/units/message_driver/logging_spec.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c03ff5c533ab9ffdb8a6a3fce6b2ffe0b7239d56
|
4
|
+
data.tar.gz: 44614cda7f594028f587e7dfd79f608c7b3fb0c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 335cc2f27f8b2a70ec0abb4523c1fee62abea0664fb80a4ea09e1936da6d66f6012087b05961bdcd6acbc3ff2a3dd396013b48021ca3f185fb1b0e2ffd56ccc2
|
7
|
+
data.tar.gz: 8ded01de5e953bf8486d2d139de8e677db11e138b6a6e221fbec35dcd12d905605c95403856f2c5da8ad922141a284b348f61093f874e17ce5177f661452e311
|
data/.travis.yml
CHANGED
@@ -1,33 +1,23 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
2
3
|
bundler_args: --without tools darwin
|
3
4
|
services:
|
4
5
|
- rabbitmq
|
5
6
|
before_script:
|
6
|
-
-
|
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.10.0
|
13
|
-
- ADAPTER=stomp
|
14
|
-
- ADAPTER=bunny:1.0.0
|
7
|
+
- ci/travis_setup
|
15
8
|
rvm:
|
16
9
|
- 2.1.0
|
17
10
|
- 2.0.0
|
18
11
|
- 1.9.3
|
19
|
-
- 1.9.2
|
20
12
|
- jruby-19mode
|
21
|
-
-
|
13
|
+
- 1.9.2
|
22
14
|
- rbx
|
15
|
+
env:
|
16
|
+
- ADAPTER=in_memory
|
17
|
+
- ADAPTER=stomp
|
18
|
+
- ADAPTER=bunny:1.1.3
|
23
19
|
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
|
29
20
|
allow_failures:
|
30
|
-
- rvm: jruby-head
|
31
21
|
- rvm: rbx
|
32
22
|
- rvm: jruby-19mode
|
33
23
|
env: ADAPTER=stomp
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## 0.3.0
|
3
|
+
## 0.3.0 - 2014-02-26
|
4
|
+
|
5
|
+
* Support for handling multiple broker connections
|
6
|
+
* require bunny 1.1.3 or later
|
7
|
+
* make bunny connections as lazily initialized as possible
|
8
|
+
* bunny transaction start lazily
|
4
9
|
|
5
10
|
## 0.2.2 - 2014-02-21
|
6
11
|
|
data/Guardfile
CHANGED
@@ -8,9 +8,9 @@ guard 'bundler' do
|
|
8
8
|
watch(/^.+\.gemspec/)
|
9
9
|
end
|
10
10
|
|
11
|
-
common_rspec_opts = {
|
12
|
-
unit_spec_opts = common_rspec_opts.merge({spec_paths: ["spec/units"], cmd: 'rspec -f doc', run_all: {cmd: 'rspec'}})
|
13
|
-
integration_spec_opts = common_rspec_opts.merge({spec_paths: ["spec/integration/#{BrokerConfig.current_adapter}"], cmd: 'rspec -f doc -t all_adapters', run_all: {cmd: 'rspec -t all_adapters'}})
|
11
|
+
common_rspec_opts = { all_after_pass: true }
|
12
|
+
unit_spec_opts = common_rspec_opts.merge({ spec_paths: ["spec/units"], cmd: 'bundle exec rspec -f doc', run_all: { cmd: 'bundle exec rspec' } })
|
13
|
+
integration_spec_opts = common_rspec_opts.merge({ spec_paths: ["spec/integration/#{BrokerConfig.current_adapter}"], cmd: 'bundle exec rspec -f doc -t all_adapters', run_all: { cmd: 'bundle exec rspec -t all_adapters' } })
|
14
14
|
|
15
15
|
group 'specs' do
|
16
16
|
guard 'rspec', unit_spec_opts do
|
data/Rakefile
CHANGED
data/ci/reset_vhost
ADDED
data/ci/travis_setup
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
sudo rabbitmqctl add_vhost message-driver-test
|
4
|
+
sudo rabbitmqctl set_permissions -p message-driver-test guest ".*" ".*" ".*"
|
5
|
+
|
6
|
+
if [ "$ADAPTER" = "stomp" ]; then
|
7
|
+
sudo rabbitmq-plugins enable rabbitmq_stomp
|
8
|
+
sudo service rabbitmq-server restart
|
9
|
+
sleep 3
|
10
|
+
fi
|
data/features/.nav
CHANGED
@@ -6,15 +6,18 @@
|
|
6
6
|
- destination_metadata.feature
|
7
7
|
- client_acks.feature
|
8
8
|
- logging.feature
|
9
|
-
- message_consumers
|
10
|
-
-
|
9
|
+
- message_consumers (Message Consumers)
|
10
|
+
- basics.feature
|
11
11
|
- auto_ack_consumers.feature
|
12
12
|
- manual_ack_consumers.feature
|
13
13
|
- transactional_ack_consumers.feature
|
14
|
+
- prefetch_size.feature
|
15
|
+
- subscribe_with_a_block.feature
|
14
16
|
- amqp_specific_features (AMQP-Specific Features):
|
15
17
|
- declaring_amqp_destinations.feature
|
16
18
|
- binding_amqp_destinations.feature
|
17
19
|
- server_named_desitnations.feature
|
18
20
|
- requeueing_on_nack.feature
|
21
|
+
- connecting_to_multiple_brokers.feature
|
19
22
|
- error_handling.feature
|
20
23
|
- Rails.md
|
data/features/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## 0.3.0
|
3
|
+
## 0.3.0 - 2014-02-26
|
4
|
+
|
5
|
+
* Support for handling multiple broker connections
|
6
|
+
* require bunny 1.1.3 or later
|
7
|
+
* make bunny connections as lazily initialized as possible
|
8
|
+
* bunny transaction start lazily
|
4
9
|
|
5
10
|
## 0.2.2 - 2014-02-21
|
6
11
|
|
@@ -11,12 +11,12 @@ Feature: Declaring AMQP exchanges
|
|
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 :
|
14
|
+
b.destination :exchange_bound_queue, "", exclusive: true, bindings: [{source: "my_exchange", routing_key: "exchange_bound_queue"}]
|
15
15
|
end
|
16
16
|
|
17
|
-
publish(:my_exchange, "Test My New Exchange", routing_key: "
|
17
|
+
publish(:my_exchange, "Test My New Exchange", routing_key: "exchange_bound_queue")
|
18
18
|
"""
|
19
19
|
|
20
|
-
Then I expect to find the following message on :
|
20
|
+
Then I expect to find the following message on :exchange_bound_queue
|
21
21
|
| body |
|
22
22
|
| Test My New Exchange |
|
@@ -28,7 +28,7 @@ Feature: Nacking Redelievered Messages from a consumer
|
|
28
28
|
Scenario: Raising an error in an auto_ack consumer
|
29
29
|
Given I have a message consumer
|
30
30
|
"""ruby
|
31
|
-
MessageDriver::
|
31
|
+
MessageDriver::Client.consumer(:manual_redeliver) do |message|
|
32
32
|
publish(:rabbit_track, "#{message.body} Attempt")
|
33
33
|
raise "oh nos!"
|
34
34
|
end
|
@@ -61,7 +61,7 @@ Feature: Nacking Redelievered Messages from a consumer
|
|
61
61
|
Given I have a message consumer
|
62
62
|
"""ruby
|
63
63
|
@attempts = 0
|
64
|
-
MessageDriver::
|
64
|
+
MessageDriver::Client.consumer(:transactional_redeliver) do |message|
|
65
65
|
publish(:rabbit_track, "#{message.body} Attempt")
|
66
66
|
@attempts += 1
|
67
67
|
raise "oh nos!"
|
@@ -3,15 +3,14 @@ Feature: Server-Named Destinations
|
|
3
3
|
AMQP brokers allow you to create queues that are named by the server. Here's
|
4
4
|
how you do it with message_driver.
|
5
5
|
|
6
|
-
Background:
|
7
|
-
Given I am connected to the broker
|
8
|
-
|
9
6
|
Scenario: Creating a server-named queue
|
10
7
|
I expect my destination to have the queue name given to it by the server
|
11
8
|
|
9
|
+
Given I am connected to the broker
|
10
|
+
|
12
11
|
When I execute the following code
|
13
12
|
"""ruby
|
14
|
-
destination = MessageDriver::
|
13
|
+
destination = MessageDriver::Client.dynamic_destination("", exclusive: true)
|
15
14
|
expect(destination.name).to_not be_empty
|
16
15
|
"""
|
17
16
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
Feature: Connecting to Multiple Brokers
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I am connected to a broker named :my_broker
|
5
|
+
|
6
|
+
@all_adapters
|
7
|
+
Scenario: Declaring Destinations and Publishing on a secondary broker
|
8
|
+
Given I configure my broker as follows
|
9
|
+
"""ruby
|
10
|
+
MessageDriver::Broker.define(:my_broker) do |b|
|
11
|
+
b.destination(:multi_broker_destination, "multi.broker.queue")
|
12
|
+
end
|
13
|
+
"""
|
14
|
+
And I have no messages on :multi_broker_destination
|
15
|
+
|
16
|
+
When I execute the following code
|
17
|
+
"""ruby
|
18
|
+
MessageDriver::Client[:my_broker].publish(:multi_broker_destination, "Test Message")
|
19
|
+
"""
|
20
|
+
|
21
|
+
Then I expect to find the following message on :multi_broker_destination
|
22
|
+
| body |
|
23
|
+
| Test Message |
|
24
|
+
|
25
|
+
@bunny
|
26
|
+
@in_memory
|
27
|
+
Scenario: Declaring Consumers and Subscriptions on a secondary broker
|
28
|
+
Given I have a destination :dest_queue with no messages on it
|
29
|
+
And I have a destination :source_queue with no messages on it
|
30
|
+
And I have a message consumer
|
31
|
+
"""ruby
|
32
|
+
MessageDriver::Client[:my_broker].consumer(:my_consumer) do |message|
|
33
|
+
MessageDriver::Client[:my_broker].publish(:dest_queue, message.body)
|
34
|
+
end
|
35
|
+
"""
|
36
|
+
And I create a subscription
|
37
|
+
"""ruby
|
38
|
+
MessageDriver::Client[:my_broker].subscribe(:source_queue, :my_consumer)
|
39
|
+
"""
|
40
|
+
|
41
|
+
When I send the following messages to :source_queue
|
42
|
+
| body |
|
43
|
+
| Test Message 1 |
|
44
|
+
| Test Message 2 |
|
45
|
+
And I let the subscription process
|
46
|
+
|
47
|
+
Then I expect to find no messages on :source_queue
|
48
|
+
And I expect to find the following 2 messages on :dest_queue
|
49
|
+
| body |
|
50
|
+
| Test Message 1 |
|
51
|
+
| Test Message 2 |
|
@@ -8,7 +8,7 @@ Feature: Destination Metadata
|
|
8
8
|
Scenario: Checking the message count when the queue is empty
|
9
9
|
When I execute the following code
|
10
10
|
"""ruby
|
11
|
-
destination = MessageDriver::
|
11
|
+
destination = MessageDriver::Client.find_destination(:my_queue)
|
12
12
|
expect(destination.message_count).to eq(0)
|
13
13
|
"""
|
14
14
|
|
@@ -23,7 +23,7 @@ Feature: Destination Metadata
|
|
23
23
|
And I allow for processing
|
24
24
|
And I execute the following code
|
25
25
|
"""ruby
|
26
|
-
destination = MessageDriver::
|
26
|
+
destination = MessageDriver::Client.find_destination(:my_queue)
|
27
27
|
expect(destination.message_count).to eq(2)
|
28
28
|
"""
|
29
29
|
|
@@ -10,7 +10,7 @@ Feature: Dynamic Destinations
|
|
10
10
|
Scenario: Sending to a dynamic destination
|
11
11
|
When I execute the following code
|
12
12
|
"""ruby
|
13
|
-
my_new_destination = MessageDriver::
|
13
|
+
my_new_destination = MessageDriver::Client.dynamic_destination("temp_queue")
|
14
14
|
my_new_destination.publish("Test Message")
|
15
15
|
"""
|
16
16
|
|
@@ -26,7 +26,7 @@ Feature: Dynamic Destinations
|
|
26
26
|
|
27
27
|
When I execute the following code
|
28
28
|
"""ruby
|
29
|
-
my_new_destination = MessageDriver::
|
29
|
+
my_new_destination = MessageDriver::Client.dynamic_destination("temp_queue")
|
30
30
|
|
31
31
|
msg1 = my_new_destination.pop_message
|
32
32
|
expect(msg1.body).to eq("Test Message 1")
|
@@ -1,13 +1,11 @@
|
|
1
1
|
Feature: Error Handling
|
2
2
|
|
3
|
-
Background:
|
4
|
-
Given I am connected to the broker
|
5
|
-
|
6
3
|
@bunny
|
7
4
|
Scenario: Queue isn't found on the broker
|
5
|
+
Given I am connected to the broker
|
8
6
|
When I execute the following code
|
9
7
|
"""ruby
|
10
|
-
MessageDriver::
|
8
|
+
MessageDriver::Client.dynamic_destination("missing_queue", passive: true)
|
11
9
|
"""
|
12
10
|
|
13
11
|
Then I expect it to raise a MessageDriver::QueueNotFound error
|
data/features/logging.feature
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
@all_adapters
|
2
2
|
Feature: Stuff gets logged if you set a logger
|
3
3
|
|
4
|
-
You can configure the logger by
|
5
|
-
If you don't provide a logger, then an info level logger will be created
|
4
|
+
You can configure the logger by setting it on `MessageDriver.logger`.
|
5
|
+
If you don't provide a logger, then an info level logger will be created
|
6
|
+
and sent to `STDOUT`.
|
6
7
|
|
7
8
|
Scenario: Starting the broker
|
8
9
|
Given I am logging to a log file at the debug level
|
@@ -1,5 +1,5 @@
|
|
1
1
|
@bunny
|
2
|
-
Feature: Message
|
2
|
+
Feature: Automatic Message Acknowledgement
|
3
3
|
This mode will ack the message if the consumer completes successfully.
|
4
4
|
It will nack the message if the consumer raises an error.
|
5
5
|
|
@@ -11,7 +11,7 @@ Feature: Message Consumers auto-acknowledgement
|
|
11
11
|
Scenario: Consuming Messages
|
12
12
|
Given I have a message consumer
|
13
13
|
"""ruby
|
14
|
-
MessageDriver::
|
14
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
15
15
|
MessageDriver::Client.publish(:dest_queue, message.body)
|
16
16
|
end
|
17
17
|
"""
|
@@ -36,7 +36,7 @@ Feature: Message Consumers auto-acknowledgement
|
|
36
36
|
Scenario: An error occurs during processing
|
37
37
|
Given I have a message consumer
|
38
38
|
"""ruby
|
39
|
-
MessageDriver::
|
39
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
40
40
|
raise "oh nos!"
|
41
41
|
end
|
42
42
|
"""
|
@@ -60,7 +60,7 @@ Feature: Message Consumers auto-acknowledgement
|
|
60
60
|
Scenario: A DontRequeue error occurs during processing
|
61
61
|
Given I have a message consumer
|
62
62
|
"""ruby
|
63
|
-
MessageDriver::
|
63
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
64
64
|
raise MessageDriver::DontRequeueError, "don't requeue me"
|
65
65
|
end
|
66
66
|
"""
|
@@ -1,13 +1,13 @@
|
|
1
1
|
@in_memory
|
2
2
|
@bunny
|
3
|
-
Feature: Message Consumers
|
3
|
+
Feature: Basics of Message Consumers
|
4
4
|
Background:
|
5
5
|
Given I am connected to the broker
|
6
6
|
And I have a destination :dest_queue with no messages on it
|
7
7
|
And I have a destination :source_queue with no messages on it
|
8
8
|
And I have a message consumer
|
9
9
|
"""ruby
|
10
|
-
MessageDriver::
|
10
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
11
11
|
MessageDriver::Client.publish(:dest_queue, message.body)
|
12
12
|
end
|
13
13
|
"""
|
@@ -1,5 +1,5 @@
|
|
1
1
|
@bunny
|
2
|
-
Feature: Message
|
2
|
+
Feature: Manual Message Acknowledgement
|
3
3
|
This mode requires the consumer to call ack on the message in order to acknowledge it
|
4
4
|
|
5
5
|
Background:
|
@@ -9,7 +9,7 @@ Feature: Message Consumers with manual acknowledgement
|
|
9
9
|
Scenario: Consuming Messages
|
10
10
|
Given I have a message consumer
|
11
11
|
"""ruby
|
12
|
-
MessageDriver::
|
12
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
13
13
|
message.ack
|
14
14
|
end
|
15
15
|
"""
|
@@ -29,7 +29,7 @@ Feature: Message Consumers with manual acknowledgement
|
|
29
29
|
Scenario: When a message is nack'ed
|
30
30
|
Given I have a message consumer
|
31
31
|
"""ruby
|
32
|
-
MessageDriver::
|
32
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
33
33
|
message.nack(requeue: true)
|
34
34
|
end
|
35
35
|
"""
|
@@ -52,7 +52,7 @@ Feature: Message Consumers with manual acknowledgement
|
|
52
52
|
Scenario: When an occurs before the message is ack'ed
|
53
53
|
Given I have a message consumer
|
54
54
|
"""ruby
|
55
|
-
MessageDriver::
|
55
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
56
56
|
raise "oh nos!"
|
57
57
|
message.ack
|
58
58
|
end
|
@@ -76,7 +76,7 @@ Feature: Message Consumers with manual acknowledgement
|
|
76
76
|
Scenario: When an error occurs after the message is ack'ed
|
77
77
|
Given I have a message consumer
|
78
78
|
"""ruby
|
79
|
-
MessageDriver::
|
79
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
80
80
|
message.ack
|
81
81
|
raise "oh nos!"
|
82
82
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
@bunny
|
2
2
|
@wip
|
3
|
-
Feature:
|
4
|
-
You can set the prefetch size for your message consumers
|
3
|
+
Feature: Controlling Prefetch Size
|
4
|
+
You can set the prefetch size for your message consumers.
|
5
5
|
|
6
6
|
Background:
|
7
7
|
Given I am connected to the broker
|
@@ -12,13 +12,13 @@ Feature: Message Consumers prefetch size
|
|
12
12
|
Scenario: Consuming Messages
|
13
13
|
Given I have a message consumer
|
14
14
|
"""ruby
|
15
|
-
MessageDriver::
|
15
|
+
MessageDriver::Client.consumer(:my_consumer_1) do |message|
|
16
16
|
MessageDriver::Client.publish(:dest_queue_1, message.body)
|
17
17
|
end
|
18
18
|
"""
|
19
19
|
And I have a message consumer
|
20
20
|
"""ruby
|
21
|
-
MessageDriver::
|
21
|
+
MessageDriver::Client.consumer(:my_consumer_2) do |message|
|
22
22
|
MessageDriver::Client.publish(:dest_queue_2, message.body)
|
23
23
|
end
|
24
24
|
"""
|
@@ -1,5 +1,8 @@
|
|
1
1
|
@bunny
|
2
|
-
Feature: Transactional
|
2
|
+
Feature: Transactional Consumers
|
3
|
+
These consumers will wrap the acknowledgement of the consumed message
|
4
|
+
as well as any publishes in a native broker transaction.
|
5
|
+
|
3
6
|
Background:
|
4
7
|
Given I am connected to the broker
|
5
8
|
And I have a destination :dest_queue with no messages on it
|
@@ -8,7 +11,7 @@ Feature: Transactional Message Consumers
|
|
8
11
|
Scenario: Consuming Messages within a transaction
|
9
12
|
Given I have a message consumer
|
10
13
|
"""ruby
|
11
|
-
MessageDriver::
|
14
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
12
15
|
MessageDriver::Client.publish(:dest_queue, message.body)
|
13
16
|
end
|
14
17
|
"""
|
@@ -32,7 +35,7 @@ Feature: Transactional Message Consumers
|
|
32
35
|
Scenario: When an error occurs
|
33
36
|
Given I have a message consumer
|
34
37
|
"""ruby
|
35
|
-
MessageDriver::
|
38
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
36
39
|
MessageDriver::Client.publish(:dest_queue, message.body)
|
37
40
|
raise "oh nos!"
|
38
41
|
end
|
@@ -57,7 +60,7 @@ Feature: Transactional Message Consumers
|
|
57
60
|
Scenario: When a DontRequeue error occurs
|
58
61
|
Given I have a message consumer
|
59
62
|
"""ruby
|
60
|
-
MessageDriver::
|
63
|
+
MessageDriver::Client.consumer(:my_consumer) do |message|
|
61
64
|
MessageDriver::Client.publish(:dest_queue, message.body)
|
62
65
|
raise MessageDriver::DontRequeueError, "don't requeue me"
|
63
66
|
end
|
@@ -43,7 +43,7 @@ Feature: DLQ-ing messages with nacks and consumers
|
|
43
43
|
Scenario: Nacking a message on a manual_ack consumer
|
44
44
|
Given I have a message consumer
|
45
45
|
"""ruby
|
46
|
-
MessageDriver::
|
46
|
+
MessageDriver::Client.consumer(:manual_dql) do |message|
|
47
47
|
message.nack(requeue: false)
|
48
48
|
end
|
49
49
|
"""
|
@@ -68,7 +68,7 @@ Feature: DLQ-ing messages with nacks and consumers
|
|
68
68
|
Scenario: Raising a DontRequeueError in an auto_ack consumer
|
69
69
|
Given I have a message consumer
|
70
70
|
"""ruby
|
71
|
-
MessageDriver::
|
71
|
+
MessageDriver::Client.consumer(:manual_dql) do |message|
|
72
72
|
raise MessageDriver::DontRequeueError
|
73
73
|
end
|
74
74
|
"""
|
@@ -93,7 +93,7 @@ Feature: DLQ-ing messages with nacks and consumers
|
|
93
93
|
Scenario: Raising a DontRequeueError in a transactional consumer
|
94
94
|
Given I have a message consumer
|
95
95
|
"""ruby
|
96
|
-
MessageDriver::
|
96
|
+
MessageDriver::Client.consumer(:transactional_dql) do |message|
|
97
97
|
publish(:rabbit_work, "I get rolled back")
|
98
98
|
raise MessageDriver::DontRequeueError
|
99
99
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Given(/^I have a dynamic destination "(#{STRING_OR_SYM})" with the following messages on it$/) do |destination, table|
|
2
|
-
dest = MessageDriver::
|
2
|
+
dest = MessageDriver::Client[test_runner.broker_name].dynamic_destination(destination)
|
3
3
|
test_runner.publish_table_to_destination(dest, table)
|
4
4
|
end
|
5
5
|
|
6
6
|
Then(/^I expect to find (#{NUMBER}) messages? on the dynamic destination "(#{STRING_OR_SYM})" with$/) do |count, destination, table|
|
7
7
|
expect(test_runner).to have_no_errors
|
8
|
-
dest = MessageDriver::
|
8
|
+
dest = MessageDriver::Client[test_runner.broker_name].dynamic_destination(destination, passive: true)
|
9
9
|
messages = test_runner.fetch_messages(dest)
|
10
10
|
expect(messages).to have(count).items
|
11
11
|
expect(messages).to match_message_table(table)
|
@@ -8,7 +8,7 @@ Given(/^I am logging to a log file(?: at the (#{STRING_OR_SYM}) level)?$/) do |l
|
|
8
8
|
@logger = Logger.new(LOG_FILE_NAME)
|
9
9
|
end
|
10
10
|
step "I set the log level to #{level || "info"}"
|
11
|
-
|
11
|
+
@orig_logger, MessageDriver.logger = MessageDriver.logger, @logger
|
12
12
|
end
|
13
13
|
|
14
14
|
Given(/^I set the log level to (#{STRING_OR_SYM})$/) do |level|
|
@@ -25,4 +25,8 @@ After do
|
|
25
25
|
@logger.close
|
26
26
|
@logger = nil
|
27
27
|
end
|
28
|
+
if @orig_logger
|
29
|
+
MessageDriver.logger = @orig_logger
|
30
|
+
@orig_logger = nil
|
31
|
+
end
|
28
32
|
end
|
@@ -4,7 +4,7 @@ Given "I have a message consumer" do |src|
|
|
4
4
|
end
|
5
5
|
|
6
6
|
Given(/^I subscribe to (#{STRING_OR_SYM}) with (#{STRING_OR_SYM})$/) do |destination, consumer|
|
7
|
-
MessageDriver::Client.subscribe(destination, consumer)
|
7
|
+
MessageDriver::Client[test_runner.broker_name].subscribe(destination, consumer)
|
8
8
|
end
|
9
9
|
|
10
10
|
Given "I create a subscription" do |src|
|
@@ -1,5 +1,10 @@
|
|
1
1
|
Given "I am connected to the broker" do
|
2
|
-
MessageDriver.configure(broker_config)
|
2
|
+
MessageDriver::Broker.configure(test_runner.broker_name, broker_config)
|
3
|
+
end
|
4
|
+
|
5
|
+
Given(/^I am connected to a broker named (#{STRING_OR_SYM})$/) do |broker_name|
|
6
|
+
test_runner.broker_name = broker_name
|
7
|
+
step "I am connected to the broker"
|
3
8
|
end
|
4
9
|
|
5
10
|
Given "the following broker configuration" do |src|
|
@@ -7,8 +12,12 @@ Given "the following broker configuration" do |src|
|
|
7
12
|
test_runner.run_config_code(src)
|
8
13
|
end
|
9
14
|
|
15
|
+
Given "I configure my broker as follows" do |src|
|
16
|
+
test_runner.run_config_code(src)
|
17
|
+
end
|
18
|
+
|
10
19
|
Given(/^I have a destination (#{STRING_OR_SYM})$/) do |destination|
|
11
|
-
MessageDriver::Broker.define do |b|
|
20
|
+
MessageDriver::Broker.define(test_runner.broker_name) do |b|
|
12
21
|
b.destination(destination, destination.to_s)
|
13
22
|
end
|
14
23
|
end
|
@@ -31,7 +40,7 @@ end
|
|
31
40
|
|
32
41
|
When(/^I send the following messages? to (#{STRING_OR_SYM})$/) do |destination, table|
|
33
42
|
table.hashes.each do |msg|
|
34
|
-
MessageDriver::Client.publish(destination, msg[:body])
|
43
|
+
MessageDriver::Client[test_runner.broker_name].publish(destination, msg[:body])
|
35
44
|
end
|
36
45
|
end
|
37
46
|
|
@@ -40,7 +49,7 @@ When "I execute the following code" do |src|
|
|
40
49
|
end
|
41
50
|
|
42
51
|
When "I reset the context" do
|
43
|
-
MessageDriver::Client.current_adapter_context.invalidate
|
52
|
+
MessageDriver::Client[test_runner.broker_name].current_adapter_context.invalidate
|
44
53
|
end
|
45
54
|
|
46
55
|
When "I allow for processing" do
|
data/features/support/env.rb
CHANGED
@@ -4,6 +4,11 @@ class TestRunner
|
|
4
4
|
|
5
5
|
attr_accessor :raised_error
|
6
6
|
attr_accessor :current_feature_file
|
7
|
+
attr_accessor :broker_name
|
8
|
+
|
9
|
+
def broker_name
|
10
|
+
@broker_name ||= MessageDriver::Broker::DEFAULT_BROKER_NAME
|
11
|
+
end
|
7
12
|
|
8
13
|
def run_config_code(src)
|
9
14
|
instance_eval(src, current_feature_file)
|
@@ -40,7 +45,7 @@ class TestRunner
|
|
40
45
|
def fetch_destination(destination)
|
41
46
|
case destination
|
42
47
|
when String, Symbol
|
43
|
-
MessageDriver::
|
48
|
+
MessageDriver::Client[self.broker_name].find_destination(destination)
|
44
49
|
when MessageDriver::Destination::Base
|
45
50
|
destination
|
46
51
|
else
|
@@ -3,11 +3,13 @@ module MessageDriver
|
|
3
3
|
class Base
|
4
4
|
include Logging
|
5
5
|
|
6
|
+
attr_reader :broker
|
7
|
+
|
6
8
|
def contexts
|
7
9
|
@contexts ||= []
|
8
10
|
end
|
9
11
|
|
10
|
-
def initialize(configuration)
|
12
|
+
def initialize(broker, configuration)
|
11
13
|
raise "Must be implemented in subclass"
|
12
14
|
end
|
13
15
|
|
@@ -21,6 +23,10 @@ module MessageDriver
|
|
21
23
|
raise "Must be implemented in subclass"
|
22
24
|
end
|
23
25
|
|
26
|
+
def reset_after_tests
|
27
|
+
#does nothing, can be overridden by adapters that want to support testing scenarios
|
28
|
+
end
|
29
|
+
|
24
30
|
def stop
|
25
31
|
if @contexts
|
26
32
|
ctxs = @contexts
|