emque-consuming 1.5.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 18f37a4c2c4ca2951d9418cc53d3c4cb3b01ffcb
4
- data.tar.gz: cb68592cb698f450c0059caec6ec8b9ccd3b8672
2
+ SHA256:
3
+ metadata.gz: 4c743d09735f9d7cef0e9afd1c352159e1502abceed3d05fc1132a33597401a5
4
+ data.tar.gz: c22b17e397c032fc2251393b93feb39558a996258d5c27382b9b3397416a5f61
5
5
  SHA512:
6
- metadata.gz: b98cc1163c2ea82dc1b73b5e9d05e1851e9baeb7c65ea5c9e84a2f01b7199d3bd80893b22760aeb236d71b71e19df88b53df1bb3e7cce7f615815a74c0b2bc05
7
- data.tar.gz: a49054f4f05989287538ea0c1ec25df927e7018641665a9c49c16891106f2fe84113d1723cfeb4dc6493c5fbe17a346db1867114f5d921779a7c46b4c0d86c3d
6
+ metadata.gz: ea654910256e56c42cf3ef77d88ae0f3f4f57e304b99b54097f36695321dc2a74d2010436ec97b115d1f52895fe25412aeeaa1f49ad8b4e95c0cebf651b730c5
7
+ data.tar.gz: c5f32b23b28004f8d5ba6f9aafedda6a99ce75b5fe1c136cbea5aea74152b9ef99b01ac8b797eeae5a0f30d60189db39a3e0643251b0a90e2adc76a8a1d54ac5
@@ -0,0 +1,27 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ test:
11
+
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ matrix:
16
+ ruby: [ '2.3.8', '2.4.10', '2.5.9', '2.6.7', '2.7.3' ]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v2
20
+ - name: Set up Ruby
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ - name: Install dependencies
25
+ run: bundle install
26
+ - name: Run tests
27
+ run: bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Emque Consuming CHANGELOG
2
2
 
3
+ - [Add support for running in Kubernetes](https://github.com/emque/emque-consuming/pull/84) (1.9.0)
4
+ - [Migrate to GitHub Actions](https://github.com/emque/emque-consuming/pull/82) (1.8.1)
5
+ - [Add prefetch for DelayedMessageWorker](https://github.com/emque/emque-consuming/pull/81) (1.8.0)
6
+ - [Update Rake to fix CVE-2020-8130](https://github.com/emque/emque-consuming/pull/80) (1.7.1)
7
+ - [Update pipe-ruby to remove error handling](https://github.com/emque/emque-consuming/pull/78) 1.7.0
8
+ - [Fixes bug with Bunny 2.12 failing when exchange names are symbols](https://github.com/emque/emque-consuming/pull/77) 1.6.1
9
+ - [Re-enable pipe-ruby `raise_on_error` option to fix automatic retries directing messages to the error queue](https://github.com/emque/emque-consuming/pull/75) 1.6.0
3
10
  - [Update the puma gem to allow v3](https://github.com/emque/emque-consuming/pull/72) 1.5.0
4
11
  - [Disable pipe-ruby `raise_on_error` option to prevent duplicate erorrs](https://github.com/emque/emque-consuming/pull/74) 1.4.0
5
12
  - [Update minimum Ruby version to 2.3](https://github.com/emque/emque-consuming/pull/68) 1.3.0
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
- [![Build Status](https://travis-ci.org/emque/emque-consuming.png)](https://travis-ci.org/emque/emque-consuming)
2
-
3
1
  # Emque::Consuming
4
2
 
3
+ ![CI](https://github.com/emque/emque-consuming/workflows/CI/badge.svg)
4
+ [![Gem Version](https://badge.fury.io/rb/emque-consuming.svg)](https://badge.fury.io/rb/emque-consuming)
5
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
6
+
5
7
  Emque Consuming is a Ruby application framework that includes everything needed
6
8
  to create and run application capable of consuming messages from a message
7
9
  broker in a Pub/sub architecture. Messages can be produced with the
@@ -10,7 +12,7 @@ broker in a Pub/sub architecture. Messages can be produced with the
10
12
  ## Adapters
11
13
 
12
14
  We currently only support RabbitMQ. If you would like to add your own adapter,
13
- take a look at [the adapters directory](https://github.com/emque/emque-consuming/tree/master/lib/emque/consuming/adapters).
15
+ take a look at [the adapters directory](https://github.com/emque/emque-consuming/tree/main/lib/emque/consuming/adapters).
14
16
 
15
17
  ## Installation
16
18
 
@@ -135,7 +137,7 @@ class EventsConsumer
135
137
 
136
138
  def new_event(message)
137
139
  # NOTE: message is an immutable Virtus (https://github.com/solnic/virtus) Value Object.
138
- # Check it out here: https://github.com/emque/emque-consuming/blob/master/lib/emque/consuming/message.rb
140
+ # Check it out here: https://github.com/emque/emque-consuming/blob/main/lib/emque/consuming/message.rb
139
141
 
140
142
  # You don't have to use pipe (https://github.com/teamsnap/pipe-ruby), but we love it!
141
143
  pipe(message, :through => [
@@ -6,7 +6,7 @@ require "emque/consuming/version"
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "emque-consuming"
8
8
  spec.version = Emque::Consuming::VERSION
9
- spec.authors = ["Ryan Williams", "Dan Matthews"]
9
+ spec.authors = ["Ryan Williams", "Dan Matthews", "Paul Hanyzewski"]
10
10
  spec.email = ["oss@teamsnap.com"]
11
11
  spec.summary = %q{Microservices framework for Ruby}
12
12
  spec.summary = %q{Microservices framework for Ruby}
@@ -24,11 +24,11 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency "oj", "~> 2.18.5"
25
25
  spec.add_dependency "virtus", "~> 1.0"
26
26
  spec.add_dependency "puma", "~> 3.12"
27
- spec.add_dependency "pipe-ruby", "~> 0.2.0"
27
+ spec.add_dependency "pipe-ruby", "~> 1.0"
28
28
  spec.add_dependency "inflecto", "~> 0.0.2"
29
29
 
30
- spec.add_development_dependency "bundler", "~> 1.7"
31
- spec.add_development_dependency "rake", "~> 10.4.2"
30
+ spec.add_development_dependency "bundler", ">= 1.17.3"
31
+ spec.add_development_dependency "rake", ">= 12.3.3"
32
32
  spec.add_development_dependency "rspec", "~> 3.3"
33
33
  spec.add_development_dependency "bunny", "~> 2.11.0"
34
34
  spec.add_development_dependency "timecop", "~> 0.7.1"
@@ -18,6 +18,10 @@ module Emque
18
18
  def initialize(connection)
19
19
  self.channel = connection.create_channel
20
20
 
21
+ if config.adapter.options[:prefetch]
22
+ channel.prefetch(config.adapter.options[:prefetch])
23
+ end
24
+
21
25
  self.delayed_message_exchange = channel.exchange(
22
26
  "emque.#{config.app_name}.delayed_message",
23
27
  {
@@ -69,8 +73,6 @@ module Emque
69
73
  ::Emque::Consuming::Consumer.new.consume(:process, message)
70
74
  channel.ack(delivery_info.delivery_tag)
71
75
  rescue StandardError => exception
72
- logger.error "#{log_prefix} #{exception.class}: #{exception.message}"
73
- exception.backtrace.each { |bt| logger.error "#{log_prefix} #{bt}" }
74
76
  if retryable_errors.any? { |error| exception.class.to_s =~ /#{error}/ }
75
77
  retry_error(delivery_info, metadata, payload, exception)
76
78
  else
@@ -15,7 +15,7 @@ module Emque
15
15
  def retry_errors
16
16
  logger.info "#{log_prefix} starting"
17
17
  channel.open if channel.closed?
18
- error_queue.message_count.times do
18
+ [error_queue.message_count, 100].min.times do
19
19
  delivery_info, properties, payload = error_queue.pop(
20
20
  {:manual_ack => true}
21
21
  )
@@ -56,8 +56,6 @@ module Emque
56
56
  ::Emque::Consuming::Consumer.new.consume(:process, message)
57
57
  channel.ack(delivery_info.delivery_tag)
58
58
  rescue StandardError => exception
59
- logger.error "#{log_prefix} #{exception.class}: #{exception.message}"
60
- exception.backtrace.each { |bt| logger.error "#{log_prefix} #{bt}" }
61
59
  channel.nack(delivery_info.delivery_tag)
62
60
  end
63
61
  end
@@ -31,19 +31,22 @@ module Emque
31
31
  channel.prefetch(config.adapter.options[:prefetch])
32
32
  end
33
33
 
34
- self.queue =
35
- channel
36
- .queue(
37
- "emque.#{config.app_name}.#{topic}",
38
- :durable => config.adapter.options[:durable],
39
- :auto_delete => config.adapter.options[:auto_delete],
40
- :arguments => {
41
- "x-dead-letter-exchange" => "#{config.app_name}.error"
42
- }
43
- )
44
- .bind(
45
- channel.fanout(topic, :durable => true, :auto_delete => false)
46
- )
34
+ self.queue = channel
35
+ .queue(
36
+ "emque.#{config.app_name}.#{topic}",
37
+ :durable => config.adapter.options[:durable],
38
+ :auto_delete => config.adapter.options[:auto_delete],
39
+ :arguments => {
40
+ "x-dead-letter-exchange" => "#{config.app_name}.error"
41
+ }
42
+ )
43
+ .bind(
44
+ channel.fanout(
45
+ topic.to_s,
46
+ :durable => true,
47
+ :auto_delete => false,
48
+ )
49
+ )
47
50
  end
48
51
 
49
52
  def start
@@ -79,8 +82,6 @@ module Emque
79
82
  ::Emque::Consuming::Consumer.new.consume(:process, message)
80
83
  channel.ack(delivery_info.delivery_tag)
81
84
  rescue StandardError => exception
82
- logger.error "#{log_prefix} #{exception.class}: #{exception.message}"
83
- exception.backtrace.each { |bt| logger.error "#{log_prefix} #{bt}" }
84
85
  if enable_delayed_message
85
86
  begin
86
87
  publish_to_delayed_message(delivery_info, metadata, payload)
@@ -8,7 +8,7 @@ module Emque
8
8
  :error_limit, :error_expiration, :retryable_errors,
9
9
  :retryable_error_limit, :status, :status_port, :status_host,
10
10
  :socket_path, :shutdown_handlers
11
- attr_writer :env, :log_level
11
+ attr_writer :env, :log_level, :log_formatter
12
12
 
13
13
  def initialize
14
14
  @app_name = ""
@@ -19,6 +19,7 @@ module Emque
19
19
  @error_limit = 5
20
20
  @error_expiration = 3600 # 60 minutes
21
21
  @log_level = nil
22
+ @log_formatter = nil
22
23
  @retryable_errors = []
23
24
  @retryable_error_limit = 3
24
25
  @status_port = 10000
@@ -40,6 +41,10 @@ module Emque
40
41
  @log_level ||= Logger::INFO
41
42
  end
42
43
 
44
+ def log_formatter
45
+ @log_formatter ||= ::Logger::Formatter.new
46
+ end
47
+
43
48
  def set_adapter(name, options = {})
44
49
  @adapter = Emque::Consuming::Adapter.new(name, options)
45
50
  end
@@ -11,6 +11,9 @@ module Emque
11
11
 
12
12
  def process(message)
13
13
  pipe(message, :through => [:parse, :route])
14
+ rescue => e
15
+ handle_error(e, message)
16
+ raise
14
17
  end
15
18
 
16
19
  private
@@ -29,6 +32,28 @@ module Emque
29
32
  message
30
33
  )
31
34
  end
35
+
36
+ def handle_error(e, subject)
37
+ context = {
38
+ :consumer => self.class.name,
39
+ :message => {
40
+ :current => subject.values,
41
+ :original => subject.original
42
+ },
43
+ :topic => subject.topic
44
+ }
45
+
46
+ # log the error by default
47
+ Emque::Consuming.logger.error("Error consuming message #{e}")
48
+ Emque::Consuming.logger.error(context)
49
+ Emque::Consuming.logger.error e.backtrace.join("\n") unless e.backtrace.nil?
50
+
51
+ Emque::Consuming.config.error_handlers.each do |handler|
52
+ handler.call(e, context)
53
+ end
54
+
55
+ Emque::Consuming.application.instance.notice_error(context)
56
+ end
32
57
  end
33
58
  end
34
59
  end
@@ -16,7 +16,6 @@ module Emque
16
16
  def self.included(descendant)
17
17
  descendant.class_eval do
18
18
  attr_reader :message
19
- private :handle_error, :pipe
20
19
  end
21
20
  end
22
21
 
@@ -26,36 +25,9 @@ module Emque
26
25
 
27
26
  def pipe_config
28
27
  @pipe_config ||= Pipe::Config.new(
29
- :error_handlers => [method(:handle_error)],
30
- :raise_on_error => false,
31
28
  :stop_on => ->(msg, _, _) { !(msg.respond_to?(:continue?) && msg.continue?) }
32
29
  )
33
30
  end
34
-
35
- def handle_error(e, method:, subject:)
36
- context = {
37
- :consumer => self.class.name,
38
- :message => {
39
- :current => subject.values,
40
- :original => subject.original
41
- },
42
- :offset => subject.offset,
43
- :partition => subject.partition,
44
- :pipe_method => method,
45
- :topic => subject.topic
46
- }
47
-
48
- # log the error by default
49
- Emque::Consuming.logger.error("Error consuming message #{e}")
50
- Emque::Consuming.logger.error(context)
51
- Emque::Consuming.logger.error e.backtrace.join("\n") unless e.backtrace.nil?
52
-
53
- Emque::Consuming.config.error_handlers.each do |handler|
54
- handler.call(e, context)
55
- end
56
-
57
- Emque::Consuming.application.instance.notice_error(context)
58
- end
59
31
  end
60
32
  end
61
33
  end
@@ -50,9 +50,11 @@ module Emque
50
50
  )
51
51
  end
52
52
 
53
- def initialize_logger
54
- Emque::Consuming::Logging.initialize_logger(logfile)
53
+ def initialize_logger(daemonized: false)
54
+ target = daemonized ? logfile : STDOUT
55
+ Emque::Consuming::Logging.initialize_logger(target)
55
56
  Emque::Consuming.logger.level = config.log_level
57
+ Emque::Consuming.logger.formatter = config.log_formatter
56
58
  Celluloid.logger = Emque::Consuming.logger
57
59
  end
58
60
 
@@ -82,7 +84,7 @@ module Emque
82
84
  end
83
85
 
84
86
  def emque_env
85
- config.env_var || ENV["EMQUE_ENV"] || ENV["RACK_ENV"] || "development"
87
+ config.env_var || ENV["EMQUE_ENV"] || "development"
86
88
  end
87
89
  end
88
90
  end
@@ -23,7 +23,9 @@ module Emque
23
23
  self.receivers = []
24
24
  self.status = Emque::Consuming::Status.new
25
25
  apply_options
26
- Emque::Consuming.application.initialize_logger
26
+ Emque::Consuming
27
+ .application
28
+ .initialize_logger(daemonized: options.fetch(:daemon) { false })
27
29
  self.class.instance = self
28
30
  self.pidfile = options.fetch(:pidfile, default_pidfile)
29
31
  self.pid = Emque::Consuming::Pidfile.new(pidfile)
@@ -1,5 +1,5 @@
1
1
  module Emque
2
2
  module Consuming
3
- VERSION = "1.5.0"
3
+ VERSION = "1.9.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emque-consuming
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Williams
8
8
  - Dan Matthews
9
- autorequire:
9
+ - Paul Hanyzewski
10
+ autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2019-03-04 00:00:00.000000000 Z
13
+ date: 2021-06-30 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: celluloid
@@ -87,14 +88,14 @@ dependencies:
87
88
  requirements:
88
89
  - - "~>"
89
90
  - !ruby/object:Gem::Version
90
- version: 0.2.0
91
+ version: '1.0'
91
92
  type: :runtime
92
93
  prerelease: false
93
94
  version_requirements: !ruby/object:Gem::Requirement
94
95
  requirements:
95
96
  - - "~>"
96
97
  - !ruby/object:Gem::Version
97
- version: 0.2.0
98
+ version: '1.0'
98
99
  - !ruby/object:Gem::Dependency
99
100
  name: inflecto
100
101
  requirement: !ruby/object:Gem::Requirement
@@ -113,30 +114,30 @@ dependencies:
113
114
  name: bundler
114
115
  requirement: !ruby/object:Gem::Requirement
115
116
  requirements:
116
- - - "~>"
117
+ - - ">="
117
118
  - !ruby/object:Gem::Version
118
- version: '1.7'
119
+ version: 1.17.3
119
120
  type: :development
120
121
  prerelease: false
121
122
  version_requirements: !ruby/object:Gem::Requirement
122
123
  requirements:
123
- - - "~>"
124
+ - - ">="
124
125
  - !ruby/object:Gem::Version
125
- version: '1.7'
126
+ version: 1.17.3
126
127
  - !ruby/object:Gem::Dependency
127
128
  name: rake
128
129
  requirement: !ruby/object:Gem::Requirement
129
130
  requirements:
130
- - - "~>"
131
+ - - ">="
131
132
  - !ruby/object:Gem::Version
132
- version: 10.4.2
133
+ version: 12.3.3
133
134
  type: :development
134
135
  prerelease: false
135
136
  version_requirements: !ruby/object:Gem::Requirement
136
137
  requirements:
137
- - - "~>"
138
+ - - ">="
138
139
  - !ruby/object:Gem::Version
139
- version: 10.4.2
140
+ version: 12.3.3
140
141
  - !ruby/object:Gem::Dependency
141
142
  name: rspec
142
143
  requirement: !ruby/object:Gem::Requirement
@@ -193,7 +194,7 @@ dependencies:
193
194
  - - "~>"
194
195
  - !ruby/object:Gem::Version
195
196
  version: 1.2.0
196
- description:
197
+ description:
197
198
  email:
198
199
  - oss@teamsnap.com
199
200
  executables:
@@ -201,8 +202,8 @@ executables:
201
202
  extensions: []
202
203
  extra_rdoc_files: []
203
204
  files:
205
+ - ".github/workflows/ci.yml"
204
206
  - ".gitignore"
205
- - ".travis.yml"
206
207
  - CHANGELOG.md
207
208
  - Gemfile
208
209
  - LICENSE.txt
@@ -274,7 +275,7 @@ homepage: https://github.com/teamsnap/emque-consuming
274
275
  licenses:
275
276
  - MIT
276
277
  metadata: {}
277
- post_install_message:
278
+ post_install_message:
278
279
  rdoc_options: []
279
280
  require_paths:
280
281
  - lib
@@ -289,9 +290,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
289
290
  - !ruby/object:Gem::Version
290
291
  version: '0'
291
292
  requirements: []
292
- rubyforge_project:
293
- rubygems_version: 2.5.2.3
294
- signing_key:
293
+ rubygems_version: 3.0.3.1
294
+ signing_key:
295
295
  specification_version: 4
296
296
  summary: Microservices framework for Ruby
297
297
  test_files:
data/.travis.yml DELETED
@@ -1,11 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.3.1
4
- - 2.3.8
5
- - 2.4.5
6
- - 2.5.3
7
- script: bundle exec rake
8
- notifications:
9
- recipients:
10
- - shane@teamsnap.com
11
- - ryan.williams@teamsnap.com