emque-consuming 1.5.0 → 1.9.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 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