pwwka 0.21.2 → 0.21.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 913ec15d6763b56d762da0c368fa6caba28cc208a18f8aaba9349363e29097ef
4
- data.tar.gz: 469f8b149b50c84ced5373ef6fe8cf8533593ecb9f9a0f78eee278b49bccbbd1
3
+ metadata.gz: 5a449a47ab0a38c86349112177ed30351d69b151fa47289545eab2f976969342
4
+ data.tar.gz: 7f1a1b34abaad80936b8ec1018233310c6e6746b5262731e291002937c0b47b7
5
5
  SHA512:
6
- metadata.gz: 3d5ac493402d2afd1857ee86faa80b4043d91a4d7dc2837beb3fb9a8ff5cb729af4b9d00f2e7d763f9513856d2f3f518cde6c08710c2f9221240136d0ac31255
7
- data.tar.gz: 41a48b20fa6a9fbc47383cd3d993372f8b0ad3a2fa4ddd0e85c6948dd07c469bfe2090b83aa62f7bc58a3067db443d90caa9b2f6f4ed7d98314bb7520d1ca99b
6
+ metadata.gz: 38d0afcaf9e40c7a97a466f8188854b25f3426ba63ae64d622ba18b4035427ad02a875abf53b64ef4df0ee10f35b7c1b73ccd44263a2bdb8ce0b8f2291acf766
7
+ data.tar.gz: eead705f93110e06656a747f6c894aac8236fcff670286e5685bbc6853ae49896d1f39db9548d46ee4f8f4c70c1f47f315734f6e4f3057dde896b1f2d8ebdd41
data/README.md CHANGED
@@ -129,7 +129,13 @@ Pwwka::Transmitter.send_message!(
129
129
 
130
130
  * `:raise` - Log the error and raise the exception received from Bunny. (default strategy)
131
131
  * `:ignore` - Log the error and return false.
132
- * `:resque` - Log the error and return false. Also, enqueue a job with Resque to send the message. See `send_message_async` below. **Note, this doesn't guarantee the message will actually be sent—it just guarantees an attempt is made to queue a Resque job [which could fail]**
132
+ * `:retry_async` - Log the error and return false. Also, enqueue a job with the configured background job processor (`:resque` or `:sidekiq`). **Note, this doesn't guarantee the message will actually be sent— it just guarantees an attempt is made to queue a background job [which could fail]**. The background job processor will default to Resque, but can be configured to Sidekiq:
133
+
134
+ ```
135
+ Pwwka.configure do |config|
136
+ config.background_job_processor = :sidekiq
137
+ end
138
+ ```
133
139
 
134
140
  Example usage:
135
141
 
@@ -157,28 +163,32 @@ Pwwka::Transmitter.send_message!(payload, routing_key, delayed: true, delay_by:
157
163
  These extra arguments work for all message sending methods - the safe ones, the handling, and the `message_queuer` methods (see below).
158
164
 
159
165
 
160
- #### Sending message Async with Resque
161
-
162
- To enqueue a message in a background Resque job, use `Transmitter.send_message_async`
166
+ #### Sending message asynchronously
167
+ To enqueue a message in a background job, use `Pwwka::Transmitter.send_message_async`:
163
168
  ```ruby
164
169
  Pwwka::Transmitter.send_message_async(payload, routing_key, delay_by_ms: 5000) # default delay is 0
165
170
  ```
166
171
 
167
- If `Resque::Plugins::ExponentialBackoff` is available, the job will use it. (Important: Your load/require order is important if you want exponential backoff with the built-in job due to [its error handling](https://github.com/stitchfix/pwwka/blob/713c6003fa6cf52cb4713c02b39fe7ee07ebe2e9/lib/pwwka/send_message_async_job.rb#L8).)
168
- Customize the backoff intervals using the configuration `send_message_resque_backoff_strategy`.
169
- The default backoff will retry quickly in case of an intermittent glitch, and then every ten
170
- minutes for half an hour.
171
-
172
- The name of the queue created is `pwwka_send_message_async`.
172
+ The job will be enqueued using the configured background job processor. This will default to Resque, but can be configured to use Sidekiq:
173
+ ```
174
+ Pwwka.configure do |config|
175
+ config.background_job_processor = :sidekiq
176
+ end
177
+ ```
173
178
 
174
- You can configure Pwwka to use your own custom job using the `async_job_klass` configuration option. Example might be:
179
+ Regardless of which processor you use, the name of the queue created is `pwwka_send_message_async`.
175
180
 
181
+ You can also configure Pwwka to use your own custom job using the `async_job_klass` configuration option. An example might be:
176
182
  ```
177
183
  Pwwka.configure do |config|
178
184
  config.async_job_klass = YourApp::PwwkaAsyncJob
179
185
  end
180
186
  ```
181
187
 
188
+ If you are using Resque and `Resque::Plugins::ExponentialBackoff` is available, the job will use it. (Important: Your load/require order is important if you want exponential backoff with the built-in job due to [its error handling](https://github.com/stitchfix/pwwka/blob/713c6003fa6cf52cb4713c02b39fe7ee07ebe2e9/lib/pwwka/send_message_async_job.rb#L8)). Customize the backoff intervals using the configuration `send_message_resque_backoff_strategy`. The default backoff will retry quickly in case of an intermittent glitch, and then every ten minutes for half an hour
189
+
190
+
191
+
182
192
  #### Message Queuer
183
193
 
184
194
  You can queue up messages and send them in a batch. This is most useful when multiple messages
data/lib/pwwka.rb CHANGED
@@ -31,4 +31,7 @@ require 'pwwka/message_queuer'
31
31
  require 'pwwka/error_handlers'
32
32
  require 'pwwka/configuration'
33
33
  require 'pwwka/send_message_async_job'
34
-
34
+ begin # optional dependency
35
+ require 'pwwka/send_message_async_sidekiq_job'
36
+ rescue LoadError
37
+ end
@@ -14,16 +14,27 @@ module Pwwka
14
14
  @configuration = Pwwka.configuration
15
15
  connection_options = {automatically_recover: false}.merge(configuration.options)
16
16
  connection_options = {client_properties: {connection_name: connection_name}}.merge(connection_options) if connection_name
17
- @connection = Bunny.new(configuration.rabbit_mq_host, connection_options)
18
- @connection.start
19
- @channel = @connection.create_channel
17
+
18
+ begin
19
+ @connection = Bunny.new(configuration.rabbit_mq_host, connection_options)
20
+ @connection.start
21
+ rescue => e
22
+ logf "ERROR Connecting to RabbitMQ", error: e
23
+ @connection.close if @connection
24
+ raise e
25
+ end
26
+
27
+ begin
28
+ @channel = @connection.create_channel
29
+ rescue => e
30
+ logf "ERROR Opening RabbitMQ channel", error: e
31
+ @connection.close if @connection
32
+ raise e
33
+ end
34
+
20
35
  if prefetch
21
36
  @channel.prefetch(prefetch.to_i)
22
37
  end
23
- rescue => e
24
- logf "ERROR Connecting to RabbitMQ", error: e
25
- @connection.close if @connection
26
- raise e
27
38
  end
28
39
 
29
40
  def topic_exchange
@@ -67,9 +78,18 @@ module Pwwka
67
78
  end
68
79
 
69
80
  def connection_close
70
- channel.close
71
- connection.close
72
- end
81
+ begin
82
+ channel.close
83
+ rescue => e
84
+ logf "ERROR Closing RabbitMQ channel", error: e
85
+ end
73
86
 
87
+ begin
88
+ connection.close
89
+ rescue => e
90
+ logf "ERROR Closing connection to RabbitMQ", error: e
91
+ raise e
92
+ end
93
+ end
74
94
  end
75
95
  end
@@ -1,5 +1,6 @@
1
1
  require 'bunny'
2
2
  require 'mono_logger'
3
+
3
4
  module Pwwka
4
5
  class ConfigurationError < StandardError; end
5
6
  class Configuration
@@ -10,12 +11,13 @@ module Pwwka
10
11
  attr_accessor :logger
11
12
  attr_accessor :log_level
12
13
  attr_accessor :options
13
- attr_accessor :async_job_klass
14
+ attr_accessor :background_job_processor
14
15
  attr_accessor :send_message_resque_backoff_strategy
15
16
  attr_accessor :default_prefetch
16
17
  attr_accessor :process_name
17
18
  attr_reader :requeue_on_error
18
19
  attr_writer :app_id
20
+ attr_writer :async_job_klass
19
21
  attr_writer :error_handling_chain
20
22
 
21
23
  def initialize
@@ -30,7 +32,7 @@ module Pwwka
30
32
  600, 600, 600] # longer-term outage?
31
33
  @requeue_on_error = false
32
34
  @keep_alive_on_handler_klass_exceptions = false
33
- @async_job_klass = Pwwka::SendMessageAsyncJob
35
+ @background_job_processor = :resque
34
36
  @default_prefetch = nil
35
37
  @receive_raw_payload = false
36
38
  @process_name = ""
@@ -56,6 +58,10 @@ module Pwwka
56
58
  end
57
59
  end
58
60
 
61
+ def async_job_klass
62
+ @async_job_klass || background_jobs[background_job_processor]
63
+ end
64
+
59
65
  def payload_logging
60
66
  @payload_logging || :info
61
67
  end
@@ -139,5 +145,14 @@ module Pwwka
139
145
  return true if @receive_raw_payload
140
146
  Pwwka::Logging::LEVELS[Pwwka.configuration.payload_logging.to_sym] > Pwwka::Logging::LEVELS[level_of_message_with_payload.to_sym]
141
147
  end
148
+
149
+ private
150
+
151
+ def background_jobs
152
+ {
153
+ resque: Pwwka::SendMessageAsyncJob,
154
+ sidekiq: Pwwka::SendMessageAsyncSidekiqJob,
155
+ }
156
+ end
142
157
  end
143
158
  end
@@ -0,0 +1,29 @@
1
+ require 'sidekiq'
2
+
3
+ module Pwwka
4
+ class SendMessageAsyncSidekiqJob
5
+ include Sidekiq::Worker
6
+ extend Pwwka::Logging
7
+
8
+ sidekiq_options queue: 'pwwka_send_message_async', retry: 3
9
+
10
+ def perform(payload, routing_key, options = {})
11
+ type = options["type"]
12
+ message_id = options["message_id"] || "auto_generate"
13
+ headers = options["headers"]
14
+
15
+ logger.info("Sending message async #{routing_key}, #{payload}")
16
+
17
+ message_id = message_id.to_sym if message_id == "auto_generate"
18
+
19
+ Pwwka::Transmitter.send_message!(
20
+ payload,
21
+ routing_key,
22
+ type: type,
23
+ message_id: message_id,
24
+ headers: headers,
25
+ on_error: :raise,
26
+ )
27
+ end
28
+ end
29
+ end
@@ -3,6 +3,7 @@ require_relative "publish_options"
3
3
  begin # optional dependency
4
4
  require 'resque'
5
5
  require 'resque-retry'
6
+ require 'sidekiq'
6
7
  rescue LoadError
7
8
  end
8
9
 
@@ -43,6 +44,7 @@ module Pwwka
43
44
  # - :ignore (aka as send_message_safely)
44
45
  # - :raise
45
46
  # - :resque -- use Resque to try to send the message later
47
+ # - :retry_async -- use the configured background job processor to retry sending the message later
46
48
  #
47
49
  # Returns true
48
50
  #
@@ -70,31 +72,39 @@ module Pwwka
70
72
  when :raise
71
73
  raise e
72
74
 
73
- when :resque
75
+ when :resque, :retry_async
74
76
  begin
75
77
  send_message_async(payload, routing_key, delay_by_ms: delayed ? delay_by || DEFAULT_DELAY_BY_MS : 0)
76
- rescue => resque_exception
77
- warn(resque_exception.message)
78
+ rescue => exception
79
+ warn(exception.message)
78
80
  raise e
79
81
  end
82
+
80
83
  else # ignore
81
84
  end
82
85
  false
83
86
  end
84
87
 
85
- # Use Resque to enqueue the message.
88
+ # Enqueue the message with the configured background processor.
86
89
  # - :delay_by_ms:: Integer milliseconds to delay the message. Default is 0.
87
90
  def self.send_message_async(payload, routing_key,
88
91
  delay_by_ms: 0,
89
92
  type: nil,
90
93
  message_id: :auto_generate,
91
94
  headers: nil)
95
+ background_job_processor = Pwwka.configuration.background_job_processor
92
96
  job = Pwwka.configuration.async_job_klass
93
- # Be perhaps too carefully making sure we queue jobs in the legacy way
94
- if type == nil && message_id == :auto_generate && headers == nil
95
- Resque.enqueue_in(delay_by_ms/1000, job, payload, routing_key)
96
- else
97
- Resque.enqueue_in(delay_by_ms/1000, job, payload, routing_key, type: type, message_id: message_id, headers: headers)
97
+
98
+ if background_job_processor == :resque
99
+ # Be perhaps too carefully making sure we queue jobs in the legacy way
100
+ if type == nil && message_id == :auto_generate && headers == nil
101
+ Resque.enqueue_in(delay_by_ms/1000, job, payload, routing_key)
102
+ else
103
+ Resque.enqueue_in(delay_by_ms/1000, job, payload, routing_key, type: type, message_id: message_id, headers: headers)
104
+ end
105
+ elsif background_job_processor == :sidekiq
106
+ options = { delay_by_ms: delay_by_ms, type: type, message_id: message_id, headers: headers }
107
+ job.perform_async(payload, routing_key, options)
98
108
  end
99
109
  end
100
110
 
data/lib/pwwka/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Pwwka
2
- VERSION = '0.21.2'
2
+ VERSION = '0.21.3'
3
3
  end
4
4
 
data/pwwka.gemspec CHANGED
@@ -27,8 +27,10 @@ Gem::Specification.new do |s|
27
27
  s.add_development_dependency("rspec")
28
28
  s.add_development_dependency("resque")
29
29
  s.add_development_dependency("resque-retry")
30
+ s.add_development_dependency("sidekiq")
30
31
  s.add_development_dependency("simplecov")
31
32
  s.add_development_dependency("resqutils")
32
33
  s.add_development_dependency("rainbow")
33
- s.add_development_dependency('rspec_junit_formatter')
34
+ s.add_development_dependency("rspec_junit_formatter")
35
+ s.add_development_dependency("pry-byebug")
34
36
  end
data/spec/spec_helper.rb CHANGED
@@ -3,6 +3,7 @@ GEM_ROOT = File.expand_path(File.join(File.dirname(__FILE__),'..'))
3
3
  ENV['RAILS_ENV'] ||= 'test'
4
4
 
5
5
  require 'simplecov'
6
+ require 'pry-byebug'
6
7
 
7
8
  SimpleCov.start do
8
9
  add_filter "/spec/"
@@ -16,6 +17,7 @@ require 'active_support/core_ext/hash'
16
17
  # an error if missing. Requiring here so their absence will fail the tests
17
18
  require 'resque'
18
19
  require 'resque-retry'
20
+ require 'sidekiq'
19
21
 
20
22
  require 'support/test_configuration'
21
23
 
@@ -155,4 +155,32 @@ describe Pwwka::Configuration do
155
155
  end
156
156
  end
157
157
 
158
+ describe "#background_job_processor" do
159
+ it "is :resque by default" do
160
+ expect(configuration.background_job_processor).to eq(:resque)
161
+ end
162
+
163
+ it "can be overridden" do
164
+ configuration.background_job_processor = :sidekiq
165
+ expect(configuration.background_job_processor).to eq(:sidekiq)
166
+ end
167
+ end
168
+
169
+ describe "#async_job_klass" do
170
+ it "is SendMessageAsyncJob by default" do
171
+ expect(configuration.async_job_klass).to eq(Pwwka::SendMessageAsyncJob)
172
+ end
173
+
174
+ it "is SendMessageAsyncSidekiqJob when background_job_processor=:sidekiq" do
175
+ configuration.background_job_processor = :sidekiq
176
+ expect(configuration.async_job_klass).to eq(Pwwka::SendMessageAsyncSidekiqJob)
177
+ end
178
+
179
+ it "can be configured to a custom class" do
180
+ class CustomBackgroundJob
181
+ end
182
+ configuration.async_job_klass = CustomBackgroundJob
183
+ expect(configuration.async_job_klass).to eq(CustomBackgroundJob)
184
+ end
185
+ end
158
186
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Pwwka::SendMessageAsyncSidekiqJob do
4
+ describe "#perform" do
5
+ before do
6
+ allow(Pwwka::Transmitter).to receive(:send_message!)
7
+ end
8
+
9
+ context "with just two arguments" do
10
+ it "calls through to Pwwka::Transmitter, setting error handling to 'raise'" do
11
+ described_class.new.perform({ "foo" => "bar"} , "some.routing.key")
12
+ expect(Pwwka::Transmitter).to have_received(:send_message!).with(
13
+ { "foo" => "bar" },
14
+ "some.routing.key",
15
+ type: nil,
16
+ message_id: :auto_generate,
17
+ headers: nil,
18
+ on_error: :raise
19
+ )
20
+ end
21
+ end
22
+
23
+ context "with optional values" do
24
+ it "passes them through to Pwwka::Transmitter" do
25
+ described_class.new.perform(
26
+ { "foo" => "bar"},
27
+ "some.routing.key",
28
+ "type" => "Customer",
29
+ "message_id" => "foobar",
30
+ "headers" => { "x" => "y" }
31
+ )
32
+ expect(Pwwka::Transmitter).to have_received(:send_message!).with(
33
+ { "foo" => "bar" },
34
+ "some.routing.key",
35
+ type: "Customer",
36
+ message_id: "foobar",
37
+ headers: { "x" => "y" },
38
+ on_error: :raise
39
+ )
40
+ end
41
+ end
42
+ end
43
+ end
@@ -33,41 +33,91 @@ describe Pwwka::Transmitter do
33
33
  subject(:transmitter) { described_class.new }
34
34
 
35
35
  describe ".send_message_async" do
36
- before do
37
- allow(Resque).to receive(:enqueue_in)
38
- end
39
- context "with only basic required arguments" do
40
- it "queues a Resque job with no extra args" do
41
- delay_by_ms = 3_000
42
- described_class.send_message_async(payload,routing_key,delay_by_ms: delay_by_ms)
43
- expect(Resque).to have_received(:enqueue_in).with(delay_by_ms/1_000,Pwwka::SendMessageAsyncJob,payload,routing_key)
36
+ context "when configured background_job_processor is Resque" do
37
+ before do
38
+ allow(Resque).to receive(:enqueue_in)
39
+ end
40
+ context "with only basic required arguments" do
41
+ it "queues a Resque job with no extra args" do
42
+ delay_by_ms = 3_000
43
+ described_class.send_message_async(payload,routing_key,delay_by_ms: delay_by_ms)
44
+ expect(Resque).to have_received(:enqueue_in).with(delay_by_ms/1_000,Pwwka::SendMessageAsyncJob,payload,routing_key)
45
+ end
46
+ end
47
+ context "with everything overridden" do
48
+ it "queues a Resque job with the various arguments" do
49
+ delay_by_ms = 3_000
50
+ described_class.send_message_async(
51
+ payload,routing_key,
52
+ delay_by_ms: delay_by_ms,
53
+ message_id: "snowflake id that is likely a bad idea, but if you must",
54
+ type: "Customer",
55
+ headers: {
56
+ "custom" => "value",
57
+ "other_custom" => "other_value",
58
+ }
59
+ )
60
+ expect(Resque).to have_received(:enqueue_in).with(
61
+ delay_by_ms/1_000,
62
+ Pwwka::SendMessageAsyncJob,
63
+ payload,
64
+ routing_key,
65
+ message_id: "snowflake id that is likely a bad idea, but if you must",
66
+ type: "Customer",
67
+ headers: {
68
+ "custom" => "value",
69
+ "other_custom" => "other_value",
70
+ }
71
+ )
72
+ end
44
73
  end
45
74
  end
46
- context "with everything overridden" do
47
- it "queues a Resque job with the various arguments" do
48
- delay_by_ms = 3_000
49
- described_class.send_message_async(
50
- payload,routing_key,
51
- delay_by_ms: delay_by_ms,
52
- message_id: "snowflake id that is likely a bad idea, but if you must",
53
- type: "Customer",
54
- headers: {
55
- "custom" => "value",
56
- "other_custom" => "other_value",
57
- }
58
- )
59
- expect(Resque).to have_received(:enqueue_in).with(
60
- delay_by_ms/1_000,
61
- Pwwka::SendMessageAsyncJob,
62
- payload,
63
- routing_key,
64
- message_id: "snowflake id that is likely a bad idea, but if you must",
65
- type: "Customer",
66
- headers: {
67
- "custom" => "value",
68
- "other_custom" => "other_value",
69
- }
70
- )
75
+
76
+ context "when the configured background_job_processor is Sidekiq" do
77
+ before do
78
+ allow(Pwwka::SendMessageAsyncSidekiqJob).to receive(:perform_async)
79
+ Pwwka.configuration.background_job_processor = :sidekiq
80
+ end
81
+
82
+ after do
83
+ Pwwka::configuration.background_job_processor = :resque
84
+ end
85
+
86
+ context "with only basic required arguments" do
87
+ it "queues a Sidekiq job with no extra arguments" do
88
+ options = { delay_by_ms: 3_000, type: nil, message_id: :auto_generate, headers: nil}
89
+ described_class.send_message_async(payload, routing_key, delay_by_ms: 3_000)
90
+ expect(Pwwka::SendMessageAsyncSidekiqJob).to have_received(:perform_async)
91
+ .with(payload, routing_key, options)
92
+ end
93
+ end
94
+
95
+ context "with everything overridden" do
96
+ it "queues a Sidekiq job with the various arguments" do
97
+ described_class.send_message_async(
98
+ payload,routing_key,
99
+ delay_by_ms: 3_000,
100
+ message_id: "snowflake id that is likely a bad idea, but if you must",
101
+ type: "Customer",
102
+ headers: {
103
+ "custom" => "value",
104
+ "other_custom" => "other_value",
105
+ }
106
+ )
107
+ expect(Pwwka::SendMessageAsyncSidekiqJob).to have_received(:perform_async).with(
108
+ payload,
109
+ routing_key,
110
+ {
111
+ delay_by_ms: 3_000,
112
+ type: "Customer",
113
+ message_id: "snowflake id that is likely a bad idea, but if you must",
114
+ headers: {
115
+ "custom" => "value",
116
+ "other_custom" => "other_value",
117
+ }
118
+ }
119
+ )
120
+ end
71
121
  end
72
122
  end
73
123
  end
@@ -283,6 +333,81 @@ describe Pwwka::Transmitter do
283
333
  end
284
334
  end
285
335
  end
336
+
337
+ context "on_error: :retry_async" do
338
+ context "when configured background_job_processor is Resque" do
339
+ context "when the job is queued successfully" do
340
+ before do
341
+ allow(Resque).to receive(:enqueue_in)
342
+ end
343
+
344
+ it "queues a Resque job" do
345
+ described_class.send_message!(payload, routing_key, on_error: :retry_async)
346
+ expect(Resque).to have_received(:enqueue_in).with(0, Pwwka::SendMessageAsyncJob, payload, routing_key)
347
+ end
348
+ end
349
+
350
+ context "when there is a problem queueing the Resque job" do
351
+ before do
352
+ allow(Resque).to receive(:enqueue_in).and_raise("NOPE")
353
+ end
354
+
355
+ it "raises the original exception job" do
356
+ expect {
357
+ described_class.send_message!(payload,routing_key, on_error: :retry_async)
358
+ }.to raise_error(/OH NOES/)
359
+ end
360
+
361
+ it "logs the Resque error as a warning" do
362
+ begin
363
+ described_class.send_message!(payload,routing_key, on_error: :resque)
364
+ rescue => ex
365
+ end
366
+ expect(logger).to have_received(:warn).with(/NOPE/)
367
+ end
368
+ end
369
+ end
370
+
371
+ context "when configured background_job_processor is Sidekiq" do
372
+ before do
373
+ Pwwka.configuration.background_job_processor = :sidekiq
374
+ end
375
+
376
+ after do
377
+ Pwwka::configuration.background_job_processor = :resque
378
+ end
379
+
380
+ context "when the job is queued sucessfully" do
381
+ it "queues a Sidekiq job" do
382
+ allow(Pwwka::SendMessageAsyncSidekiqJob).to receive(:perform_async)
383
+ described_class.send_message!(payload, routing_key, on_error: :retry_async)
384
+ expect(Pwwka::SendMessageAsyncSidekiqJob).to have_received(:perform_async).with(
385
+ payload,
386
+ routing_key,
387
+ {delay_by_ms: 0, headers: nil, message_id: :auto_generate, type: nil}
388
+ )
389
+ end
390
+ end
391
+
392
+ context "when there is a problem queueing the Sidekiq job" do
393
+ it "raises the original exception job" do
394
+ allow(Pwwka::SendMessageAsyncSidekiqJob).to receive(:perform_async).and_raise("NOPE")
395
+ expect {
396
+ described_class.send_message!(payload, routing_key, on_error: :retry_async)
397
+ }.to raise_error(/OH NOES/)
398
+ end
399
+
400
+ it "logs the Sidekiq error as a warning" do
401
+ allow(Pwwka::SendMessageAsyncSidekiqJob).to receive(:perform_async).and_raise("NOPE")
402
+ begin
403
+ described_class.send_message!(payload,routing_key, on_error: :retry_async)
404
+ rescue => ex
405
+ end
406
+ expect(logger).to have_received(:warn).with(/NOPE/)
407
+ end
408
+ end
409
+ end
410
+ end
286
411
  end
287
412
  end
288
413
  describe ".send_message_safely" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwwka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.2
4
+ version: 0.21.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stitch Fix Engineering
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2019-01-08 00:00:00.000000000 Z
18
+ date: 2019-01-16 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: bunny
@@ -129,6 +129,20 @@ dependencies:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: sidekiq
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
132
146
  - !ruby/object:Gem::Dependency
133
147
  name: simplecov
134
148
  requirement: !ruby/object:Gem::Requirement
@@ -185,6 +199,20 @@ dependencies:
185
199
  - - ">="
186
200
  - !ruby/object:Gem::Version
187
201
  version: '0'
202
+ - !ruby/object:Gem::Dependency
203
+ name: pry-byebug
204
+ requirement: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
188
216
  description: |-
189
217
  The purpose of this gem is to normalise the sending and
190
218
  receiving of messages between Rails apps using the shared RabbitMQ
@@ -239,6 +267,7 @@ files:
239
267
  - lib/pwwka/queue_resque_job_handler.rb
240
268
  - lib/pwwka/receiver.rb
241
269
  - lib/pwwka/send_message_async_job.rb
270
+ - lib/pwwka/send_message_async_sidekiq_job.rb
242
271
  - lib/pwwka/tasks.rb
243
272
  - lib/pwwka/test_handler.rb
244
273
  - lib/pwwka/transmitter.rb
@@ -266,6 +295,7 @@ files:
266
295
  - spec/unit/queue_resque_job_handler_spec.rb
267
296
  - spec/unit/receiver_spec.rb
268
297
  - spec/unit/send_message_async_job_spec.rb
298
+ - spec/unit/send_message_async_sidekiq_job_spec.rb
269
299
  - spec/unit/test_handler_message_spec.rb
270
300
  - spec/unit/transmitter_spec.rb
271
301
  homepage: https://github.com/stitchfix/pwwka
@@ -314,5 +344,6 @@ test_files:
314
344
  - spec/unit/queue_resque_job_handler_spec.rb
315
345
  - spec/unit/receiver_spec.rb
316
346
  - spec/unit/send_message_async_job_spec.rb
347
+ - spec/unit/send_message_async_sidekiq_job_spec.rb
317
348
  - spec/unit/test_handler_message_spec.rb
318
349
  - spec/unit/transmitter_spec.rb