sqs_consumer 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 33a9b66357fd4dddc90544f4a29ede139eb6261c
4
+ data.tar.gz: f226ec7a85d66793784413a527ec2cd01329bae6
5
+ SHA512:
6
+ metadata.gz: 5de826551c5acbcedef8f8b26a554ff31b8ad8cd6b7dcabcb79b16074007940ef739569e5e455b4df1edb5588d40f351afb8852c04792c66d0bf1e147b823574
7
+ data.tar.gz: 4929afce3b702d05faf7bc4098d79f214c2cf8951fd08e66f14308cc49862e31a9ddd34114d97ce14ed354eec30125997c3e20f006ed86e2004fa10f56dde9b8
@@ -0,0 +1,3 @@
1
+ Gem.find_files("sqs_consumer/**/*.rb").each do |path|
2
+ require path.gsub(/\.rb$/, '')
3
+ end
@@ -0,0 +1,69 @@
1
+ require 'aws-sdk'
2
+ require 'paul_bunyan'
3
+
4
+ module SqsConsumer
5
+ class Consumer
6
+ RECEIVE_MESSAGES_DEFAULT = {max_number_of_messages: 1, wait_time_seconds: 1}
7
+
8
+ def initialize(endpoint:, region:, work_queue_name:, throttle_sleep_duration: 0.0,
9
+ receive_messages_options: {}, message_filter: nil, processor_action: nil, success_result: nil, error_callback: nil)
10
+ @client_config = {
11
+ endpoint: endpoint,
12
+ region: region
13
+ }
14
+ @work_queue_name = work_queue_name
15
+ @throttle_sleep_duration = throttle_sleep_duration
16
+ @logger = PaulBunyan.logger
17
+ @receive_messages_options = receive_messages_options.merge(RECEIVE_MESSAGES_DEFAULT)
18
+ @message_filter = message_filter
19
+ @processor_action = processor_action
20
+ @success_result = success_result
21
+ @error_callback = error_callback
22
+ @running = false
23
+ end
24
+
25
+ def should_process?(sqs_message)
26
+ @message_filter.nil? || @message_filter.call(sqs_message.message_attributes)
27
+ end
28
+
29
+ def stop
30
+ @running = false
31
+ end
32
+
33
+ def running?
34
+ @running
35
+ end
36
+
37
+ def create_queue
38
+ sqs_client = Aws::SQS::Client.new(@client_config)
39
+ sqs_queue_url = sqs_client.get_queue_url(queue_name: @work_queue_name)[:queue_url]
40
+ Aws::SQS::Queue.new(sqs_queue_url, sqs_client.config)
41
+ end
42
+
43
+ def run
44
+ @running = true
45
+ queue = create_queue
46
+
47
+ loop do
48
+ sqs_messages = queue.receive_messages(@receive_messages_options)
49
+
50
+ @logger.debug { "Got #{sqs_messages.size} messages from SQS." } unless sqs_messages.size == 0
51
+
52
+ sqs_messages.each do |sqs_message|
53
+ begin
54
+ if should_process? sqs_message
55
+ result = @processor_action&.call(sqs_message)
56
+ if @success_result.nil? || @success_result == result
57
+ sqs_message.delete
58
+ end
59
+ end
60
+ rescue => e
61
+ @error_callback&.call(e, sqs_message)
62
+ end
63
+ end
64
+ break unless running?
65
+ sleep @throttle_sleep_duration unless @throttle_sleep_duration.zero?
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,3 @@
1
+ module SqsConsumer
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sqs_consumer
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Augusto Callejas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: paul_bunyan
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: factory_girl
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.5'
69
+ description: An AWS SQS consumer library that consumes messages from a queue and processes
70
+ them
71
+ email: acallejas@instructure.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/sqs_consumer.rb
77
+ - lib/sqs_consumer/consumer.rb
78
+ - lib/sqs_consumer/version.rb
79
+ homepage: https://instructure.com
80
+ licenses:
81
+ - Nonstandard
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.5.1
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: AWS SQS consumer library
103
+ test_files: []