osbourne 0.2.2 → 1.0.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 -1
- data/lib/generators/osbourne/install/templates/osbourne_initializer_template.template +0 -2
- data/lib/generators/osbourne/worker/templates/worker_template.template +16 -26
- data/lib/osbourne.rb +5 -1
- data/lib/osbourne/config/file_loader.rb +2 -2
- data/lib/osbourne/config/shared_configs.rb +7 -3
- data/lib/osbourne/existing_subscriptions.rb +1 -2
- data/lib/osbourne/launcher.rb +31 -20
- data/lib/osbourne/locks/base.rb +2 -1
- data/lib/osbourne/message.rb +59 -14
- data/lib/osbourne/runner.rb +1 -1
- data/lib/osbourne/services/queue_provisioner.rb +1 -1
- data/lib/osbourne/subscription.rb +43 -20
- data/lib/osbourne/topic.rb +1 -1
- data/lib/osbourne/version.rb +1 -1
- data/lib/osbourne/worker_base.rb +28 -23
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30bc10e5c04691de985ff77f554ac23596052bbdd70de1d642f875378065f7e8
|
4
|
+
data.tar.gz: aebe87fe5fff351c0ab9f9add37508b81f1f1e5147b06e8c41cfd555db216c23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93a0d8128556f2a77abe7c82a31fdd73d41c2647c6021a76d1aa8a6bfdceb86c32d7a361d0a14d01597b75fd84644090038bedc7f98e0dbad28fcedadd54948e
|
7
|
+
data.tar.gz: 4fe3bea017685121b90e49289aee1998a25b606ec1ab0b01a7519cecffd8193e922cfe99bcb47dd402f1661defe1e073d89317def80a334a177da28df509961f
|
data/README.md
CHANGED
@@ -148,7 +148,7 @@ This will generate a `WorkerNameWorker` in `app/workers/worker_name_worker.rb`,
|
|
148
148
|
|
149
149
|
There is some configuration options available within the generated worker. See comments in the worker for options.
|
150
150
|
|
151
|
-
SNS messages broadcast through an SQS queue will have some layers of envelop wrappings around them. The `message` object passed into the worker's `#perform` method contains some helpers to make parsing this easier. `#
|
151
|
+
SNS messages broadcast through an SQS queue will have some layers of envelop wrappings around them. The `message` object passed into the worker's `#perform` method contains some helpers to make parsing this easier. `#message_body` is the most important one, as it contains the actual string of the message that was originally broadcast.
|
152
152
|
|
153
153
|
### Running workers
|
154
154
|
|
@@ -2,33 +2,23 @@
|
|
2
2
|
|
3
3
|
class <%= name.singularize.camelcase %>Worker < Osbourne::WorkerBase
|
4
4
|
|
5
|
-
worker_config topics: %w[<%= topic.join(" ") %>]
|
5
|
+
worker_config topics: %w[<%= topic.join(" ") %>]
|
6
|
+
# Other available onfig options and their defaults:
|
7
|
+
# max_batch_size: 10
|
8
|
+
# max_wait: 10
|
9
|
+
# threads: Osbourne.threads_per_worker
|
10
|
+
# queue_name: <%= name %>_queue
|
11
|
+
# dead_letter_queue: true
|
12
|
+
# max_retry_count: Osbourne.max_retry_count
|
6
13
|
|
7
14
|
def process(message)
|
8
|
-
puts message.
|
9
|
-
|
10
|
-
puts message.
|
11
|
-
|
12
|
-
puts message.
|
13
|
-
|
15
|
+
puts message.sns? # Was this message broadcast via SNS?
|
16
|
+
puts message.raw_body # The only way to access a message that wasn't sent via SNS
|
17
|
+
puts message.message_body # If the message came from a SNS broadcast,
|
18
|
+
# as opposed to a direct SQS message, it will come from here
|
19
|
+
puts message.topic # The topic this message was published to.
|
20
|
+
# Useful if this worker subscribes to more than one topic
|
21
|
+
puts message.id # The UUID for this message. Useful for validating if this is
|
22
|
+
# the first time it has been processed
|
14
23
|
end
|
15
|
-
|
16
|
-
# class << self
|
17
|
-
# # override this to set how many times a message will be retried before
|
18
|
-
# # being redirected to the dead letter queue (if enabled)
|
19
|
-
# def max_retry_count
|
20
|
-
# end
|
21
|
-
|
22
|
-
# # override this to set the worker's dead letter queue name
|
23
|
-
# def dead_letter_queue_name
|
24
|
-
# end
|
25
|
-
|
26
|
-
# # override this to `false` to disable the dead letter queu for this worker
|
27
|
-
# def dead_letter_queue
|
28
|
-
# end
|
29
|
-
|
30
|
-
# # override this to set the worker queue name
|
31
|
-
# def queue_name
|
32
|
-
# end
|
33
|
-
# end
|
34
24
|
end
|
data/lib/osbourne.rb
CHANGED
@@ -22,7 +22,7 @@ module Osbourne
|
|
22
22
|
include Osbourne::Config::SharedConfigs
|
23
23
|
include Osbourne::Services::QueueProvisioner
|
24
24
|
include Osbourne::ExistingSubscriptions
|
25
|
-
attr_writer :sns_client, :sqs_client
|
25
|
+
# attr_writer :sns_client, :sqs_client
|
26
26
|
|
27
27
|
def sns_client
|
28
28
|
return if Osbourne.test_mode?
|
@@ -36,6 +36,10 @@ module Osbourne
|
|
36
36
|
@sqs_client ||= Aws::SQS::Client.new(Osbourne.config.sqs_config)
|
37
37
|
end
|
38
38
|
|
39
|
+
attr_writer :sns_client
|
40
|
+
|
41
|
+
attr_writer :sqs_client
|
42
|
+
|
39
43
|
def publish(topic, message)
|
40
44
|
Topic.new(topic).publish(message)
|
41
45
|
end
|
@@ -13,8 +13,8 @@ module Osbourne
|
|
13
13
|
base_opts = YAML.safe_load(ERB.new(IO.read(cfile)).result) || {}
|
14
14
|
env_opts = base_opts[environment] || {}
|
15
15
|
|
16
|
-
Osbourne.config.sns_config = env_opts["publisher"]
|
17
|
-
Osbourne.config.sqs_config = env_opts["subscriber"]
|
16
|
+
Osbourne.config.sns_config = env_opts["publisher"]&.symbolize_keys || {}
|
17
|
+
Osbourne.config.sqs_config = env_opts["subscriber"]&.symbolize_keys || {}
|
18
18
|
true
|
19
19
|
end
|
20
20
|
|
@@ -34,15 +34,19 @@ module Osbourne
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def logger
|
37
|
-
config.logger ||= Logger.new(
|
37
|
+
config.logger ||= Logger.new("log/osbourne.log")
|
38
38
|
end
|
39
39
|
|
40
40
|
def lock
|
41
|
-
config.lock
|
41
|
+
config.lock ||= Osbourne::Locks::NOOP.new
|
42
42
|
end
|
43
43
|
|
44
44
|
def sleep_time
|
45
|
-
config.sleep_time
|
45
|
+
config.sleep_time ||= 15
|
46
|
+
end
|
47
|
+
|
48
|
+
def threads_per_worker
|
49
|
+
config.threads_per_worker ||= 5
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
@@ -4,6 +4,7 @@ module Osbourne
|
|
4
4
|
module ExistingSubscriptions
|
5
5
|
attr_reader :existing_subscriptions
|
6
6
|
def existing_subscriptions_for(topic)
|
7
|
+
Osbourne.cache.delete("osbourne_existng_subs_for_#{topic.name}")
|
7
8
|
Osbourne.cache.fetch("osbourne_existng_subs_for_#{topic.name}") do
|
8
9
|
results = []
|
9
10
|
handled = Osbourne.lock.try_with_lock("osbourne_lock_subs_for_#{topic.name}") do
|
@@ -14,8 +15,6 @@ module Osbourne
|
|
14
15
|
sleep(0.5)
|
15
16
|
existing_subscriptions_for(topic)
|
16
17
|
end
|
17
|
-
# @existing_subscriptions ||= {}
|
18
|
-
# @existing_subscriptions[topic.name] ||=
|
19
18
|
end
|
20
19
|
|
21
20
|
def clear_subscriptions_for(topic)
|
data/lib/osbourne/launcher.rb
CHANGED
@@ -10,50 +10,61 @@ module Osbourne
|
|
10
10
|
def start!
|
11
11
|
Osbourne.logger.info("Launching Osbourne workers")
|
12
12
|
@stop = false
|
13
|
-
@threads =
|
14
|
-
|
13
|
+
@threads = global_polling_threads
|
14
|
+
end
|
15
|
+
|
16
|
+
def wait!
|
17
|
+
threads.map(&:join)
|
15
18
|
end
|
16
19
|
|
17
20
|
def stop
|
21
|
+
puts "Signal caught. Terminating workers..."
|
18
22
|
@stop = true
|
19
23
|
end
|
20
24
|
|
21
25
|
def stop!
|
26
|
+
puts "Signal caught. Terminating workers..."
|
22
27
|
@threads.each {|thr| Thread.kill(thr) }
|
23
28
|
end
|
24
29
|
|
25
|
-
def
|
30
|
+
def global_polling_threads
|
26
31
|
Osbourne::WorkerBase.descendants.map do |worker|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
Osbourne.logger.debug("Spawning thread for #{worker.name}")
|
33
|
+
Thread.new { poll(worker) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def worker_polling_threads(worker)
|
38
|
+
my_threads = []
|
39
|
+
worker.config[:threads].times do
|
40
|
+
my_threads << Thread.new { poll(worker) }
|
35
41
|
end
|
42
|
+
my_threads.each(&:join)
|
36
43
|
end
|
37
44
|
|
38
45
|
def poll(worker)
|
39
|
-
worker.polling_queue.
|
40
|
-
|
41
|
-
|
42
|
-
|
46
|
+
worker.polling_queue.poll(wait_time_seconds: worker.config[:max_wait_time],
|
47
|
+
max_number_of_messages: worker.config[:max_batch_size],
|
48
|
+
skip_delete: true) do |messages|
|
49
|
+
messages.map do |msg|
|
50
|
+
worker.polling_queue.delete_message(msg) if process(worker, Osbourne::Message.new(msg))
|
51
|
+
end
|
52
|
+
throw :stop_polling if @stop
|
53
|
+
end
|
43
54
|
end
|
44
55
|
|
45
56
|
private
|
46
57
|
|
47
58
|
def process(worker, message)
|
48
|
-
Osbourne.logger.info("[MSG] Worker: #{worker.
|
49
|
-
return unless message.valid?
|
59
|
+
Osbourne.logger.info("[MSG] Worker: #{worker.name} Valid: #{message.valid?} ID: #{message.id}")
|
60
|
+
return false unless message.valid? && Osbourne.lock.soft_lock(message.id)
|
50
61
|
|
51
|
-
|
52
|
-
|
53
|
-
message.delete if worker.process(message)
|
62
|
+
Osbourne.cache.fetch(message.id, ex: 24.hours) do
|
63
|
+
worker.new.process(message).tap {|_| Osbourne.lock.unlock(message.id) }
|
54
64
|
end
|
55
65
|
rescue Exception => ex # rubocop:disable Lint/RescueException
|
56
66
|
Osbourne.logger.error("[MSG ID: #{message.id}] #{ex.message}")
|
67
|
+
false
|
57
68
|
end
|
58
69
|
end
|
59
70
|
end
|
data/lib/osbourne/locks/base.rb
CHANGED
data/lib/osbourne/message.rb
CHANGED
@@ -2,54 +2,99 @@
|
|
2
2
|
|
3
3
|
require "osbourne"
|
4
4
|
|
5
|
+
##
|
6
|
+
# Represents a single message recieved by an Osbourne listener
|
7
|
+
|
5
8
|
module Osbourne
|
6
9
|
class Message
|
7
|
-
|
10
|
+
attr_reader :message
|
8
11
|
def initialize(message)
|
9
12
|
@message = message
|
10
13
|
end
|
11
14
|
|
15
|
+
##
|
16
|
+
#
|
17
|
+
# @return [Boolean] This will be `true` if the SNS message is also JSON
|
12
18
|
def json?
|
13
|
-
|
14
|
-
|
15
|
-
|
19
|
+
return false unless valid?
|
20
|
+
|
21
|
+
sns_body.is_a?(Hash)
|
16
22
|
end
|
17
23
|
|
24
|
+
##
|
25
|
+
# Does the message match the checksum? If not, the message has likely been mangled in transit
|
26
|
+
# @return [Boolean]
|
18
27
|
def valid?
|
19
|
-
message.md5_of_body == Digest::MD5.hexdigest(message.body)
|
28
|
+
@valid ||= message.md5_of_body == Digest::MD5.hexdigest(message.body)
|
20
29
|
end
|
21
30
|
|
31
|
+
##
|
32
|
+
# Osbourne has built-in message deduplication, but it's still a good idea to do some verification in a worker
|
33
|
+
#
|
34
|
+
# @return [String] The UUID of the recieved message
|
22
35
|
def id
|
23
36
|
message.message_id
|
24
37
|
end
|
25
38
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
39
|
+
##
|
40
|
+
# If the message was broadcast via SNS, the body will be available here.
|
41
|
+
#
|
42
|
+
# @return [Hash] If the message was JSON
|
43
|
+
# @return [String] If the message was not JSON
|
44
|
+
# @return [nil] If the message was not broadcast via SNS.
|
45
|
+
# @see #raw_body #raw_body for the raw body string
|
46
|
+
def message_body
|
47
|
+
sns_body
|
30
48
|
end
|
31
49
|
|
50
|
+
##
|
51
|
+
# Deletes the message from SQS to prevent retrying against another worker.
|
52
|
+
# Osbourne will automatically delete a message sent to a worker as long as the Osourbne::WorkerBase#process method returns `true`
|
53
|
+
|
32
54
|
def delete
|
33
55
|
message.delete
|
34
56
|
Osbourne.logger.info "[MSG ID: #{id}] Cleared"
|
35
57
|
end
|
36
58
|
|
59
|
+
##
|
60
|
+
# The SNS topic that this message was broadcast to
|
61
|
+
# @return [String] if the message was broadcast via SNS, this will be the topic
|
62
|
+
# @return [nil] if the message was not broadcast via SNS
|
37
63
|
def topic
|
38
|
-
|
64
|
+
return nil unless sns?
|
65
|
+
|
66
|
+
json_body["TopicArn"].split(":").last
|
39
67
|
end
|
40
68
|
|
69
|
+
##
|
70
|
+
# @return [String] The raw string representation of the message
|
41
71
|
def raw_body
|
42
72
|
message.body
|
43
73
|
end
|
44
74
|
|
75
|
+
##
|
76
|
+
# Just because a message was recieved via SQS, doesn't mean it was originally broadcast via SNS
|
77
|
+
# @return [Boolean] Was the message broadcast via SNS?
|
78
|
+
def sns?
|
79
|
+
json_body.is_a?(Hash) && (json_body.keys <=> %w[Message Type TopicArn MessageId]).zero?
|
80
|
+
end
|
81
|
+
|
45
82
|
private
|
46
83
|
|
47
|
-
def
|
48
|
-
|
84
|
+
def safe_json(content)
|
85
|
+
JSON.parse(content)
|
86
|
+
rescue JSON::ParserError
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
90
|
+
def sns_body
|
91
|
+
return unless sns?
|
92
|
+
|
93
|
+
@sns_body ||= safe_json(json_body["Message"]) || json_body["Message"]
|
49
94
|
end
|
50
95
|
|
51
|
-
def
|
52
|
-
|
96
|
+
def json_body
|
97
|
+
@json_body || safe_json(message.body)
|
53
98
|
end
|
54
99
|
end
|
55
100
|
end
|
data/lib/osbourne/runner.rb
CHANGED
@@ -4,11 +4,11 @@ module Osbourne
|
|
4
4
|
module Services
|
5
5
|
module QueueProvisioner
|
6
6
|
def provision_worker_queues
|
7
|
+
Dir[File.expand_path("app/workers/**/*.rb")].each {|f| require f }
|
7
8
|
return if Osbourne.test_mode?
|
8
9
|
|
9
10
|
Osbourne.logger.info "Workers found: #{Osbourne::WorkerBase.descendants.map(&:name).join(', ')}"
|
10
11
|
Osbourne.logger.info "Provisioning queues for all workers"
|
11
|
-
|
12
12
|
Osbourne::WorkerBase.descendants.each(&:provision)
|
13
13
|
end
|
14
14
|
end
|
@@ -3,34 +3,57 @@
|
|
3
3
|
module Osbourne
|
4
4
|
class Subscription
|
5
5
|
include Services::SNS
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
include Services::SQS
|
7
|
+
attr_reader :topics, :queue
|
8
|
+
def initialize(topics, queue)
|
9
|
+
@topics = topics
|
9
10
|
@queue = queue
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def arn
|
14
|
-
@arn ||= subscribe
|
11
|
+
subscribe_all
|
15
12
|
end
|
16
13
|
|
17
14
|
private
|
18
15
|
|
19
|
-
def
|
16
|
+
def subscribe_all
|
17
|
+
topics.each {|topic| subscribe(topic) }
|
18
|
+
set_queue_policy
|
19
|
+
end
|
20
|
+
|
21
|
+
def subscribe(topic)
|
20
22
|
Osbourne.logger.info("Checking subscription for #{queue.name} to #{topic.name}")
|
21
23
|
return if Osbourne.existing_subscriptions_for(topic).include? queue.arn
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
Osbourne.logger.info("Subscribing #{queue.name} to #{topic.name}")
|
26
|
+
sns.subscribe(topic_arn: topic.arn, protocol: "sqs", endpoint: queue.arn).subscription_arn
|
27
|
+
Osbourne.clear_subscriptions_for(topic)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_queue_policy
|
31
|
+
Osbourne.logger.info("Setting policy for #{queue.name} (attributes: #{build_policy})")
|
32
|
+
sqs.set_queue_attributes(queue_url: queue.url, attributes: build_policy)
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_policy
|
36
|
+
# The aws ruby SDK doesn't have a policy builder :{
|
37
|
+
{
|
38
|
+
"Policy" => {
|
39
|
+
"Version" => "2012-10-17",
|
40
|
+
"Id" => "Osbourne/#{queue.name}/SNSPolicy",
|
41
|
+
"Statement" => topics.map {|t| build_policy_statement(t) }
|
42
|
+
}.to_json
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def build_policy_statement(topic)
|
47
|
+
{
|
48
|
+
"Sid" => "Sid#{topic.name}",
|
49
|
+
"Effect" => "Allow",
|
50
|
+
"Principal" => {"AWS" => "*"},
|
51
|
+
"Action" => "SQS:SendMessage",
|
52
|
+
"Resource" => queue.arn,
|
53
|
+
"Condition" => {
|
54
|
+
"ArnEquals" => {"aws:SourceArn" => topic.arn}
|
55
|
+
}
|
56
|
+
}
|
34
57
|
end
|
35
58
|
end
|
36
59
|
end
|
data/lib/osbourne/topic.rb
CHANGED
@@ -26,7 +26,7 @@ module Osbourne
|
|
26
26
|
return if Osbourne.test_mode?
|
27
27
|
|
28
28
|
Osbourne.logger.debug "Ensuring topic `#{name}` exists"
|
29
|
-
Osbourne.cache.fetch("osbourne_existing_topic_arn_for_#{name}") do
|
29
|
+
Osbourne.cache.fetch("osbourne_existing_topic_arn_for_#{name}", ex: 1.minute) do
|
30
30
|
sns.create_topic(name: name).topic_arn
|
31
31
|
end
|
32
32
|
end
|
data/lib/osbourne/version.rb
CHANGED
data/lib/osbourne/worker_base.rb
CHANGED
@@ -21,7 +21,7 @@ module Osbourne
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def polling_queue
|
24
|
-
self.class.polling_queue
|
24
|
+
@polling_queue ||= self.class.polling_queue
|
25
25
|
end
|
26
26
|
|
27
27
|
class << self
|
@@ -36,24 +36,14 @@ module Osbourne
|
|
36
36
|
register_dead_letter_queue
|
37
37
|
end
|
38
38
|
|
39
|
-
def max_retry_count
|
40
|
-
Osbourne.max_retry_count
|
41
|
-
end
|
42
|
-
|
43
|
-
def dead_letter_queue_name
|
44
|
-
"#{config[:queue_name]}-dead-letter"
|
45
|
-
end
|
46
|
-
|
47
39
|
def dead_letter_queue
|
48
|
-
|
49
|
-
end
|
40
|
+
return unless config[:dead_letter]
|
50
41
|
|
51
|
-
|
52
|
-
default_queue_name
|
42
|
+
@dead_letter_queue ||= Queue.new(dead_letter_queue_name)
|
53
43
|
end
|
54
44
|
|
55
45
|
def polling_queue
|
56
|
-
|
46
|
+
Aws::SQS::QueuePoller.new(queue.url, client: Osbourne.sqs_client)
|
57
47
|
end
|
58
48
|
end
|
59
49
|
|
@@ -61,31 +51,46 @@ module Osbourne
|
|
61
51
|
private
|
62
52
|
|
63
53
|
def register_dead_letter_queue
|
64
|
-
return unless
|
54
|
+
return unless config[:dead_letter]
|
65
55
|
|
66
|
-
Osbourne.logger.info "#{self.class.name} dead letter queue: arn: [#{dead_letter_queue.arn}], max retries: #{max_retry_count}" # rubocop:disable Metrics/LineLength
|
67
|
-
queue.redrive(max_retry_count, dead_letter_queue.arn)
|
56
|
+
Osbourne.logger.info "#{self.class.name} dead letter queue: arn: [#{dead_letter_queue.arn}], max retries: #{config[:max_retry_count]}" # rubocop:disable Metrics/LineLength
|
57
|
+
queue.redrive(config[:max_retry_count], dead_letter_queue.arn)
|
68
58
|
end
|
69
59
|
|
70
60
|
def register
|
71
61
|
Osbourne.logger.info "#{self.class.name} subscriptions: Topics: [#{config[:topic_names].join(', ')}], Queue: [#{config[:queue_name]}]" # rubocop:disable Metrics/LineLength
|
72
62
|
self.topics = config[:topic_names].map {|tn| Topic.new(tn) }
|
73
63
|
self.queue = Queue.new(config[:queue_name])
|
74
|
-
self.subscriptions =
|
64
|
+
self.subscriptions = Subscription.new(topics, queue)
|
75
65
|
end
|
76
66
|
|
77
67
|
def default_queue_name
|
78
68
|
"#{name.underscore}_queue"
|
79
69
|
end
|
80
70
|
|
81
|
-
def
|
71
|
+
def dead_letter_queue_name
|
72
|
+
"#{config[:queue_name]}-dead-letter"
|
73
|
+
end
|
74
|
+
|
75
|
+
# rubocop:disable Metrics/ParameterLists
|
76
|
+
def worker_config(topics: [],
|
77
|
+
max_batch_size: 10,
|
78
|
+
max_wait: 10,
|
79
|
+
threads: Osbourne.threads_per_worker,
|
80
|
+
queue_name: default_queue_name,
|
81
|
+
dead_letter_queue: true,
|
82
|
+
max_retry_count: Osbourne.max_retry_count)
|
82
83
|
self.config = {
|
83
|
-
topic_names:
|
84
|
-
queue_name:
|
85
|
-
max_batch_size:
|
86
|
-
max_wait:
|
84
|
+
topic_names: Array(topics),
|
85
|
+
queue_name: queue_name,
|
86
|
+
max_batch_size: max_batch_size,
|
87
|
+
max_wait: max_wait,
|
88
|
+
threads: threads,
|
89
|
+
dead_letter: dead_letter_queue,
|
90
|
+
max_retry_count: max_retry_count
|
87
91
|
}
|
88
92
|
end
|
93
|
+
# rubocop:enable Metrics/ParameterLists
|
89
94
|
end
|
90
95
|
end
|
91
96
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: osbourne
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Allen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|