checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
---
2
2
SHA256:
3
- metadata.gz: ce355134cb50bbfb96cb7f2876bd90cba15dd05d5cc26c3a11199441d5ea3d4c
4
- data.tar.gz: 07aaa37d0dd6fa9c711633a1c8780d8c5aaa631bc27ee6e20eb06781def48383
3
+ metadata.gz: c2235f89e3779ac82843097dc2b527b3ca2dd10425fe362097d3c90217111ea1
4
+ data.tar.gz: 4606f78b6bdff27c6fe997d71167f7296562aa75ce63c73c725e9eb199d477ae
5
5
SHA512:
6
- metadata.gz: e08db0b838a919df8aeac0e8552f2b1db2d8aa6523fd0a2c92c0114836db9f2235a9223f7f6aa03be1d961603cd6eaaf4f025b73d86bd72badc6bcac4383fa68
7
- data.tar.gz: 185b630f77e2b62b96f1adac579d7fb8c26593a3d2cac981a06c9da1baff40abeca60fdb999d80177faf1349c43d635501f4c6aa0acb7fbbf782c85bc7e3f953
6
+ metadata.gz: 78dea8a722f457449f18c06b89be6126fcd40a57b2765a884166fc2eff721fe59a2517d9404cce2019018d6ddf500c67598f9cd4edefdf1113743ebb3065fbff
7
+ data.tar.gz: a234ee1da7eaab890ac9ce3e25a0289a45664d393f3a8be25b48c6e5c89b1a91bbe5ba955e9e8f519a701d47e060b683a74af0ebc94ecf24d311eb0c0ab34310
data/.github/workflows/ruby.yml ADDED
@@ -0,0 +1,20 @@
1
+ name: Ruby
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v1
12
+ - name: Set up Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Build and test with Rake
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [1.1.0] - 2019-07-16
8
+
9
+ ### Added
10
+ - Support for handling `SIGTERM` signal gracefully. Docker containers within Kubernetes can be terminated any time (the signal is sent to containers in a pod).
data/Gemfile.lock CHANGED
@@ -1,33 +1,31 @@
1
1
PATH
2
2
remote: .
3
3
specs:
4
- eventboss (1.0.3)
4
+ eventboss (1.1.2)
5
5
aws-sdk-sns (>= 1.1.0)
6
6
aws-sdk-sqs (>= 1.3.0)
7
- concurrent-ruby (~> 1.0, >= 1.0.5)
8
7
dotenv (~> 2.1, >= 2.1.1)
9
8
10
9
GEM
11
10
remote: https://rubygems.org/
12
11
specs:
13
12
aws-eventstream (1.0.3)
14
- aws-partitions (1.167.0)
15
- aws-sdk-core (3.53.1)
13
+ aws-partitions (1.210.0)
14
+ aws-sdk-core (3.66.0)
16
15
aws-eventstream (~> 1.0, >= 1.0.2)
17
16
aws-partitions (~> 1.0)
18
17
aws-sigv4 (~> 1.1)
19
18
jmespath (~> 1.0)
20
- aws-sdk-sns (1.16.0)
21
- aws-sdk-core (~> 3, >= 3.53.0)
19
+ aws-sdk-sns (1.19.0)
20
+ aws-sdk-core (~> 3, >= 3.61.1)
22
21
aws-sigv4 (~> 1.1)
23
- aws-sdk-sqs (1.16.0)
24
- aws-sdk-core (~> 3, >= 3.53.0)
22
+ aws-sdk-sqs (1.22.0)
23
+ aws-sdk-core (~> 3, >= 3.61.1)
25
24
aws-sigv4 (~> 1.1)
26
25
aws-sigv4 (1.1.0)
27
26
aws-eventstream (~> 1.0, >= 1.0.2)
28
- concurrent-ruby (1.1.5)
29
27
diff-lcs (1.3)
30
- dotenv (2.7.2)
28
+ dotenv (2.7.5)
31
29
jmespath (1.4.0)
32
30
rake (12.3.1)
33
31
rspec (3.7.0)
data/README.md CHANGED
@@ -102,24 +102,29 @@ AWS_SNS_ENDPOINT=http://localhost:4575 # when using with localstack
102
102
AWS_SQS_ENDPOINT=http://localhost:4576 # when using with localstack
103
103
```
104
104
105
- ### Logging and error handling
106
- To have more verbose logging, set `log_level` in configuration (default is `info`).
105
+ Be aware that `eventbus:deadletter:reload` rake task won't load your configuration if you are not using ENVs
106
+ in non Rails app, although to make it work you can extend your `Rakefile` with:
107
-
108
- Logger is used as default error handler. There is Airbrake handler available, to use it ensure you have `airbrake` or `airbrake-ruby` gem and add it to error handlers stack:
109
107
110
108
```ruby
111
- Eventboss.configure do |config|
112
- config.error_handlers << Eventboss::ErrorHandlers::Airbrake.new
109
+ load File.join(Gem::Specification.find_by_name('eventboss').gem_dir, 'lib', 'tasks', 'eventboss.rake')
110
+
111
+ task :environment do
112
+ # Load your environment
113
+ # Example:
114
+ # require_relative 'config/application'
113
115
end
116
+
117
+ task 'eventboss:deadletter:reload': :environment
114
118
```
115
119
116
- ### Polling strategy
120
+ ### Logging and error handling
121
+ To have more verbose logging, set `log_level` in configuration (default is `info`).
117
122
118
- Default is `Eventboss::Polling::Basic`. See `eventboss/polling/*` for other options. The configuration should be a `lambda` like so:
123
+ Logger is used as default error handler. There is Airbrake handler available, to use it ensure you have `airbrake` or `airbrake-ruby` gem and add it to error handlers stack:
119
124
120
125
```ruby
121
126
Eventboss.configure do |config|
122
- config.polling_strategy = lambda { |queues| Eventboss::Polling::TimedRoundRobin.new(queues) }
127
+ config.error_handlers << Eventboss::ErrorHandlers::Airbrake.new
123
128
end
124
129
```
125
130
data/eventboss.gemspec CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |spec|
20
20
spec.executables = ["eventboss"]
21
21
spec.require_paths = ["lib"]
22
22
23
- spec.add_dependency "concurrent-ruby", "~> 1.0", ">= 1.0.5"
24
23
spec.add_dependency "aws-sdk-sqs", ">= 1.3.0"
25
24
spec.add_dependency "aws-sdk-sns", ">= 1.1.0"
26
25
spec.add_dependency "dotenv", "~> 2.1", ">= 2.1.1"
data/lib/eventboss.rb CHANGED
@@ -1,6 +1,5 @@
1
1
require 'aws-sdk-sqs'
2
2
require 'aws-sdk-sns'
3
- require 'concurrent'
4
3
require 'securerandom'
5
4
6
5
require 'eventboss/version'
@@ -19,11 +18,8 @@ require 'eventboss/worker'
19
18
require 'eventboss/fetcher'
20
19
require 'eventboss/publisher'
21
20
require 'eventboss/sender'
22
- require 'eventboss/manager'
23
21
require 'eventboss/runner'
24
22
require 'eventboss/logger'
25
- require 'eventboss/polling/basic'
26
- require 'eventboss/polling/timed_round_robin'
27
23
require 'eventboss/extensions'
28
24
29
25
# For Rails use railtie, for plain Ruby apps use custom scripts loader
@@ -56,10 +52,6 @@ module Eventboss
56
52
)
57
53
end
58
54
59
- def listen
60
- Eventboss::Runner.start
61
- end
62
-
63
55
def launch
64
56
Eventboss::Runner.launch
65
57
end
data/lib/eventboss/configuration.rb CHANGED
@@ -11,7 +11,6 @@ module Eventboss
11
11
:eventboss_account_id,
12
12
:aws_access_key_id,
13
13
:aws_secret_access_key,
14
- :polling_strategy,
15
14
:aws_sns_endpoint,
16
15
:aws_sqs_endpoint,
17
16
:sns_sqs_name_infix
@@ -21,7 +20,11 @@ module Eventboss
21
20
end
22
21
23
22
def error_handlers
24
- defined_or_default('error_handlers') { [ErrorHandlers::Logger.new] }
23
+ defined_or_default('error_handlers') do
24
+ [ErrorHandlers::Logger.new].tap do |handlers|
25
+ handlers << ErrorHandlers::DbConnectionDropHandler.new if defined?(::ActiveRecord::StatementInvalid)
26
+ end
27
+ end
25
28
end
26
29
27
30
def concurrency
@@ -81,12 +84,6 @@ module Eventboss
81
84
defined_or_default('aws_sns_endpoint') { ENV['AWS_SNS_ENDPOINT'] }
82
85
end
83
86
84
- def polling_strategy
85
- defined_or_default('polling_strategy') do
86
- lambda { |queues| Eventboss::Polling::Basic.new(queues) }
87
- end
88
- end
89
-
90
87
def sns_sqs_name_infix
91
88
defined_or_default('sns_sqs_name_infix') { ENV['EVENTBUS_SQS_SNS_NAME_INFIX'] || 'eventboss' }
92
89
end
data/lib/eventboss/error_handlers/db_connection_drop_handler.rb ADDED
@@ -0,0 +1,11 @@
1
+ module Eventboss
2
+ module ErrorHandlers
3
+ class DbConnectionDropHandler
4
+ def call(exception, _context = {})
5
+ if exception.class == ::ActiveRecord::StatementInvalid
6
+ ::ActiveRecord::Base.clear_active_connections!
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
data/lib/eventboss/extensions.rb CHANGED
@@ -1,2 +1,3 @@
1
1
require 'eventboss/error_handlers/logger'
2
2
require 'eventboss/error_handlers/airbrake'
3
+ require 'eventboss/error_handlers/db_connection_drop_handler'
data/lib/eventboss/launcher.rb CHANGED
@@ -23,6 +23,7 @@ module Eventboss
23
23
24
24
def start
25
25
logger.info("Starting #{@workers.size} workers, #{@pollers.size} pollers", 'launcher')
26
+
26
27
@pollers.each(&:start)
27
28
@workers.each(&:start)
28
29
end
@@ -65,7 +66,7 @@ module Eventboss
65
66
private
66
67
67
68
def worker_count
68
- @options.fetch(:worker_count, [2, Concurrent.processor_count].max)
69
+ @options.fetch(:worker_count, 2)
69
70
end
70
71
71
72
def new_worker(id)
data/lib/eventboss/manager.rb DELETED
@@ -1,116 +0,0 @@
1
- module Eventboss
2
- class Manager
3
- MIN_DISPATCH_INTERVAL = 0.1
4
-
5
- def initialize(fetcher, polling_strategy, executor, queue_listeners, concurrency, error_handlers)
6
- @fetcher = fetcher
7
- @polling_strategy = polling_strategy
8
- @max_processors = concurrency
9
- @busy_processors = Concurrent::AtomicFixnum.new(0)
10
- @executor = executor
11
- @queue_listeners = queue_listeners
12
- @error_handlers = Array(error_handlers)
13
- end
14
-
15
- def start
16
- Eventboss::Logger.debug('Starting dispatch loop...')
17
-
18
- dispatch_loop
19
- end
20
-
21
- private
22
-
23
- def running?
24
- @executor.running?
25
- end
26
-
27
- def dispatch_loop
28
- return unless running?
29
-
30
- Eventboss::Logger.debug('Posting task to executor')
31
-
32
- @executor.post { dispatch }
33
- end
34
-
35
- def dispatch
36
- return unless running?
37
-
38
- if ready <= 0 || (queue = @polling_strategy.next_queue).nil?
39
- return sleep(MIN_DISPATCH_INTERVAL)
40
- end
41
- dispatch_single_messages(queue)
42
- rescue => ex
43
- handle_dispatch_error(ex)
44
- ensure
45
- Eventboss::Logger.debug('Ensuring dispatch loop')
46
- dispatch_loop
47
- end
48
-
49
- def busy
50
- @busy_processors.value
51
- end
52
-
53
- def ready
54
- @max_processors - busy
55
- end
56
-
57
- def processor_done(processor)
58
- Eventboss::Logger.info("Success", processor.jid)
59
- @busy_processors.decrement
60
- end
61
-
62
- def processor_error(processor, exception)
63
- @error_handlers.each { |handler| handler.call(exception, processor) }
64
- @busy_processors.decrement
65
- end
66
-
67
- def assign(queue, sqs_msg)
68
- return unless running?
69
-
70
- @busy_processors.increment
71
- processor = @queue_listeners[queue].new
72
-
73
- Concurrent::Promise.execute(executor: @executor) do
74
- body = JSON.parse(sqs_msg.body) rescue sqs_msg.body
75
- Eventboss::Logger.info("Started", processor.jid)
76
- processor.receive(body)
77
- end.then do
78
- cleanup(processor)
79
- postpone_if_needed(queue, sqs_msg, processor) || delete_from_queue(queue, sqs_msg)
80
- processor_done(processor)
81
- end.rescue do |e|
82
- cleanup(processor)
83
- postpone_if_needed(queue, sqs_msg, processor)
84
- processor_error(processor, e)
85
- end
86
- end
87
-
88
- def cleanup(_processor)
89
- if defined?(ActiveRecord)
90
- ::ActiveRecord::Base.clear_active_connections!
91
- end
92
- end
93
-
94
- def delete_from_queue(queue, sqs_msg)
95
- @fetcher.delete(queue, sqs_msg)
96
- end
97
-
98
- def postpone_if_needed(queue, sqs_msg, processor)
99
- return false unless processor.postponed_by
100
- @fetcher.change_message_visibility(queue, sqs_msg, processor.postponed_by)
101
- rescue => error
102
- Eventboss::Logger.info("Could not postpone message #{error.message}", processor.jid)
103
- end
104
-
105
- def dispatch_single_messages(queue)
106
- messages = @fetcher.fetch(queue, ready)
107
- @polling_strategy.messages_found(queue, messages.size)
108
- messages.each { |message| assign(queue, message) }
109
- end
110
-
111
- def handle_dispatch_error(ex)
112
- Eventboss::Logger.error("Error dispatching #{ex.message}")
113
- Process.kill('USR1', Process.pid)
114
- end
115
- end
116
- end
data/lib/eventboss/polling/basic.rb DELETED
@@ -1,68 +0,0 @@
1
- module Eventboss
2
- module Polling
3
- class Basic
4
- PAUSE_AFTER_EMPTY = 2 # seconds
5
-
6
- def initialize(queues, timer = Time)
7
- @queues = queues.to_a
8
- @timer = timer
9
- @paused_until = @queues.each_with_object(Hash.new) do |queue, hash|
10
- hash[queue] = @timer.at(0)
11
- end
12
-
13
- reset_next_queue
14
- end
15
-
16
- def next_queue
17
- next_active_queue
18
- end
19
-
20
- def messages_found(queue, messages_count)
21
- if messages_count == 0
22
- pause(queue)
23
- else
24
- reset_next_queue
25
- end
26
- end
27
-
28
- def active_queues
29
- @queues.reject { |q, _| queue_paused?(q) }
30
- end
31
-
32
- private
33
-
34
- def next_active_queue
35
- reset_next_queue if queues_unpaused_since?
36
-
37
- size = @queues.length
38
- size.times do
39
- queue = @queues[@next_queue_index]
40
- @next_queue_index = (@next_queue_index + 1) % size
41
- return queue unless queue_paused?(queue)
42
- end
43
-
44
- nil
45
- end
46
-
47
- def queues_unpaused_since?
48
- last = @last_unpause_check
49
- now = @last_unpause_check = @timer.now
50
-
51
- last && @paused_until.values.any? { |t| t > last && t <= now }
52
- end
53
-
54
- def reset_next_queue
55
- @next_queue_index = 0
56
- end
57
-
58
- def queue_paused?(queue)
59
- @paused_until[queue] > @timer.now
60
- end
61
-
62
- def pause(queue)
63
- return unless PAUSE_AFTER_EMPTY > 0
64
- @paused_until[queue] = @timer.now + PAUSE_AFTER_EMPTY
65
- end
66
- end
67
- end
68
- end
data/lib/eventboss/polling/timed_round_robin.rb DELETED
@@ -1,42 +0,0 @@
1
- module Eventboss
2
- module Polling
3
- class TimedRoundRobin
4
- PAUSE_AFTER_EMPTY = 2 # seconds
5
-
6
- def initialize(queues, timer = Time)
7
- @queues = queues.to_a
8
- @timer = timer
9
- @next_queue_index = 0
10
- @paused_until = @queues.each_with_object(Hash.new) do |queue, hash|
11
- hash[queue] = @timer.at(0)
12
- end
13
- end
14
-
15
- def next_queue
16
- size = @queues.length
17
- size.times do
18
- queue = @queues[@next_queue_index]
19
- @next_queue_index = (@next_queue_index + 1) % size
20
- return queue unless queue_paused?(queue)
21
- end
22
-
23
- nil
24
- end
25
-
26
- def messages_found(queue, messages_count)
27
- pause(queue) if messages_count == 0
28
- end
29
-
30
- private
31
-
32
- def queue_paused?(queue)
33
- @paused_until[queue] > @timer.now
34
- end
35
-
36
- def pause(queue)
37
- return unless PAUSE_AFTER_EMPTY > 0
38
- @paused_until[queue] = @timer.now + PAUSE_AFTER_EMPTY
39
- end
40
- end
41
- end
42
- end
data/lib/eventboss/railtie.rb CHANGED
@@ -1,5 +1,9 @@
1
1
class Eventboss::Railtie < Rails::Railtie
2
2
rake_tasks do
3
3
load 'tasks/eventboss.rake'
4
+
5
+ # Load rails environment before executing reload.
6
+ # It makes sure to load configuration file.
7
+ task 'eventboss:deadletter:reload': :environment
4
8
end
5
9
end
data/lib/eventboss/runner.rb CHANGED
@@ -1,5 +1,7 @@
1
1
module Eventboss
2
2
class Runner
3
+ extend Logging
4
+
3
5
class << self
4
6
def launch
5
7
queues = Eventboss::QueueListener.list
@@ -10,48 +12,37 @@ module Eventboss
10
12
11
13
launcher = Launcher.new(queues, client, worker_count: config.concurrency)
12
14
13
- self_read, _self_write = IO.pipe
15
+ self_read = setup_signals([:SIGTERM])
16
+
14
17
begin
15
18
launcher.start
16
- while (_readable_io = IO.select([self_read]))
19
+ handle_signals(self_read, launcher)
17
- # handle_signal(readable_io.first[0].gets.strip)
18
- end
19
20
rescue Interrupt
20
21
launcher.stop
21
22
exit 0
22
23
end
23
24
end
24
25
25
- def start
26
+ private
26
- configuration = Eventboss.configuration
27
27
28
- queue_listeners = Eventboss::QueueListener.list
29
- Eventboss::Instrumentation.add(queue_listeners)
28
+ def setup_signals(signals)
29
+ self_read, self_write = IO.pipe
30
- polling_strategy = configuration.polling_strategy.call(queue_listeners.keys)
31
30
32
- fetcher = Eventboss::Fetcher.new(configuration)
33
- executor = Concurrent.global_io_executor
31
+ signals.each do |signal|
32
+ trap signal do
33
+ self_write.puts signal
34
+ end
35
+ end
34
36
35
- manager = Eventboss::Manager.new(
36
- fetcher,
37
+ self_read
38
+ end
37
- polling_strategy,
38
- executor,
39
- queue_listeners,
40
- configuration.concurrency,
41
- configuration.error_handlers
42
- )
43
39
44
- manager.start
40
+ def handle_signals(self_read, launcher)
41
+ while readable_io = IO.select([self_read])
42
+ signal = readable_io.first[0].gets.strip
43
+ logger.info("Received #{ signal } signal, gracefully shutdowning...", 'runner')
45
44
46
- self_read, self_write = IO.pipe
45
+ launcher.stop
47
- begin
48
- while (readable_io = IO.select([self_read]))
49
- signal = readable_io.first[0].gets.strip
50
- # handle_signal(signal)
51
- end
52
- rescue Interrupt
53
- executor.shutdown
54
- executor.wait_for_termination
55
46
exit 0
56
47
end
57
48
end
data/lib/eventboss/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
module Eventboss
2
- VERSION = "1.0.4"
2
+ VERSION = "1.1.2"
3
3
end
data/lib/tasks/eventboss.rake CHANGED
@@ -3,8 +3,8 @@ require 'rake'
3
3
namespace :eventboss do
4
4
namespace :deadletter do
5
5
desc 'Reload deadletter queue'
6
- task :reload, [:event_name, :source_app, :max_messages] do |_, args|
7
- source_app = args[:source_app] ? "#{args[:source_app]}-" : ''
6
+ task :reload, [:event_name, :source_app, :max_messages] do |task, args|
7
+ source_app = args[:source_app]
8
8
event_name = args[:event_name]
9
9
10
10
# Zero means, fetch all messages
@@ -13,16 +13,22 @@ namespace :eventboss do
13
13
# Ensure we don't fetch more than 10 messages from SQS
14
14
batch_size = max_messages == 0 ? 10 : [10, max_messages].min
15
15
16
- abort 'At least event name should be passed as argument' unless event_name
16
+ abort "[#{task.name}] At least event name should be passed as argument" unless event_name
17
17
18
- queue_name = "#{Eventboss.configuration.eventboss_app_name}#{Eventboss.configuration.sns_sqs_name_infix}#{source_app}#{event_name}-#{Eventboss.env}"
18
+ queue_name = [
19
+ Eventboss.configuration.eventboss_app_name,
20
+ Eventboss.configuration.sns_sqs_name_infix,
21
+ source_app,
22
+ event_name,
23
+ Eventboss.env
24
+ ].compact.join('-')
25
+ puts "[#{task.name}] Reloading #{queue_name}-deadletter (max: #{ max_messages }, batch: #{ batch_size })"
19
26
queue = Eventboss::Queue.new("#{queue_name}-deadletter")
20
27
send_queue = Eventboss::Queue.new(queue_name)
21
28
22
- puts "Reloading deadletter (max: #{ max_messages }, batch: #{ batch_size })"
23
- puts " #{queue.url}"
24
- puts ' to'
29
+ puts "[#{task.name}] #{queue.url}"
30
+ puts "[#{task.name}] to"
31
+ puts "[#{task.name}] #{send_queue.url}"
25
- puts " #{send_queue.url}"
26
32
27
33
fetcher = Eventboss::Fetcher.new(Eventboss.configuration)
28
34
client = fetcher.client
@@ -32,7 +38,7 @@ namespace :eventboss do
32
38
break if messages.count.zero?
33
39
34
40
messages.each do |message|
35
- puts "Publishing message: #{message.body}"
41
+ puts "[#{task.name}] Publishing message: #{message.body}"
36
42
client.send_message(queue_url: send_queue.url, message_body: message.body)
37
43
fetcher.delete(queue, message)
38
44
metadata CHANGED
@@ -1,36 +1,16 @@
1
1
--- !ruby/object:Gem::Specification
2
2
name: eventboss
3
3
version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.2
5
5
platform: ruby
6
6
authors:
7
7
- AirHelp
8
8
autorequire:
9
9
bindir: bin
10
10
cert_chain: []
11
- date: 2019-07-02 00:00:00.000000000 Z
11
+ date: 2019-09-11 00:00:00.000000000 Z
12
12
dependencies:
13
13
- !ruby/object:Gem::Dependency
14
- name: concurrent-ruby
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.0.5
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '1.0'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 1.0.5
33
- - !ruby/object:Gem::Dependency
34
14
name: aws-sdk-sqs
35
15
requirement: !ruby/object:Gem::Requirement
36
16
requirements:
@@ -128,8 +108,10 @@ executables:
128
108
extensions: []
129
109
extra_rdoc_files: []
130
110
files:
111
+ - ".github/workflows/ruby.yml"
131
112
- ".gitignore"
132
113
- ".rspec"
114
+ - CHANGELOG.md
133
115
- Gemfile
134
116
- Gemfile.lock
135
117
- Guardfile
@@ -141,6 +123,7 @@ files:
141
123
- lib/eventboss.rb
142
124
- lib/eventboss/configuration.rb
143
125
- lib/eventboss/error_handlers/airbrake.rb
126
+ - lib/eventboss/error_handlers/db_connection_drop_handler.rb
144
127
- lib/eventboss/error_handlers/logger.rb
145
128
- lib/eventboss/extensions.rb
146
129
- lib/eventboss/fetcher.rb
@@ -150,9 +133,6 @@ files:
150
133
- lib/eventboss/logger.rb
151
134
- lib/eventboss/logging.rb
152
135
- lib/eventboss/long_poller.rb
153
- - lib/eventboss/manager.rb
154
- - lib/eventboss/polling/basic.rb
155
- - lib/eventboss/polling/timed_round_robin.rb
156
136
- lib/eventboss/publisher.rb
157
137
- lib/eventboss/queue.rb
158
138
- lib/eventboss/queue_listener.rb