pwwka 0.21.2 → 0.21.3

Sign up to get free protection for your applications and to get access to all the features.
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