eventboss 1.3.1 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +14 -14
- data/README.md +73 -12
- data/lib/eventboss.rb +27 -11
- data/lib/eventboss/configuration.rb +38 -22
- data/lib/eventboss/development_mode.rb +48 -0
- data/lib/eventboss/error_handlers/db_connection_not_established_handler.rb +11 -0
- data/lib/eventboss/error_handlers/logger.rb +1 -1
- data/lib/eventboss/extensions.rb +1 -0
- data/lib/eventboss/launcher.rb +1 -1
- data/lib/eventboss/listener.rb +5 -8
- data/lib/eventboss/long_poller.rb +1 -1
- data/lib/eventboss/middleware.rb +57 -0
- data/lib/eventboss/publisher.rb +7 -11
- data/lib/eventboss/queue.rb +36 -10
- data/lib/eventboss/queue_listener.rb +10 -14
- data/lib/eventboss/railtie.rb +2 -1
- data/lib/eventboss/runner.rb +8 -3
- data/lib/eventboss/sns_client.rb +28 -5
- data/lib/eventboss/topic.rb +28 -0
- data/lib/eventboss/unit_of_work.rb +9 -8
- data/lib/eventboss/version.rb +1 -1
- data/lib/eventboss/worker.rb +14 -4
- data/lib/generators/eventboss/listener/eventboss_listener.rb.erb +11 -0
- data/lib/generators/eventboss/listener/listener_generator.rb +20 -0
- data/lib/tasks/eventboss.rake +49 -9
- metadata +12 -6
- data/.github/workflows/ruby.yml +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e7d223c4834db900777f804ac21d03e023e952fa2df455d90768d845cc806e1
|
4
|
+
data.tar.gz: bcc796c5866521aeea6a33c2920ab1634956e5f3b5aeb367c81a17b657df19a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c84d52bb6344340c0cc17f8e7387db07e1a46fa1eb5d04b67d9d577e879ddc294fa71c150e0c3110244ee046a278e3fd43c855e3bd28f31e0477c01e8c5c8603
|
7
|
+
data.tar.gz: de26d5a46fe898d785edc6cd3a3436a75350907c10bf3ac3fd3d2bb9366c390776372dc9b39475cab57529df0c5aaf6df01c6ce1575043f5d947f806b8d056dc
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [1.4.0] - 2020-04-18
|
8
|
+
|
9
|
+
- Introduce server middlewares (#31)
|
10
|
+
|
7
11
|
## [1.1.0] - 2019-07-16
|
8
12
|
|
9
13
|
### Added
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
eventboss (1.
|
4
|
+
eventboss (1.4.1)
|
5
5
|
aws-sdk-sns (>= 1.1.0)
|
6
6
|
aws-sdk-sqs (>= 1.3.0)
|
7
7
|
dotenv (~> 2.1, >= 2.1.1)
|
@@ -9,25 +9,25 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
aws-eventstream (1.0
|
13
|
-
aws-partitions (1.
|
14
|
-
aws-sdk-core (3.
|
15
|
-
aws-eventstream (~> 1
|
16
|
-
aws-partitions (~> 1, >= 1.
|
12
|
+
aws-eventstream (1.1.0)
|
13
|
+
aws-partitions (1.350.0)
|
14
|
+
aws-sdk-core (3.104.3)
|
15
|
+
aws-eventstream (~> 1, >= 1.0.2)
|
16
|
+
aws-partitions (~> 1, >= 1.239.0)
|
17
17
|
aws-sigv4 (~> 1.1)
|
18
18
|
jmespath (~> 1.0)
|
19
|
-
aws-sdk-sns (1.
|
20
|
-
aws-sdk-core (~> 3, >= 3.
|
19
|
+
aws-sdk-sns (1.28.0)
|
20
|
+
aws-sdk-core (~> 3, >= 3.99.0)
|
21
21
|
aws-sigv4 (~> 1.1)
|
22
|
-
aws-sdk-sqs (1.
|
23
|
-
aws-sdk-core (~> 3, >= 3.
|
22
|
+
aws-sdk-sqs (1.30.0)
|
23
|
+
aws-sdk-core (~> 3, >= 3.99.0)
|
24
24
|
aws-sigv4 (~> 1.1)
|
25
|
-
aws-sigv4 (1.1
|
26
|
-
aws-eventstream (~> 1
|
25
|
+
aws-sigv4 (1.2.1)
|
26
|
+
aws-eventstream (~> 1, >= 1.0.2)
|
27
27
|
diff-lcs (1.3)
|
28
|
-
dotenv (2.7.
|
28
|
+
dotenv (2.7.6)
|
29
29
|
jmespath (1.4.0)
|
30
|
-
rake (
|
30
|
+
rake (13.0.1)
|
31
31
|
rspec (3.7.0)
|
32
32
|
rspec-core (~> 3.7.0)
|
33
33
|
rspec-expectations (~> 3.7.0)
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Eventboss
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/eventboss.svg)](https://badge.fury.io/rb/eventboss)
|
4
|
+
[![Build Status](https://travis-ci.org/AirHelp/eventboss.svg?branch=master)](https://travis-ci.org/AirHelp/eventboss)
|
4
5
|
|
5
6
|
AWS based Pub/Sub implementation in Ruby.
|
6
7
|
|
@@ -16,10 +17,10 @@ AWS based Pub/Sub implementation in Ruby.
|
|
16
17
|
* [x] support multiple environments in the same AWS account
|
17
18
|
* [x] pluggable error handlers (airbrake, newrelic)
|
18
19
|
* [x] utility tasks (deadletter reload)
|
19
|
-
* [x] localstack compatible
|
20
|
+
* [x] [localstack](https://github.com/localstack/localstack) compatible
|
20
21
|
* [x] rails support (preloads rails environment)
|
22
|
+
* [x] development mode (creates missing SNS/SQS on the fly)
|
21
23
|
* [ ] terraform pub/sub scripts
|
22
|
-
* [ ] development mode (creates missing SNS/SQS on the fly)
|
23
24
|
* [ ] alternative infrastructure (redis?, kafka?)
|
24
25
|
* [ ] message compression
|
25
26
|
* [ ] alternative serialization (protobuf)
|
@@ -93,15 +94,19 @@ end
|
|
93
94
|
Using ENVs:
|
94
95
|
|
95
96
|
```
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
EVENTBOSS_ACCOUNT_ID=12345676
|
98
|
+
EVENTBOSS_APP_NAME=application_name
|
99
|
+
EVENTBOSS_ENV=env_name # production/staging/test
|
100
|
+
EVENTBOSS_REGION=aws_region # i.e. eu-west-1
|
101
|
+
EVENTBOSS_CONCURRENCY=10 # default is 25
|
101
102
|
|
102
103
|
AWS_SNS_ENDPOINT=http://localhost:4575 # when using with localstack
|
103
104
|
AWS_SQS_ENDPOINT=http://localhost:4576 # when using with localstack
|
104
105
|
```
|
106
|
+
Use fixed account ID for localstack setup:
|
107
|
+
```
|
108
|
+
EVENTBUS_ACCOUNT_ID=000000000000
|
109
|
+
```
|
105
110
|
|
106
111
|
Be aware that `eventbus:deadletter:reload` rake task won't load your configuration if you are not using ENVs
|
107
112
|
in non Rails app, although to make it work you can extend your `Rakefile` with:
|
@@ -128,12 +133,12 @@ listeners:
|
|
128
133
|
exclude:
|
129
134
|
- OtherListener # When include option is not set it will run all listeners except listed here (OtherListener). When include is set it will run only included (but not excluded) listeners.
|
130
135
|
```
|
131
|
-
|
136
|
+
YAML config is optional and by default is loaded from `'./config/eventboss.yml'`.
|
132
137
|
You can also pass config path as an argument:
|
133
|
-
```
|
138
|
+
```sh
|
134
139
|
eventboss -C my/custom/path/to/config.yml
|
135
140
|
```
|
136
|
-
|
141
|
+
YAML config content is merged to configuration last, which means it overwrites ENVs and `.configure`.
|
137
142
|
|
138
143
|
### Logging and error handling
|
139
144
|
To have more verbose logging, set `log_level` in configuration (default is `info`).
|
@@ -146,9 +151,65 @@ Eventboss.configure do |config|
|
|
146
151
|
end
|
147
152
|
```
|
148
153
|
|
154
|
+
### Middlewares
|
155
|
+
|
156
|
+
Server middlewares intercept the execution of your `Listeners`. You can use to extract and run common functions on every message received.
|
157
|
+
|
158
|
+
Define a middleware in the following way:
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
class LogMiddleware < Eventboss::Middleware::Base
|
162
|
+
def call(_work)
|
163
|
+
yield
|
164
|
+
logger.debug 'finished with success'
|
165
|
+
rescue StandardError => _error
|
166
|
+
logger.error 'finished with error'
|
167
|
+
raise
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def logger
|
173
|
+
@logger ||= @options.fetch(:logger)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
```
|
177
|
+
|
178
|
+
And configure your logger as such:
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
Eventboss.configure do |config|
|
182
|
+
config.server_middleware.add LogMiddleware, logger: Logger.new
|
183
|
+
end
|
184
|
+
```
|
185
|
+
|
186
|
+
## Development mode
|
187
|
+
|
188
|
+
In the _development mode_ you don't need to create the infrastructure required by the application - Eventboss will take care of this.
|
189
|
+
|
190
|
+
It works on AWS and [localstack](https://github.com/localstack/localstack).
|
191
|
+
|
192
|
+
Following resources are created:
|
193
|
+
* SNS topics - created when application starts and when message is published
|
194
|
+
* SQS queues (with SendMessage policy) - created when application starts
|
195
|
+
* subscriptions for topics and queues - created when application starts
|
196
|
+
|
197
|
+
Just enable it via environment variable...
|
198
|
+
```
|
199
|
+
EVENTBOSS_DEVELOPMENT_MODE=true
|
200
|
+
```
|
201
|
+
use fixed account ID for localstack setup...
|
202
|
+
```
|
203
|
+
EVENTBUS_ACCOUNT_ID=000000000000 # or set it via YAML
|
204
|
+
```
|
205
|
+
...and you're good to go:
|
206
|
+
```shell script
|
207
|
+
bundle exec eventboss
|
208
|
+
```
|
209
|
+
|
149
210
|
## Topics & Queues naming convention
|
150
211
|
|
151
|
-
The SNSes should be
|
212
|
+
The SNSes should be named in the following pattern:
|
152
213
|
```
|
153
214
|
eventboss-{src_app_name}-{event_name}-{environment}
|
154
215
|
```
|
@@ -158,7 +219,7 @@ i.e.
|
|
158
219
|
eventboss-srcapp-transaction_change-staging
|
159
220
|
```
|
160
221
|
|
161
|
-
The corresponding SQSes should be
|
222
|
+
The corresponding SQSes should be named like:
|
162
223
|
```
|
163
224
|
{dest_app_name}-eventboss-{src_app_name}-{event_name}-{environment}
|
164
225
|
{dest_app_name}-eventboss-{src_app_name}-{event_name}-{environment}-deadletter
|
data/lib/eventboss.rb
CHANGED
@@ -13,13 +13,16 @@ require 'eventboss/logging'
|
|
13
13
|
require 'eventboss/safe_thread'
|
14
14
|
require 'eventboss/launcher'
|
15
15
|
require 'eventboss/long_poller'
|
16
|
+
require 'eventboss/middleware'
|
16
17
|
require 'eventboss/unit_of_work'
|
17
18
|
require 'eventboss/worker'
|
18
19
|
require 'eventboss/fetcher'
|
19
20
|
require 'eventboss/publisher'
|
20
21
|
require 'eventboss/sender'
|
22
|
+
require 'eventboss/topic'
|
21
23
|
require 'eventboss/runner'
|
22
24
|
require 'eventboss/extensions'
|
25
|
+
require 'eventboss/development_mode'
|
23
26
|
|
24
27
|
# For Rails use railtie, for plain Ruby apps use custom scripts loader
|
25
28
|
if defined?(Rails)
|
@@ -33,21 +36,34 @@ module Eventboss
|
|
33
36
|
|
34
37
|
class << self
|
35
38
|
def publisher(event_name, opts = {})
|
36
|
-
|
39
|
+
sns_client = configuration.sns_client
|
40
|
+
|
41
|
+
if configuration.development_mode?
|
42
|
+
source_app = configuration.eventboss_app_name unless opts[:generic]
|
43
|
+
topic_name = Topic.build_name(event_name: event_name, source_app: source_app)
|
44
|
+
sns_client.create_topic(name: topic_name)
|
45
|
+
end
|
46
|
+
|
47
|
+
Publisher.new(event_name, sns_client, configuration, opts)
|
37
48
|
end
|
38
49
|
|
39
|
-
def sender(event_name,
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
50
|
+
def sender(event_name, destination, options = {})
|
51
|
+
source_app = configuration.eventboss_app_name unless options[:generic]
|
52
|
+
queue = Queue.build(
|
53
|
+
destination: destination,
|
54
|
+
source_app: source_app,
|
55
|
+
event_name: event_name,
|
56
|
+
env: env
|
46
57
|
)
|
58
|
+
sqs_client = configuration.sqs_client
|
59
|
+
|
60
|
+
if configuration.development_mode?
|
61
|
+
sqs_client.create_queue(queue_name: queue.name)
|
62
|
+
end
|
47
63
|
|
48
64
|
Sender.new(
|
49
|
-
client:
|
50
|
-
queue:
|
65
|
+
client: sqs_client,
|
66
|
+
queue: queue
|
51
67
|
)
|
52
68
|
end
|
53
69
|
|
@@ -56,7 +72,7 @@ module Eventboss
|
|
56
72
|
end
|
57
73
|
|
58
74
|
def env
|
59
|
-
@env ||= ENV['EVENTBUS_ENV'] || ENV['RAILS_ENV'] || ENV['RACK_ENV']
|
75
|
+
@env ||= ENV['EVENTBOSS_ENV'] || ENV['EVENTBUS_ENV'] || ENV['RAILS_ENV'] || ENV['RACK_ENV']
|
60
76
|
end
|
61
77
|
|
62
78
|
def configure
|
@@ -1,43 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eventboss
|
2
4
|
class Configuration
|
3
5
|
OPTS_ALLOWED_IN_CONFIG_FILE = %i[
|
4
6
|
concurrency
|
5
7
|
sns_sqs_name_infix
|
6
8
|
listeners
|
7
|
-
]
|
9
|
+
].freeze
|
8
10
|
|
9
11
|
attr_writer :raise_on_missing_configuration,
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
:error_handlers,
|
13
|
+
:concurrency,
|
14
|
+
:log_level,
|
15
|
+
:logger,
|
16
|
+
:sns_client,
|
17
|
+
:sqs_client,
|
18
|
+
:eventboss_region,
|
19
|
+
:eventboss_app_name,
|
20
|
+
:eventboss_account_id,
|
21
|
+
:aws_access_key_id,
|
22
|
+
:aws_secret_access_key,
|
23
|
+
:aws_sns_endpoint,
|
24
|
+
:aws_sqs_endpoint,
|
25
|
+
:sns_sqs_name_infix,
|
26
|
+
:listeners
|
25
27
|
|
26
28
|
|
27
29
|
def raise_on_missing_configuration
|
28
|
-
defined_or_default('raise_on_missing_configuration') { ENV['EVENTBUS_RAISE_ON_MISSING_CONFIGURATION']&.downcase == 'true' }
|
30
|
+
defined_or_default('raise_on_missing_configuration') { (ENV['EVENTBOSS_RAISE_ON_MISSING_CONFIGURATION'] || ENV['EVENTBUS_RAISE_ON_MISSING_CONFIGURATION'])&.downcase == 'true' }
|
29
31
|
end
|
30
32
|
|
31
33
|
def error_handlers
|
32
34
|
defined_or_default('error_handlers') do
|
33
35
|
[ErrorHandlers::Logger.new].tap do |handlers|
|
34
36
|
handlers << ErrorHandlers::DbConnectionDropHandler.new if defined?(::ActiveRecord::StatementInvalid)
|
37
|
+
handlers << ErrorHandlers::DbConnectionNotEstablishedHandler.new if defined?(::ActiveRecord::ConnectionNotEstablished)
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
42
|
def concurrency
|
40
|
-
defined_or_default('concurrency')
|
43
|
+
defined_or_default('concurrency') do
|
44
|
+
concurrency = ENV['EVENTBOSS_CONCURRENCY'] || ENV['EVENTBUS_CONCURRENCY']
|
45
|
+
concurrency ? concurrency.to_i : 25
|
46
|
+
end
|
41
47
|
end
|
42
48
|
|
43
49
|
def log_level
|
@@ -72,15 +78,15 @@ module Eventboss
|
|
72
78
|
end
|
73
79
|
|
74
80
|
def eventboss_region
|
75
|
-
defined_or_default('eventboss_region') { ENV['EVENTBUS_REGION'] }
|
81
|
+
defined_or_default('eventboss_region') { ENV['EVENTBOSS_REGION'] || ENV['EVENTBUS_REGION'] }
|
76
82
|
end
|
77
83
|
|
78
84
|
def eventboss_app_name
|
79
|
-
defined_or_default('eventboss_app_name') { ENV['EVENTBUS_APP_NAME'] }
|
85
|
+
defined_or_default('eventboss_app_name') { ENV['EVENTBOSS_APP_NAME'] || ENV['EVENTBUS_APP_NAME'] }
|
80
86
|
end
|
81
87
|
|
82
88
|
def eventboss_account_id
|
83
|
-
defined_or_default('eventboss_account_id') { ENV['EVENTBUS_ACCOUNT_ID'] }
|
89
|
+
defined_or_default('eventboss_account_id') { ENV['EVENTBOSS_ACCOUNT_ID'] || ENV['EVENTBUS_ACCOUNT_ID'] }
|
84
90
|
end
|
85
91
|
|
86
92
|
def aws_access_key_id
|
@@ -100,13 +106,23 @@ module Eventboss
|
|
100
106
|
end
|
101
107
|
|
102
108
|
def sns_sqs_name_infix
|
103
|
-
defined_or_default('sns_sqs_name_infix') { ENV['EVENTBUS_SQS_SNS_NAME_INFIX'] || 'eventboss' }
|
109
|
+
defined_or_default('sns_sqs_name_infix') { ENV['EVENTBOSS_SQS_SNS_NAME_INFIX'] || ENV['EVENTBUS_SQS_SNS_NAME_INFIX'] || 'eventboss' }
|
104
110
|
end
|
105
111
|
|
106
112
|
def listeners
|
107
113
|
defined_or_default('listeners') { {} }
|
108
114
|
end
|
109
115
|
|
116
|
+
def development_mode?
|
117
|
+
defined_or_default('development_mode') do
|
118
|
+
(ENV['EVENTBOSS_DEVELOPMENT_MODE']&.downcase || ENV['EVENTBUS_DEVELOPMENT_MODE'])&.downcase == 'true'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def server_middleware
|
123
|
+
@server_middleware ||= Middleware::Chain.new
|
124
|
+
end
|
125
|
+
|
110
126
|
private
|
111
127
|
|
112
128
|
def defined_or_default(variable_name)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Eventboss
|
4
|
+
module DevelopmentMode
|
5
|
+
extend Logging
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def setup_infrastructure(queues)
|
9
|
+
sns_client = Eventboss.configuration.sns_client
|
10
|
+
sqs_client = Eventboss.configuration.sqs_client
|
11
|
+
|
12
|
+
queues.each do |queue, listener|
|
13
|
+
topic_name = Eventboss::Topic.build_name(**listener.options)
|
14
|
+
logger.info('development-mode') { "Creating topic #{topic_name}..." }
|
15
|
+
topic = sns_client.create_topic(name: topic_name)
|
16
|
+
|
17
|
+
logger.info('development-mode') { "Creating queue #{queue.name}..." }
|
18
|
+
sqs_client.create_queue(queue_name: queue.name)
|
19
|
+
|
20
|
+
logger.info('development-mode') { "Setting up queue #{queue.name} policy..." }
|
21
|
+
policy = queue_policy(queue.arn, topic.topic_arn)
|
22
|
+
sqs_client.set_queue_attributes(queue_url: queue.url, attributes: { Policy: policy.to_json })
|
23
|
+
|
24
|
+
logger.info('development-mode') { "Creating subscription for topic #{topic.topic_arn} and #{queue.arn}..." }
|
25
|
+
sns_client.create_subscription(topic_arn: topic.topic_arn, queue_arn: queue.arn)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def queue_policy(queue_arn, topic_arn)
|
30
|
+
{
|
31
|
+
"Version": "2012-10-17",
|
32
|
+
"Statement": [{
|
33
|
+
"Sid": "queue-policy-#{queue_arn}-#{topic_arn}",
|
34
|
+
"Effect": "Allow",
|
35
|
+
"Principal": "*",
|
36
|
+
"Action": ["SQS:SendMessage"],
|
37
|
+
"Resource": "#{queue_arn}",
|
38
|
+
"Condition": {
|
39
|
+
"ArnEquals": {
|
40
|
+
"aws:SourceArn": "#{topic_arn}"
|
41
|
+
}
|
42
|
+
}
|
43
|
+
}]
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Eventboss
|
2
|
+
module ErrorHandlers
|
3
|
+
class DbConnectionNotEstablishedHandler
|
4
|
+
def call(exception, _context = {})
|
5
|
+
if exception.class == ::ActiveRecord::ConnectionNotEstablished
|
6
|
+
::ActiveRecord::Base.connection.reconnect!
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -6,7 +6,7 @@ module Eventboss
|
|
6
6
|
notice[:jid] = notice[:processor].jid if notice[:processor]
|
7
7
|
notice[:processor] = notice[:processor].class.to_s if notice[:processor]
|
8
8
|
Eventboss.logger.error(notice) do
|
9
|
-
"Failure processing request #{exception.message}"
|
9
|
+
"Failure processing request: #{exception.message}"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/eventboss/extensions.rb
CHANGED
data/lib/eventboss/launcher.rb
CHANGED
data/lib/eventboss/listener.rb
CHANGED
@@ -17,15 +17,12 @@ module Eventboss
|
|
17
17
|
end
|
18
18
|
|
19
19
|
module ClassMethods
|
20
|
-
|
21
|
-
source_app = opts[:source_app] ? "#{opts[:source_app]}-" : ""
|
22
|
-
event_name = opts[:event_name]
|
23
|
-
destination_app = opts[:destination_app]
|
20
|
+
attr_reader :options
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
def eventboss_options(options)
|
23
|
+
@options = options.compact
|
24
|
+
|
25
|
+
ACTIVE_LISTENERS[@options] = self
|
29
26
|
end
|
30
27
|
end
|
31
28
|
end
|
@@ -44,7 +44,7 @@ module Eventboss
|
|
44
44
|
def fetch_and_dispatch
|
45
45
|
fetch_messages.each do |message|
|
46
46
|
logger.debug(id) { "enqueueing message #{message.message_id}" }
|
47
|
-
@bus << UnitOfWork.new(queue, listener, message)
|
47
|
+
@bus << UnitOfWork.new(@client, queue, listener, message)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Eventboss
|
2
|
+
module Middleware
|
3
|
+
class Chain
|
4
|
+
attr_reader :entries
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@entries = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def add(klass, options = {})
|
11
|
+
@entries << Entry.new(klass, options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def invoke(*args)
|
15
|
+
chain = @entries.map(&:build).reverse!
|
16
|
+
|
17
|
+
invoke_lambda = lambda do
|
18
|
+
if (mid = chain.pop)
|
19
|
+
mid.call(*args, &invoke_lambda)
|
20
|
+
else
|
21
|
+
yield
|
22
|
+
end
|
23
|
+
end
|
24
|
+
invoke_lambda.call
|
25
|
+
end
|
26
|
+
|
27
|
+
def clear
|
28
|
+
@entries.clear
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Base
|
33
|
+
attr_reader :options
|
34
|
+
|
35
|
+
def initialize(options)
|
36
|
+
@options = options
|
37
|
+
end
|
38
|
+
|
39
|
+
def call
|
40
|
+
raise 'Not implemented'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Entry
|
45
|
+
attr_reader :klass, :options
|
46
|
+
|
47
|
+
def initialize(klass, options)
|
48
|
+
@klass = klass
|
49
|
+
@options = options
|
50
|
+
end
|
51
|
+
|
52
|
+
def build
|
53
|
+
@klass.new(options)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/eventboss/publisher.rb
CHANGED
@@ -1,32 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eventboss
|
2
4
|
class Publisher
|
3
5
|
def initialize(event_name, sns_client, configuration, opts = {})
|
4
6
|
@event_name = event_name
|
5
7
|
@sns_client = sns_client
|
6
8
|
@configuration = configuration
|
7
|
-
@
|
9
|
+
@source = configuration.eventboss_app_name unless opts[:generic]
|
8
10
|
end
|
9
11
|
|
10
12
|
def publish(payload)
|
11
|
-
|
13
|
+
topic_arn = Topic.build_arn(event_name: event_name, source_app: source)
|
14
|
+
sns_client.publish(
|
12
15
|
topic_arn: topic_arn,
|
13
16
|
message: json_payload(payload)
|
14
|
-
|
17
|
+
)
|
15
18
|
end
|
16
19
|
|
17
20
|
private
|
18
21
|
|
19
|
-
attr_reader :event_name, :sns_client, :configuration
|
22
|
+
attr_reader :event_name, :sns_client, :configuration, :source
|
20
23
|
|
21
24
|
def json_payload(payload)
|
22
25
|
payload.is_a?(String) ? payload : payload.to_json
|
23
26
|
end
|
24
|
-
|
25
|
-
def topic_arn
|
26
|
-
src_selector = @generic ? "" : "-#{configuration.eventboss_app_name}"
|
27
|
-
|
28
|
-
"arn:aws:sns:#{configuration.eventboss_region}:#{configuration.eventboss_account_id}:\
|
29
|
-
#{Eventboss.configuration.sns_sqs_name_infix}#{src_selector}-#{event_name}-#{Eventboss.env}"
|
30
|
-
end
|
31
27
|
end
|
32
28
|
end
|
data/lib/eventboss/queue.rb
CHANGED
@@ -1,21 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eventboss
|
2
4
|
class Queue
|
3
5
|
include Comparable
|
4
6
|
attr_reader :name
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
class << self
|
9
|
+
def build_name(destination:, event_name:, env:, source_app: nil)
|
10
|
+
[
|
11
|
+
destination,
|
12
|
+
Eventboss.configuration.sns_sqs_name_infix,
|
13
|
+
source_app,
|
14
|
+
event_name,
|
15
|
+
env
|
16
|
+
].compact.join('-')
|
17
|
+
end
|
13
18
|
|
14
|
-
|
19
|
+
def build(destination:, event_name:, env:, source_app: nil)
|
20
|
+
name = build_name(
|
21
|
+
destination: destination,
|
22
|
+
event_name: event_name,
|
23
|
+
env: env,
|
24
|
+
source_app: source_app
|
25
|
+
)
|
26
|
+
Queue.new(name)
|
27
|
+
end
|
15
28
|
end
|
16
29
|
|
17
|
-
def initialize(name
|
18
|
-
@client = configuration.sqs_client
|
30
|
+
def initialize(name)
|
31
|
+
@client = Eventboss.configuration.sqs_client
|
19
32
|
@name = name
|
20
33
|
end
|
21
34
|
|
@@ -23,6 +36,15 @@ module Eventboss
|
|
23
36
|
@url ||= client.get_queue_url(queue_name: name).queue_url
|
24
37
|
end
|
25
38
|
|
39
|
+
def arn
|
40
|
+
[
|
41
|
+
'arn:aws:sqs',
|
42
|
+
Eventboss.configuration.eventboss_region,
|
43
|
+
Eventboss.configuration.eventboss_account_id,
|
44
|
+
name
|
45
|
+
].join(':')
|
46
|
+
end
|
47
|
+
|
26
48
|
def <=>(another_queue)
|
27
49
|
name <=> another_queue&.name
|
28
50
|
end
|
@@ -35,6 +57,10 @@ module Eventboss
|
|
35
57
|
name.hash
|
36
58
|
end
|
37
59
|
|
60
|
+
def to_s
|
61
|
+
"<Eventboss::Queue: #{name}>"
|
62
|
+
end
|
63
|
+
|
38
64
|
private
|
39
65
|
|
40
66
|
attr_reader :client
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Eventboss
|
2
2
|
class QueueListener
|
3
3
|
class << self
|
4
|
-
def select(include
|
4
|
+
def select(include: nil, exclude: nil)
|
5
5
|
listeners = list.values.map(&:name)
|
6
6
|
|
7
7
|
listeners &= include if include
|
@@ -13,19 +13,15 @@ module Eventboss
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def list
|
16
|
-
|
17
|
-
|
18
|
-
Eventboss
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
),
|
26
|
-
opts[:listener]
|
27
|
-
]
|
28
|
-
end]
|
16
|
+
Eventboss::Listener::ACTIVE_LISTENERS.each_with_object({}) do |(eventboss_options, listener), queue_listeners|
|
17
|
+
queue = Eventboss::Queue.build(
|
18
|
+
destination: eventboss_options[:destination_app] || Eventboss.configuration.eventboss_app_name,
|
19
|
+
source_app: eventboss_options[:source_app],
|
20
|
+
event_name: eventboss_options[:event_name],
|
21
|
+
env: Eventboss.env
|
22
|
+
)
|
23
|
+
queue_listeners[queue] = listener
|
24
|
+
end
|
29
25
|
end
|
30
26
|
end
|
31
27
|
end
|
data/lib/eventboss/railtie.rb
CHANGED
@@ -2,8 +2,9 @@ class Eventboss::Railtie < Rails::Railtie
|
|
2
2
|
rake_tasks do
|
3
3
|
load 'tasks/eventboss.rake'
|
4
4
|
|
5
|
-
# Load rails environment before executing reload.
|
5
|
+
# Load rails environment before executing reload and purge.
|
6
6
|
# It makes sure to load configuration file.
|
7
7
|
task 'eventboss:deadletter:reload': :environment
|
8
|
+
task 'eventboss:deadletter:purge': :environment
|
8
9
|
end
|
9
10
|
end
|
data/lib/eventboss/runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eventboss
|
2
4
|
class Runner
|
3
5
|
extend Logging
|
@@ -17,8 +19,11 @@ module Eventboss
|
|
17
19
|
|
18
20
|
self_read = setup_signals([:SIGTERM])
|
19
21
|
|
20
|
-
logger.info('Active
|
21
|
-
logger.info(
|
22
|
+
logger.info('Active listeners:')
|
23
|
+
queues.each { |queue, listener| logger.info("#{queue}: #{listener}") }
|
24
|
+
|
25
|
+
Eventboss::DevelopmentMode.setup_infrastructure(queues) if config.development_mode?
|
26
|
+
|
22
27
|
begin
|
23
28
|
launcher.start
|
24
29
|
handle_signals(self_read, launcher)
|
@@ -45,7 +50,7 @@ module Eventboss
|
|
45
50
|
def handle_signals(self_read, launcher)
|
46
51
|
while readable_io = IO.select([self_read])
|
47
52
|
signal = readable_io.first[0].gets.strip
|
48
|
-
logger.info('runner') { "Received #{
|
53
|
+
logger.info('runner') { "Received #{signal} signal, gracefully shutting down..." }
|
49
54
|
|
50
55
|
launcher.stop
|
51
56
|
exit 0
|
data/lib/eventboss/sns_client.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Eventboss
|
2
|
-
class NotConfigured < StandardError;
|
4
|
+
class NotConfigured < StandardError;
|
5
|
+
end
|
3
6
|
|
4
7
|
class SnsClient
|
5
8
|
def initialize(configuration)
|
@@ -10,10 +13,31 @@ module Eventboss
|
|
10
13
|
backend.publish(payload)
|
11
14
|
end
|
12
15
|
|
16
|
+
def create_topic(name:)
|
17
|
+
backend.create_topic(name: name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_subscription(topic_arn:, queue_arn:)
|
21
|
+
subscription = backend.subscribe(
|
22
|
+
topic_arn: topic_arn,
|
23
|
+
endpoint: queue_arn,
|
24
|
+
protocol: 'sqs'
|
25
|
+
)
|
26
|
+
set_raw_message_delivery(subscription)
|
27
|
+
end
|
28
|
+
|
13
29
|
private
|
14
30
|
|
15
31
|
attr_reader :configuration
|
16
32
|
|
33
|
+
def set_raw_message_delivery(subscription)
|
34
|
+
backend.set_subscription_attributes(
|
35
|
+
subscription_arn: subscription.subscription_arn,
|
36
|
+
attribute_name: 'RawMessageDelivery',
|
37
|
+
attribute_value: 'true'
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
17
41
|
def backend
|
18
42
|
if configured?
|
19
43
|
options = {
|
@@ -26,11 +50,10 @@ module Eventboss
|
|
26
50
|
if configuration.aws_sns_endpoint
|
27
51
|
options[:endpoint] = configuration.aws_sns_endpoint
|
28
52
|
end
|
29
|
-
|
30
|
-
|
31
|
-
)
|
53
|
+
|
54
|
+
Aws::SNS::Client.new(options)
|
32
55
|
elsif configuration.raise_on_missing_configuration
|
33
|
-
raise NotConfigured, 'Eventboss is not configured'
|
56
|
+
raise NotConfigured, 'Eventboss is not configured.'
|
34
57
|
else
|
35
58
|
Mock.new
|
36
59
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Eventboss
|
4
|
+
class Topic
|
5
|
+
class << self
|
6
|
+
def build_arn(event_name:, source_app: nil)
|
7
|
+
[
|
8
|
+
'arn:aws:sns',
|
9
|
+
Eventboss.configuration.eventboss_region,
|
10
|
+
Eventboss.configuration.eventboss_account_id,
|
11
|
+
build_name(
|
12
|
+
event_name: event_name,
|
13
|
+
source_app: source_app
|
14
|
+
)
|
15
|
+
].join(':')
|
16
|
+
end
|
17
|
+
|
18
|
+
def build_name(event_name:, source_app: nil)
|
19
|
+
[
|
20
|
+
Eventboss.configuration.sns_sqs_name_infix,
|
21
|
+
source_app,
|
22
|
+
event_name,
|
23
|
+
Eventboss.env
|
24
|
+
].compact.join('-')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -6,14 +6,15 @@ module Eventboss
|
|
6
6
|
|
7
7
|
attr_accessor :queue, :listener, :message
|
8
8
|
|
9
|
-
def initialize(queue, listener, message)
|
9
|
+
def initialize(client, queue, listener, message)
|
10
|
+
@client = client
|
10
11
|
@queue = queue
|
11
12
|
@listener = listener
|
12
13
|
@message = message
|
13
14
|
@logger = logger
|
14
15
|
end
|
15
16
|
|
16
|
-
def run
|
17
|
+
def run
|
17
18
|
logger.debug(@message.message_id) { 'Started' }
|
18
19
|
processor = @listener.new
|
19
20
|
processor.receive(JSON.parse(@message.body))
|
@@ -21,21 +22,21 @@ module Eventboss
|
|
21
22
|
rescue StandardError => exception
|
22
23
|
handle_exception(exception, processor: processor, message_id: @message.message_id)
|
23
24
|
else
|
24
|
-
cleanup
|
25
|
+
cleanup unless processor.postponed_by
|
25
26
|
ensure
|
26
|
-
change_message_visibility(
|
27
|
+
change_message_visibility(processor.postponed_by) if processor.postponed_by
|
27
28
|
end
|
28
29
|
|
29
|
-
def change_message_visibility(
|
30
|
-
client.change_message_visibility(
|
30
|
+
def change_message_visibility(postponed_by)
|
31
|
+
@client.change_message_visibility(
|
31
32
|
queue_url: @queue.url,
|
32
33
|
receipt_handle: @message.receipt_handle,
|
33
34
|
visibility_timeout: postponed_by
|
34
35
|
)
|
35
36
|
end
|
36
37
|
|
37
|
-
def cleanup
|
38
|
-
client.delete_message(
|
38
|
+
def cleanup
|
39
|
+
@client.delete_message(
|
39
40
|
queue_url: @queue.url, receipt_handle: @message.receipt_handle
|
40
41
|
)
|
41
42
|
logger.debug(@message.message_id) { 'Deleting' }
|
data/lib/eventboss/version.rb
CHANGED
data/lib/eventboss/worker.rb
CHANGED
@@ -6,12 +6,12 @@ module Eventboss
|
|
6
6
|
|
7
7
|
attr_reader :id
|
8
8
|
|
9
|
-
def initialize(launcher, id,
|
9
|
+
def initialize(launcher, id, bus, restart_on: [Exception])
|
10
10
|
@id = "worker-#{id}"
|
11
11
|
@launcher = launcher
|
12
|
-
@client = client
|
13
12
|
@bus = bus
|
14
13
|
@thread = nil
|
14
|
+
@restart_on = restart_on
|
15
15
|
end
|
16
16
|
|
17
17
|
def start
|
@@ -20,18 +20,24 @@ module Eventboss
|
|
20
20
|
|
21
21
|
def run
|
22
22
|
while (work = @bus.pop)
|
23
|
-
work
|
23
|
+
run_work(work)
|
24
24
|
end
|
25
25
|
@launcher.worker_stopped(self)
|
26
26
|
rescue Eventboss::Shutdown
|
27
27
|
@launcher.worker_stopped(self)
|
28
|
-
rescue
|
28
|
+
rescue *@restart_on => exception
|
29
29
|
handle_exception(exception, worker_id: id)
|
30
30
|
# Restart the worker in case of hard exception
|
31
31
|
# Message won't be delete from SQS and will be visible later
|
32
32
|
@launcher.worker_stopped(self, restart: true)
|
33
33
|
end
|
34
34
|
|
35
|
+
def run_work(work)
|
36
|
+
server_middleware.invoke(work) do
|
37
|
+
work.run
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
35
41
|
def terminate(wait = false)
|
36
42
|
stop_token
|
37
43
|
return unless @thread
|
@@ -51,5 +57,9 @@ module Eventboss
|
|
51
57
|
def stop_token
|
52
58
|
@bus << nil
|
53
59
|
end
|
60
|
+
|
61
|
+
def server_middleware
|
62
|
+
Eventboss.configuration.server_middleware
|
63
|
+
end
|
54
64
|
end
|
55
65
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class <%= event_name.camelize %>Listener
|
4
|
+
include Eventboss::Listener
|
5
|
+
|
6
|
+
eventboss_options event_name: '<%= event_name %>'<%= source_app ? ", source_app: '#{ source_app }'" : "" %>
|
7
|
+
|
8
|
+
def receive(payload)
|
9
|
+
Rails.logger.tagged(jid) { Rails.logger.info("payload: #{ payload }") }
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Creates the Eventboss listener scaffold
|
4
|
+
#
|
5
|
+
# @example Invocation from terminal
|
6
|
+
# rails generate eventboss:listener get_well air-helper
|
7
|
+
#
|
8
|
+
module Eventboss
|
9
|
+
class ListenerGenerator < Rails::Generators::Base
|
10
|
+
source_root File.expand_path(__dir__)
|
11
|
+
|
12
|
+
argument :event_name, required: true
|
13
|
+
argument :source_app, required: false
|
14
|
+
|
15
|
+
desc 'Creates the Eventboss listener scaffold'
|
16
|
+
def create_listener_scaffold
|
17
|
+
template 'eventboss_listener.rb.erb', "app/listeners/#{ event_name }_listener.rb"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/tasks/eventboss.rake
CHANGED
@@ -7,7 +7,7 @@ namespace :eventboss do
|
|
7
7
|
source_app = args[:source_app]
|
8
8
|
event_name = args[:event_name]
|
9
9
|
|
10
|
-
# Zero means
|
10
|
+
# Zero means: fetch all messages
|
11
11
|
max_messages = args[:max_messages].to_i
|
12
12
|
|
13
13
|
# Ensure we don't fetch more than 10 messages from SQS
|
@@ -15,13 +15,8 @@ namespace :eventboss do
|
|
15
15
|
|
16
16
|
abort "[#{task.name}] At least event name should be passed as argument" unless event_name
|
17
17
|
|
18
|
-
queue_name =
|
19
|
-
|
20
|
-
Eventboss.configuration.sns_sqs_name_infix,
|
21
|
-
source_app,
|
22
|
-
event_name,
|
23
|
-
Eventboss.env
|
24
|
-
].compact.join('-')
|
18
|
+
queue_name = compose_queue_name(source_app, event_name)
|
19
|
+
|
25
20
|
puts "[#{task.name}] Reloading #{queue_name}-deadletter (max: #{ max_messages }, batch: #{ batch_size })"
|
26
21
|
queue = Eventboss::Queue.new("#{queue_name}-deadletter")
|
27
22
|
send_queue = Eventboss::Queue.new(queue_name)
|
@@ -38,7 +33,6 @@ namespace :eventboss do
|
|
38
33
|
break if messages.count.zero?
|
39
34
|
|
40
35
|
messages.each do |message|
|
41
|
-
puts "[#{task.name}] Publishing message: #{message.body}"
|
42
36
|
client.send_message(queue_url: send_queue.url, message_body: message.body)
|
43
37
|
fetcher.delete(queue, message)
|
44
38
|
|
@@ -49,5 +43,51 @@ namespace :eventboss do
|
|
49
43
|
break if max_messages > 0 && total >= max_messages
|
50
44
|
end
|
51
45
|
end
|
46
|
+
|
47
|
+
desc 'Purge deadletter queue'
|
48
|
+
task :purge, [:event_name, :source_app, :max_messages] do |task, args|
|
49
|
+
source_app = args[:source_app]
|
50
|
+
event_name = args[:event_name]
|
51
|
+
|
52
|
+
# Zero means: fetch all messages
|
53
|
+
max_messages = args[:max_messages].to_i
|
54
|
+
|
55
|
+
# Ensure we don't fetch more than 10 messages from SQS
|
56
|
+
batch_size = max_messages == 0 ? 10 : [10, max_messages].min
|
57
|
+
|
58
|
+
abort "[#{task.name}] At least event name should be passed as argument" unless event_name
|
59
|
+
|
60
|
+
queue_name = compose_queue_name(source_app, event_name)
|
61
|
+
|
62
|
+
puts "[#{task.name}] Purging #{queue_name}-deadletter (max: #{ max_messages }, batch: #{ batch_size })"
|
63
|
+
queue = Eventboss::Queue.new("#{queue_name}-deadletter")
|
64
|
+
puts "[#{task.name}] #{queue.url}"
|
65
|
+
|
66
|
+
fetcher = Eventboss::Fetcher.new(Eventboss.configuration)
|
67
|
+
total = 0
|
68
|
+
loop do
|
69
|
+
messages = fetcher.fetch(queue, batch_size)
|
70
|
+
break if messages.count.zero?
|
71
|
+
|
72
|
+
messages.each do |message|
|
73
|
+
fetcher.delete(queue, message)
|
74
|
+
|
75
|
+
total += 1
|
76
|
+
break if max_messages > 0 && total >= max_messages
|
77
|
+
end
|
78
|
+
|
79
|
+
break if max_messages > 0 && total >= max_messages
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def compose_queue_name(source_app, event_name)
|
84
|
+
[
|
85
|
+
Eventboss.configuration.eventboss_app_name,
|
86
|
+
Eventboss.configuration.sns_sqs_name_infix,
|
87
|
+
source_app,
|
88
|
+
event_name,
|
89
|
+
Eventboss.env
|
90
|
+
].compact.join('-')
|
91
|
+
end
|
52
92
|
end
|
53
93
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventboss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AirHelp
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-sqs
|
@@ -108,9 +108,9 @@ executables:
|
|
108
108
|
extensions: []
|
109
109
|
extra_rdoc_files: []
|
110
110
|
files:
|
111
|
-
- ".github/workflows/ruby.yml"
|
112
111
|
- ".gitignore"
|
113
112
|
- ".rspec"
|
113
|
+
- ".travis.yml"
|
114
114
|
- CHANGELOG.md
|
115
115
|
- Gemfile
|
116
116
|
- Gemfile.lock
|
@@ -123,8 +123,10 @@ files:
|
|
123
123
|
- lib/eventboss.rb
|
124
124
|
- lib/eventboss/cli.rb
|
125
125
|
- lib/eventboss/configuration.rb
|
126
|
+
- lib/eventboss/development_mode.rb
|
126
127
|
- lib/eventboss/error_handlers/airbrake.rb
|
127
128
|
- lib/eventboss/error_handlers/db_connection_drop_handler.rb
|
129
|
+
- lib/eventboss/error_handlers/db_connection_not_established_handler.rb
|
128
130
|
- lib/eventboss/error_handlers/logger.rb
|
129
131
|
- lib/eventboss/extensions.rb
|
130
132
|
- lib/eventboss/fetcher.rb
|
@@ -133,6 +135,7 @@ files:
|
|
133
135
|
- lib/eventboss/listener.rb
|
134
136
|
- lib/eventboss/logging.rb
|
135
137
|
- lib/eventboss/long_poller.rb
|
138
|
+
- lib/eventboss/middleware.rb
|
136
139
|
- lib/eventboss/publisher.rb
|
137
140
|
- lib/eventboss/queue.rb
|
138
141
|
- lib/eventboss/queue_listener.rb
|
@@ -142,15 +145,18 @@ files:
|
|
142
145
|
- lib/eventboss/scripts.rb
|
143
146
|
- lib/eventboss/sender.rb
|
144
147
|
- lib/eventboss/sns_client.rb
|
148
|
+
- lib/eventboss/topic.rb
|
145
149
|
- lib/eventboss/unit_of_work.rb
|
146
150
|
- lib/eventboss/version.rb
|
147
151
|
- lib/eventboss/worker.rb
|
152
|
+
- lib/generators/eventboss/listener/eventboss_listener.rb.erb
|
153
|
+
- lib/generators/eventboss/listener/listener_generator.rb
|
148
154
|
- lib/tasks/eventboss.rake
|
149
155
|
homepage: https://github.com/AirHelp/eventboss
|
150
156
|
licenses:
|
151
157
|
- MIT
|
152
158
|
metadata: {}
|
153
|
-
post_install_message:
|
159
|
+
post_install_message:
|
154
160
|
rdoc_options: []
|
155
161
|
require_paths:
|
156
162
|
- lib
|
@@ -166,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
172
|
version: '0'
|
167
173
|
requirements: []
|
168
174
|
rubygems_version: 3.0.3
|
169
|
-
signing_key:
|
175
|
+
signing_key:
|
170
176
|
specification_version: 4
|
171
177
|
summary: Eventboss Ruby Client.
|
172
178
|
test_files: []
|
data/.github/workflows/ruby.yml
DELETED
@@ -1,20 +0,0 @@
|
|
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
|