mimi-messaging-sqs_sns 0.3.0 → 0.4.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/README.md +1 -0
- data/examples/event.rb +34 -0
- data/examples/query.rb +3 -1
- data/examples/responder.rb +3 -1
- data/examples/subscriber.rb +55 -0
- data/lib/mimi/messaging/sqs_sns/adapter.rb +205 -32
- data/lib/mimi/messaging/sqs_sns/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b740db8e4dab81e38d1b84ecd40c508a67d4c4c8
|
4
|
+
data.tar.gz: b55b8188a57c5e0b8095ba133b27dad09f17f2a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c215ab899f4217ecd11e628f9739671d569da25cd2abd8ea3ce35572c5076b09941898f18b22f9d97926a9e29a93fb1729064919643ae0119a0a4f62c860b3d1
|
7
|
+
data.tar.gz: 28b7ff63ec0db04041fc173a329bf39a3179d16f50e3d72133f776806fb95c2de5572ec51f8b97681a507645a05021fd01df9b2e1d3f36feae98601f8c8f39ee
|
data/README.md
CHANGED
data/examples/event.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mimi/messaging/sqs_sns"
|
4
|
+
|
5
|
+
COUNT = 10
|
6
|
+
AWS_REGION = "eu-west-1"
|
7
|
+
AWS_SQS_ENDPOINT_URL = "http://localstack:4576"
|
8
|
+
AWS_SNS_ENDPOINT_URL = "http://localstack:4575"
|
9
|
+
AWS_ACCESS_KEY_ID = "foo"
|
10
|
+
AWS_SECRET_ACCESS_KEY = "bar"
|
11
|
+
|
12
|
+
logger = Logger.new(STDOUT)
|
13
|
+
logger.level = Logger::INFO
|
14
|
+
Mimi::Messaging.use(logger: logger, serializer: Mimi::Messaging::JsonSerializer)
|
15
|
+
Mimi::Messaging.configure(
|
16
|
+
mq_adapter: "sqs_sns",
|
17
|
+
mq_aws_access_key_id: AWS_ACCESS_KEY_ID,
|
18
|
+
mq_aws_secret_access_key: AWS_SECRET_ACCESS_KEY,
|
19
|
+
mq_aws_region: AWS_REGION,
|
20
|
+
mq_aws_sqs_endpoint: AWS_SQS_ENDPOINT_URL,
|
21
|
+
mq_aws_sns_endpoint: AWS_SNS_ENDPOINT_URL,
|
22
|
+
mq_log_at_level: :info
|
23
|
+
)
|
24
|
+
adapter = Mimi::Messaging.adapter
|
25
|
+
|
26
|
+
adapter.start
|
27
|
+
|
28
|
+
t_start = Time.now
|
29
|
+
COUNT.times do |i|
|
30
|
+
t = Time.now
|
31
|
+
puts "Publishing event: #{i}"
|
32
|
+
adapter.event("hello#tested", i: i) # rand(100))
|
33
|
+
sleep 1
|
34
|
+
end
|
data/examples/query.rb
CHANGED
@@ -5,6 +5,7 @@ require "mimi/messaging/sqs_sns"
|
|
5
5
|
COUNT = 10
|
6
6
|
AWS_REGION = "eu-west-1"
|
7
7
|
AWS_SQS_ENDPOINT_URL = "http://localstack:4576"
|
8
|
+
AWS_SNS_ENDPOINT_URL = "http://localstack:4575"
|
8
9
|
AWS_ACCESS_KEY_ID = "foo"
|
9
10
|
AWS_SECRET_ACCESS_KEY = "bar"
|
10
11
|
|
@@ -16,7 +17,8 @@ Mimi::Messaging.configure(
|
|
16
17
|
mq_aws_access_key_id: AWS_ACCESS_KEY_ID,
|
17
18
|
mq_aws_secret_access_key: AWS_SECRET_ACCESS_KEY,
|
18
19
|
mq_aws_region: AWS_REGION,
|
19
|
-
mq_aws_sqs_endpoint: AWS_SQS_ENDPOINT_URL
|
20
|
+
mq_aws_sqs_endpoint: AWS_SQS_ENDPOINT_URL,
|
21
|
+
mq_aws_sns_endpoint: AWS_SNS_ENDPOINT_URL
|
20
22
|
)
|
21
23
|
adapter = Mimi::Messaging.adapter
|
22
24
|
|
data/examples/responder.rb
CHANGED
@@ -4,6 +4,7 @@ require "mimi/messaging/sqs_sns"
|
|
4
4
|
|
5
5
|
AWS_REGION = "eu-west-1"
|
6
6
|
AWS_SQS_ENDPOINT_URL = "http://localstack:4576"
|
7
|
+
AWS_SNS_ENDPOINT_URL = "http://localstack:4575"
|
7
8
|
AWS_ACCESS_KEY_ID = "foo"
|
8
9
|
AWS_SECRET_ACCESS_KEY = "bar"
|
9
10
|
|
@@ -28,7 +29,8 @@ Mimi::Messaging.configure(
|
|
28
29
|
mq_aws_access_key_id: AWS_ACCESS_KEY_ID,
|
29
30
|
mq_aws_secret_access_key: AWS_SECRET_ACCESS_KEY,
|
30
31
|
mq_aws_region: AWS_REGION,
|
31
|
-
mq_aws_sqs_endpoint: AWS_SQS_ENDPOINT_URL
|
32
|
+
mq_aws_sqs_endpoint: AWS_SQS_ENDPOINT_URL,
|
33
|
+
mq_aws_sns_endpoint: AWS_SNS_ENDPOINT_URL
|
32
34
|
)
|
33
35
|
adapter = Mimi::Messaging.adapter
|
34
36
|
queue_name = "test"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mimi/messaging/sqs_sns"
|
4
|
+
|
5
|
+
AWS_REGION = "eu-west-1"
|
6
|
+
AWS_SQS_ENDPOINT_URL = "http://localstack:4576"
|
7
|
+
AWS_SNS_ENDPOINT_URL = "http://localstack:4575"
|
8
|
+
AWS_ACCESS_KEY_ID = "foo"
|
9
|
+
AWS_SECRET_ACCESS_KEY = "bar"
|
10
|
+
|
11
|
+
class Processor
|
12
|
+
def self.call_command(method_name, message, opts)
|
13
|
+
puts "COMMAND: #{method_name}, #{message}, headers: #{message.headers}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.call_query(method_name, message, opts)
|
17
|
+
puts "QUERY: #{method_name}, #{message}, headers: #{message.headers}"
|
18
|
+
{}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.call_event(event_type, message, opts)
|
22
|
+
puts "EVENT: #{event_type}, #{message}, headers: #{message.headers}"
|
23
|
+
end
|
24
|
+
end # class Processor
|
25
|
+
|
26
|
+
|
27
|
+
logger = Logger.new(STDOUT)
|
28
|
+
logger.level = Logger::INFO
|
29
|
+
Mimi::Messaging.use(logger: logger, serializer: Mimi::Messaging::JsonSerializer)
|
30
|
+
Mimi::Messaging.configure(
|
31
|
+
mq_adapter: "sqs_sns",
|
32
|
+
mq_aws_access_key_id: AWS_ACCESS_KEY_ID,
|
33
|
+
mq_aws_secret_access_key: AWS_SECRET_ACCESS_KEY,
|
34
|
+
mq_aws_region: AWS_REGION,
|
35
|
+
mq_aws_sqs_endpoint: AWS_SQS_ENDPOINT_URL,
|
36
|
+
mq_aws_sns_endpoint: AWS_SNS_ENDPOINT_URL,
|
37
|
+
mq_log_at_level: :info
|
38
|
+
)
|
39
|
+
adapter = Mimi::Messaging.adapter
|
40
|
+
|
41
|
+
topic_name = "hello"
|
42
|
+
queue_name = "listener.hello"
|
43
|
+
adapter.start
|
44
|
+
puts "Registering event processor on '#{topic_name}'->'#{queue_name}'"
|
45
|
+
adapter.start_event_processor_with_queue(topic_name, queue_name, Processor)
|
46
|
+
|
47
|
+
begin
|
48
|
+
loop do
|
49
|
+
sleep 1
|
50
|
+
end
|
51
|
+
ensure
|
52
|
+
puts "Stopping adapter"
|
53
|
+
adapter.stop
|
54
|
+
end
|
55
|
+
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "mimi/messaging"
|
4
4
|
require "aws-sdk-sqs"
|
5
|
+
require "aws-sdk-sns"
|
5
6
|
require "timeout"
|
6
7
|
require "securerandom"
|
7
8
|
|
@@ -23,20 +24,37 @@ module Mimi
|
|
23
24
|
# * #stop_all_processors
|
24
25
|
#
|
25
26
|
class Adapter < Mimi::Messaging::Adapters::Base
|
26
|
-
|
27
|
+
#
|
28
|
+
# NOTE: AWS SQS/SNS alphabet for queue and topic names
|
29
|
+
# is different from what mimi-messaging allows:
|
30
|
+
# '.' is not an allowed character.
|
31
|
+
#
|
32
|
+
# SQS_SNS_ALPHABET_MAP structure is used to convert
|
33
|
+
# names from mimi-messaging alphabet to SQS/SNS alphabet.
|
34
|
+
#
|
35
|
+
# Mimi::Messaging still accepts queue and topic names
|
36
|
+
# containing the '.', but the adapter will convert those
|
37
|
+
# to valid SQS/SNS names using this mapping.
|
38
|
+
#
|
39
|
+
SQS_SNS_ALPHABET_MAP = {
|
40
|
+
"." => "-"
|
41
|
+
}.freeze
|
42
|
+
|
43
|
+
attr_reader :options, :sqs_client, :sns_client
|
27
44
|
|
28
45
|
register_adapter_name "sqs_sns"
|
29
46
|
|
30
47
|
DEFAULT_OPTIONS = {
|
31
48
|
mq_namespace: nil,
|
32
49
|
mq_default_query_timeout: 15, # seconds,
|
33
|
-
mq_reply_queue_prefix: "reply
|
50
|
+
mq_reply_queue_prefix: "reply-",
|
34
51
|
|
35
52
|
# if nil, AWS SDK will guess values from environment
|
36
53
|
mq_aws_region: nil,
|
37
54
|
mq_aws_access_key_id: nil,
|
38
55
|
mq_aws_secret_access_key: nil,
|
39
56
|
mq_aws_sqs_endpoint: nil,
|
57
|
+
mq_aws_sns_endpoint: nil,
|
40
58
|
|
41
59
|
mq_aws_sqs_read_timeout: 10, # seconds
|
42
60
|
}.freeze
|
@@ -59,11 +77,13 @@ module Mimi
|
|
59
77
|
|
60
78
|
def start
|
61
79
|
@sqs_client = Aws::SQS::Client.new(sqs_client_config)
|
80
|
+
@sns_client = Aws::SNS::Client.new(sns_client_config)
|
62
81
|
end
|
63
82
|
|
64
83
|
def stop
|
65
84
|
stop_all_processors
|
66
85
|
@sqs_client = nil
|
86
|
+
@sns_client = nil
|
67
87
|
end
|
68
88
|
|
69
89
|
# Stops all message (command, query and event) processors.
|
@@ -92,8 +112,8 @@ module Mimi
|
|
92
112
|
def command(target, message, _opts = {})
|
93
113
|
queue_name, method_name = target.split("/")
|
94
114
|
message = Mimi::Messaging::Message.new(message, __method: method_name)
|
95
|
-
queue_url = find_queue(queue_name)
|
96
|
-
|
115
|
+
queue_url = find_queue!(queue_name)
|
116
|
+
deliver_message_queue(queue_url, message)
|
97
117
|
end
|
98
118
|
|
99
119
|
# Executes the query to the given target and returns response
|
@@ -107,7 +127,7 @@ module Mimi
|
|
107
127
|
#
|
108
128
|
def query(target, message, opts = {})
|
109
129
|
queue_name, method_name = target.split("/")
|
110
|
-
queue_url = find_queue(queue_name)
|
130
|
+
queue_url = find_queue!(queue_name)
|
111
131
|
request_id = SecureRandom.hex(8)
|
112
132
|
reply_queue = reply_consumer.register_request_id(request_id)
|
113
133
|
|
@@ -117,7 +137,7 @@ module Mimi
|
|
117
137
|
__reply_queue_url: reply_consumer.reply_queue_url,
|
118
138
|
__request_id: request_id
|
119
139
|
)
|
120
|
-
|
140
|
+
deliver_message_queue(queue_url, message)
|
121
141
|
timeout = opts[:timeout] || options[:mq_default_query_timeout]
|
122
142
|
response = nil
|
123
143
|
Timeout::timeout(timeout) do
|
@@ -134,8 +154,9 @@ module Mimi
|
|
134
154
|
#
|
135
155
|
def event(target, message, _opts = {})
|
136
156
|
topic_name, event_type = target.split("#")
|
137
|
-
|
138
|
-
|
157
|
+
message = Mimi::Messaging::Message.new(message, __event_type: event_type)
|
158
|
+
topic_arn = find_or_create_topic(topic_name) # TODO: or find_topic!(...) ?
|
159
|
+
deliver_message_topic(topic_arn, message)
|
139
160
|
end
|
140
161
|
|
141
162
|
# Starts a request (command/query) processor.
|
@@ -168,7 +189,7 @@ module Mimi
|
|
168
189
|
response,
|
169
190
|
__request_id: message.headers[:__request_id]
|
170
191
|
)
|
171
|
-
|
192
|
+
deliver_message_queue(reply_to, response_message)
|
172
193
|
else
|
173
194
|
processor.call_command(method_name, message, {})
|
174
195
|
end
|
@@ -176,25 +197,25 @@ module Mimi
|
|
176
197
|
end
|
177
198
|
|
178
199
|
def start_event_processor(topic_name, processor, opts = {})
|
200
|
+
# NOTE: due to SQS/SNS limitations, implementing this will
|
201
|
+
# require creating a temporary queue and subscribing it to the topic
|
179
202
|
raise "Not implemented"
|
180
203
|
end
|
181
204
|
|
182
205
|
def start_event_processor_with_queue(topic_name, queue_name, processor, opts = {})
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
rescue StandardError => e
|
197
|
-
raise Mimi::Messaging::ConnectionError, "Failed to create queue '#{queue_name}': #{e}"
|
206
|
+
@consumers ||= []
|
207
|
+
opts = opts.dup
|
208
|
+
topic_arn = find_or_create_topic(topic_name) # TODO: or find_topic!(...) ?
|
209
|
+
queue_url = find_or_create_queue(queue_name)
|
210
|
+
subscribe_topic_queue(topic_arn, queue_url)
|
211
|
+
@consumers << Consumer.new(self, queue_url) do |m|
|
212
|
+
message = Mimi::Messaging::Message.new(
|
213
|
+
deserialize(m.body),
|
214
|
+
deserialize_headers(m)
|
215
|
+
)
|
216
|
+
event_type = message.headers[:__event_type]
|
217
|
+
processor.call_event(event_type, message, {})
|
218
|
+
end
|
198
219
|
end
|
199
220
|
|
200
221
|
private
|
@@ -213,12 +234,40 @@ module Mimi
|
|
213
234
|
params.compact
|
214
235
|
end
|
215
236
|
|
237
|
+
# Returns configuration parameters for AWS SNS client
|
238
|
+
#
|
239
|
+
# @return [Hash]
|
240
|
+
#
|
241
|
+
def sns_client_config
|
242
|
+
params = {
|
243
|
+
region: options[:mq_aws_region],
|
244
|
+
endpoint: options[:mq_aws_sns_endpoint],
|
245
|
+
access_key_id: options[:mq_aws_access_key_id],
|
246
|
+
secret_access_key: options[:mq_aws_secret_access_key]
|
247
|
+
}
|
248
|
+
params.compact
|
249
|
+
end
|
250
|
+
|
251
|
+
# Creates a new queue
|
252
|
+
#
|
253
|
+
# @param queue_name [String] name of the topic to be created
|
254
|
+
# @return [String] a new queue URL
|
255
|
+
#
|
256
|
+
def create_queue(queue_name)
|
257
|
+
fqn = sqs_sns_converted_full_name(queue_name)
|
258
|
+
Mimi::Messaging.log "Creating a queue: #{fqn}"
|
259
|
+
result = sqs_client.create_queue(queue_name: fqn)
|
260
|
+
result.queue_url
|
261
|
+
rescue StandardError => e
|
262
|
+
raise Mimi::Messaging::ConnectionError, "Failed to create queue '#{queue_name}': #{e}"
|
263
|
+
end
|
264
|
+
|
216
265
|
# Delivers a message to a queue with given URL.
|
217
266
|
#
|
218
267
|
# @param queue_url [String]
|
219
268
|
# @param message [Mimi::Messaging::Message]
|
220
269
|
#
|
221
|
-
def
|
270
|
+
def deliver_message_queue(queue_url, message)
|
222
271
|
raise ArgumentError, "Non-empty queue URL is expected" unless queue_url
|
223
272
|
unless message.is_a?(Mimi::Messaging::Message)
|
224
273
|
raise ArgumentError, "Message is expected as argument"
|
@@ -243,7 +292,7 @@ module Mimi
|
|
243
292
|
# @return [String,nil] queue URL
|
244
293
|
#
|
245
294
|
def queue_registry(queue_name)
|
246
|
-
fqn =
|
295
|
+
fqn = sqs_sns_converted_full_name(queue_name)
|
247
296
|
@queue_registry ||= {}
|
248
297
|
@queue_registry[fqn] ||= begin
|
249
298
|
result = sqs_client.get_queue_url(queue_name: fqn)
|
@@ -253,13 +302,18 @@ module Mimi
|
|
253
302
|
nil
|
254
303
|
end
|
255
304
|
|
256
|
-
# Converts a queue name to a fully qualified
|
305
|
+
# Converts a topic or queue name to a fully qualified (with namespace)
|
306
|
+
# and in a valid SQS/SNS alphabet.
|
257
307
|
#
|
258
|
-
# @param
|
259
|
-
# @return [String]
|
308
|
+
# @param name [String] a mimi-messaging valid name
|
309
|
+
# @return [String] an SQS/SNS valid name
|
260
310
|
#
|
261
|
-
def
|
262
|
-
"#{options[:mq_namespace]}#{
|
311
|
+
def sqs_sns_converted_full_name(name)
|
312
|
+
name = "#{options[:mq_namespace]}#{name}"
|
313
|
+
SQS_SNS_ALPHABET_MAP.each do |from, to|
|
314
|
+
name = name.gsub(from, to)
|
315
|
+
end
|
316
|
+
name
|
263
317
|
end
|
264
318
|
|
265
319
|
# Finds a queue URL for a queue with a given name,
|
@@ -268,7 +322,7 @@ module Mimi
|
|
268
322
|
# @param queue_name [String]
|
269
323
|
# @return [String] a queue URL
|
270
324
|
#
|
271
|
-
def find_queue(queue_name)
|
325
|
+
def find_queue!(queue_name)
|
272
326
|
queue_registry(queue_name) || (
|
273
327
|
raise Mimi::Messaging::ConnectionError,
|
274
328
|
"Failed to find a queue with given name: '#{queue_name}'"
|
@@ -307,6 +361,125 @@ module Mimi
|
|
307
361
|
def deserialize_headers(message)
|
308
362
|
message.message_attributes.to_h.map { |k, v| [k.to_sym, v.string_value] }.to_h
|
309
363
|
end
|
364
|
+
|
365
|
+
# Lists all SNS topics by their ARNs.
|
366
|
+
#
|
367
|
+
# NOTE: iterates over all topics at SNS every time
|
368
|
+
#
|
369
|
+
# @return [Array<String>] array of topic ARNs
|
370
|
+
#
|
371
|
+
def sns_list_topics
|
372
|
+
result = []
|
373
|
+
next_token = nil
|
374
|
+
loop do
|
375
|
+
response = sns_client.list_topics(next_token: next_token)
|
376
|
+
result += response.topics.map(&:topic_arn)
|
377
|
+
next_token = response.next_token
|
378
|
+
break unless next_token
|
379
|
+
end
|
380
|
+
result
|
381
|
+
rescue StandardError => e
|
382
|
+
raise Mimi::Messaging::ConnectionError, "Failed to list topics: #{e}"
|
383
|
+
end
|
384
|
+
|
385
|
+
# Returns ARN of a topic with a given name.
|
386
|
+
#
|
387
|
+
# If the topic with given name does not exist, returns nil
|
388
|
+
#
|
389
|
+
# @param topic_name [String]
|
390
|
+
# @return [String,nil] topic ARN or nil, if not found
|
391
|
+
#
|
392
|
+
def topic_registry(topic_name)
|
393
|
+
fqn = sqs_sns_converted_full_name(topic_name)
|
394
|
+
@topic_registry ||= {}
|
395
|
+
@topic_registry[fqn] ||= begin
|
396
|
+
sns_list_topics.find { |topic_arn| topic_arn.split(":").last == fqn }
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
# Finds a topic ARN for a topic with a given name,
|
401
|
+
# or raises an error if the topic is not found.
|
402
|
+
#
|
403
|
+
# @param topic_name [String]
|
404
|
+
# @return [String] a topic ARN
|
405
|
+
#
|
406
|
+
def find_topic!(topic_name)
|
407
|
+
topic_registry(topic_name) || (
|
408
|
+
raise Mimi::Messaging::ConnectionError,
|
409
|
+
"Failed to find a topic with given name: '#{topic_name}'"
|
410
|
+
)
|
411
|
+
end
|
412
|
+
|
413
|
+
# Finds a topic ARN for a topic with given name.
|
414
|
+
#
|
415
|
+
# If an existing topic with this name is not found,
|
416
|
+
# the method will try to create a new one.
|
417
|
+
#
|
418
|
+
# @param topic_name [String]
|
419
|
+
# @return [String] a topic ARN
|
420
|
+
#
|
421
|
+
def find_or_create_topic(topic_name)
|
422
|
+
topic_registry(topic_name) || create_topic(topic_name)
|
423
|
+
end
|
424
|
+
|
425
|
+
# Creates a new topic
|
426
|
+
#
|
427
|
+
# @param topic_name [String] name of the topic to be created
|
428
|
+
# @return [String] a new topic ARN
|
429
|
+
#
|
430
|
+
def create_topic(topic_name)
|
431
|
+
fqn = sqs_sns_converted_full_name(topic_name)
|
432
|
+
Mimi::Messaging.log "Creating a topic: #{fqn}"
|
433
|
+
result = sns_client.create_topic(name: fqn)
|
434
|
+
result.topic_arn
|
435
|
+
rescue StandardError => e
|
436
|
+
raise Mimi::Messaging::ConnectionError, "Failed to create topic '#{topic_name}': #{e}"
|
437
|
+
end
|
438
|
+
|
439
|
+
# Subscribes an existing queue to an existing topic
|
440
|
+
#
|
441
|
+
# @param topic_arn [String]
|
442
|
+
# @param queue_url [String]
|
443
|
+
#
|
444
|
+
def subscribe_topic_queue(topic_arn, queue_url)
|
445
|
+
result = sqs_client.get_queue_attributes(
|
446
|
+
queue_url: queue_url, attribute_names: ["QueueArn"]
|
447
|
+
)
|
448
|
+
queue_arn = result.attributes["QueueArn"]
|
449
|
+
Mimi::Messaging.log "Subscribing queue to a topic: '#{topic_arn}'->'#{queue_url}'"
|
450
|
+
result = sns_client.subscribe(
|
451
|
+
topic_arn: topic_arn,
|
452
|
+
protocol: "sqs",
|
453
|
+
endpoint: queue_arn,
|
454
|
+
attributes: { "RawMessageDelivery" => "true" }
|
455
|
+
)
|
456
|
+
true
|
457
|
+
rescue StandardError => e
|
458
|
+
raise Mimi::Messaging::ConnectionError,
|
459
|
+
"Failed to subscribe queue to topic '#{topic_arn}'->'#{queue_url}': #{e}"
|
460
|
+
end
|
461
|
+
|
462
|
+
# Delivers a message to a topic with given ARN.
|
463
|
+
#
|
464
|
+
# @param topic_arn [String]
|
465
|
+
# @param message [Mimi::Messaging::Message]
|
466
|
+
#
|
467
|
+
def deliver_message_topic(topic_arn, message)
|
468
|
+
raise ArgumentError, "Non-empty topic ARN is expected" unless topic_arn
|
469
|
+
unless message.is_a?(Mimi::Messaging::Message)
|
470
|
+
raise ArgumentError, "Message is expected as argument"
|
471
|
+
end
|
472
|
+
Mimi::Messaging.log "Delivering message to: #{topic_arn}"
|
473
|
+
sns_client.publish(
|
474
|
+
topic_arn: topic_arn,
|
475
|
+
message: serialize(message),
|
476
|
+
message_attributes: message.headers.map do |k, v|
|
477
|
+
[k.to_s, { data_type: "String", string_value: v.to_s }]
|
478
|
+
end.to_h
|
479
|
+
)
|
480
|
+
rescue StandardError => e
|
481
|
+
raise Mimi::Messaging::ConnectionError, "Failed to deliver message to '#{topic_arn}': #{e}"
|
482
|
+
end
|
310
483
|
end # class Adapter
|
311
484
|
end # module SQS_SNS
|
312
485
|
end # module Messaging
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mimi-messaging-sqs_sns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Kukushkin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mimi-messaging
|
@@ -125,8 +125,10 @@ files:
|
|
125
125
|
- Rakefile
|
126
126
|
- bin/console
|
127
127
|
- bin/setup
|
128
|
+
- examples/event.rb
|
128
129
|
- examples/query.rb
|
129
130
|
- examples/responder.rb
|
131
|
+
- examples/subscriber.rb
|
130
132
|
- lib/mimi/messaging/sqs_sns.rb
|
131
133
|
- lib/mimi/messaging/sqs_sns/adapter.rb
|
132
134
|
- lib/mimi/messaging/sqs_sns/consumer.rb
|