evt-consumer 2.2.0.0 → 2.3.1.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 +4 -4
- data/lib/consumer/consumer.rb +97 -29
- data/lib/consumer/controls.rb +3 -1
- data/lib/consumer/controls/consumer.rb +8 -0
- data/lib/consumer/controls/consumer/error_handler.rb +1 -1
- data/lib/consumer/controls/get/incrementing.rb +4 -0
- data/lib/consumer/controls/handle/settings.rb +7 -0
- data/lib/consumer/controls/position_store.rb +30 -9
- data/lib/consumer/controls/settings.rb +13 -0
- data/lib/consumer/position_store.rb +4 -1
- data/lib/consumer/position_store/substitute.rb +2 -0
- data/lib/consumer/postgres +1 -0
- data/lib/consumer/postgres.rb +1 -0
- data/lib/consumer/subscription.rb +1 -1
- data/lib/consumer/subscription/defaults.rb +3 -0
- metadata +10 -7
- data/lib/consumer/controls/stream_name.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf9c47da47df09523d2007d47a2bd92aa8463924f327261c0e5a1215efb16a81
|
4
|
+
data.tar.gz: 3ce5caed62500286a552af1940b6892e45c2c60ac235acb11bea52ab0ccbd79e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3e8b9b68405943aec82c4d2ebc5d6de35419fd8715bee00fab9476e833ec2521e18f3f208c14f3d81dd4038faf255c66b21a1ed8f7f717dd9b0e5c0bc2cdd2d
|
7
|
+
data.tar.gz: cde3e28a744e3eefde6367eb7f4425d2faacff56b7b65ccd237d0144079a5b8de1c4b554a7e763e091a38dacb1f0e2c554735add6fa602b135ecefa76f793a90
|
data/lib/consumer/consumer.rb
CHANGED
@@ -33,9 +33,11 @@ module Consumer
|
|
33
33
|
@position_update_counter ||= 0
|
34
34
|
end
|
35
35
|
|
36
|
+
attr_accessor :poll_interval_milliseconds
|
37
|
+
|
36
38
|
attr_accessor :session
|
37
39
|
|
38
|
-
attr_accessor :
|
40
|
+
attr_accessor :supplemental_settings
|
39
41
|
|
40
42
|
dependency :get, MessageStore::Get
|
41
43
|
dependency :position_store, PositionStore
|
@@ -49,34 +51,20 @@ module Consumer
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
def
|
53
|
-
logger.
|
54
|
+
def start(&probe)
|
55
|
+
logger.info(tags: [:consumer, :start]) { "Starting consumer: #{self.class.name} (Category: #{category}, Identifier: #{identifier || '(none)'}, Position: #{subscription.position})" }
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
+
if Defaults.startup_info?
|
58
|
+
print_info
|
57
59
|
end
|
58
60
|
|
59
|
-
|
60
|
-
|
61
|
-
logger.info { "Message dispatched (#{LogText.message_data(message_data)})" }
|
62
|
-
rescue => error
|
63
|
-
logger.error { "Error raised (Error Class: #{error.class}, Error Message: #{error.message}, #{LogText.message_data(message_data)})" }
|
64
|
-
error_raised(error, message_data)
|
65
|
-
end
|
66
|
-
|
67
|
-
def start(&probe)
|
68
|
-
logger.info(tag: :*) { "Starting consumer: #{self.class.name} (Category: #{category}, Identifier: #{identifier || '(none)'}, Position: #{subscription.position})" }
|
61
|
+
log_info
|
62
|
+
starting if respond_to?(:starting)
|
69
63
|
|
70
64
|
if not MessageStore::StreamName.category?(category)
|
71
65
|
raise Error, "Consumer's stream name must be a category (Stream Name: #{category})"
|
72
66
|
end
|
73
67
|
|
74
|
-
starting() if respond_to?(:starting)
|
75
|
-
|
76
|
-
self.class.handler_registry.each do |handler|
|
77
|
-
logger.info(tag: :*) { "Handler: #{handler.name} (Category: #{category}, Consumer: #{self.class.name})" }
|
78
|
-
end
|
79
|
-
|
80
68
|
_, subscription_thread = ::Actor::Start.(subscription)
|
81
69
|
|
82
70
|
actor_address, actor_thread = Actor.start(self, subscription, include: :thread)
|
@@ -87,24 +75,76 @@ module Consumer
|
|
87
75
|
probe.(self, [actor_thread, subscription_thread], [actor_address, subscription_address])
|
88
76
|
end
|
89
77
|
|
90
|
-
logger.info(
|
78
|
+
logger.info(tags: [:consumer, :start]) { "Started consumer: #{self.class.name} (Category: #{category}, Identifier: #{identifier || '(none)'}, Position: #{subscription.position})" }
|
91
79
|
|
92
80
|
AsyncInvocation::Incorrect
|
93
81
|
end
|
94
82
|
|
83
|
+
def print_info
|
84
|
+
STDOUT.puts
|
85
|
+
STDOUT.puts " Consumer: #{self.class.name}"
|
86
|
+
STDOUT.puts " Category: #{category}"
|
87
|
+
STDOUT.puts " Position: #{subscription.position}"
|
88
|
+
STDOUT.puts " Identifier: #{identifier || '(none)'}"
|
89
|
+
|
90
|
+
print_startup_info if respond_to?(:print_startup_info)
|
91
|
+
|
92
|
+
STDOUT.puts " Position Location: #{position_store.location || '(none)'}"
|
93
|
+
|
94
|
+
STDOUT.puts
|
95
|
+
|
96
|
+
STDOUT.puts " Handlers:"
|
97
|
+
self.class.handler_registry.each do |handler|
|
98
|
+
STDOUT.puts " Handler: #{handler.name}"
|
99
|
+
STDOUT.puts " Messages: #{handler.message_registry.message_types.join(', ')}"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def log_info
|
104
|
+
logger.info(tags: [:consumer, :start]) { "Category: #{category} (Consumer: #{self.class.name})" }
|
105
|
+
logger.info(tags: [:consumer, :start]) { "Position: #{subscription.position} (Consumer: #{self.class.name})" }
|
106
|
+
logger.info(tags: [:consumer, :start]) { "Identifier: #{identifier || 'nil'} (Consumer: #{self.class.name})" }
|
107
|
+
|
108
|
+
log_startup_info if respond_to?(:log_startup_info)
|
109
|
+
|
110
|
+
logger.info(tags: [:consumer, :start]) { "Position Update Interval: #{position_update_interval.inspect} (Consumer: #{self.class.name})" }
|
111
|
+
|
112
|
+
logger.info(tags: [:consumer, :start]) { "Poll Interval Milliseconds: #{poll_interval_milliseconds.inspect} (Consumer: #{self.class.name})" }
|
113
|
+
|
114
|
+
self.class.handler_registry.each do |handler|
|
115
|
+
logger.info(tags: [:consumer, :start]) { "Handler: #{handler.name} (Consumer: #{self.class.name})" }
|
116
|
+
logger.info(tags: [:consumer, :start]) { "Messages: #{handler.message_registry.message_types.join(', ')} (Handler: #{handler.name}, Consumer: #{self.class.name})" }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def dispatch(message_data)
|
121
|
+
logger.trace(tags: [:consumer, :dispatch, :message]) { "Dispatching message (#{LogText.message_data(message_data)})" }
|
122
|
+
|
123
|
+
self.class.handler_registry.each do |handler|
|
124
|
+
handler.(message_data, session: session, settings: supplemental_settings)
|
125
|
+
end
|
126
|
+
|
127
|
+
update_position(message_data.global_position)
|
128
|
+
|
129
|
+
logger.debug(tags: [:consumer, :dispatch, :message]) { "Message dispatched (#{LogText.message_data(message_data)})" }
|
130
|
+
rescue => error
|
131
|
+
logger.error(tag: :*) { "Error raised (Error Class: #{error.class}, Error Message: #{error.message}, #{LogText.message_data(message_data)})" }
|
132
|
+
error_raised(error, message_data)
|
133
|
+
end
|
134
|
+
|
95
135
|
def update_position(position)
|
96
|
-
logger.trace { "Updating position (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
136
|
+
logger.trace(tags: [:consumer, :position]) { "Updating position (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
97
137
|
|
98
138
|
self.position_update_counter += 1
|
99
139
|
|
100
140
|
if position_update_counter >= position_update_interval
|
101
141
|
position_store.put(position)
|
102
142
|
|
103
|
-
logger.debug { "Updated position (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
143
|
+
logger.debug(tags: [:consumer, :position]) { "Updated position (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
104
144
|
|
105
145
|
self.position_update_counter = 0
|
106
146
|
else
|
107
|
-
logger.debug { "Interval not reached; position not updated (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
147
|
+
logger.debug(tags: [:consumer, :position]) { "Interval not reached; position not updated (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
108
148
|
end
|
109
149
|
end
|
110
150
|
|
@@ -116,7 +156,7 @@ module Consumer
|
|
116
156
|
|
117
157
|
module Configure
|
118
158
|
def configure(**kwargs)
|
119
|
-
logger.trace { "Configuring (Category: #{category})" }
|
159
|
+
logger.trace(tag: :consumer) { "Configuring (Category: #{category})" }
|
120
160
|
|
121
161
|
super(**kwargs)
|
122
162
|
|
@@ -129,18 +169,26 @@ module Consumer
|
|
129
169
|
poll_interval_milliseconds: poll_interval_milliseconds
|
130
170
|
)
|
131
171
|
|
132
|
-
logger.debug { "Done configuring (Category: #{category}, Starting Position: #{starting_position})" }
|
172
|
+
logger.debug(tag: :consumer) { "Done configuring (Category: #{category}, Starting Position: #{starting_position})" }
|
133
173
|
end
|
134
174
|
end
|
135
175
|
|
136
176
|
module Build
|
137
|
-
def build(category, position_update_interval: nil, poll_interval_milliseconds: nil, identifier: nil, **arguments)
|
177
|
+
def build(category, position_update_interval: nil, poll_interval_milliseconds: nil, identifier: nil, supplemental_settings: nil, **arguments)
|
138
178
|
instance = new(category)
|
139
179
|
|
140
|
-
|
180
|
+
if not identifier.nil?
|
141
181
|
instance.identifier = identifier
|
142
182
|
end
|
143
183
|
|
184
|
+
if not supplemental_settings.nil?
|
185
|
+
if not supplemental_settings.is_a?(::Settings)
|
186
|
+
supplemental_settings = ::Settings.build(supplemental_settings)
|
187
|
+
end
|
188
|
+
|
189
|
+
instance.supplemental_settings = supplemental_settings
|
190
|
+
end
|
191
|
+
|
144
192
|
instance.position_update_interval = position_update_interval
|
145
193
|
instance.poll_interval_milliseconds = poll_interval_milliseconds
|
146
194
|
|
@@ -185,4 +233,24 @@ module Consumer
|
|
185
233
|
end
|
186
234
|
end
|
187
235
|
end
|
236
|
+
|
237
|
+
module Defaults
|
238
|
+
def self.startup_info?
|
239
|
+
StartupInfo.get == 'on'
|
240
|
+
end
|
241
|
+
|
242
|
+
module StartupInfo
|
243
|
+
def self.get
|
244
|
+
ENV.fetch(env_var, default)
|
245
|
+
end
|
246
|
+
|
247
|
+
def self.env_var
|
248
|
+
'STARTUP_INFO'
|
249
|
+
end
|
250
|
+
|
251
|
+
def self.default
|
252
|
+
'on'
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
188
256
|
end
|
data/lib/consumer/controls.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'settings/controls'
|
1
2
|
require 'messaging/controls'
|
2
3
|
|
3
4
|
require 'consumer/controls/category'
|
@@ -11,7 +12,7 @@ require 'consumer/controls/id'
|
|
11
12
|
require 'consumer/controls/identifier'
|
12
13
|
require 'consumer/controls/position'
|
13
14
|
require 'consumer/controls/session'
|
14
|
-
require 'consumer/controls/
|
15
|
+
require 'consumer/controls/settings'
|
15
16
|
|
16
17
|
require 'consumer/controls/position_store'
|
17
18
|
require 'consumer/controls/position_store/file'
|
@@ -19,6 +20,7 @@ require 'consumer/controls/subscription'
|
|
19
20
|
|
20
21
|
require 'consumer/controls/handle'
|
21
22
|
require 'consumer/controls/handle/raise_error'
|
23
|
+
require 'consumer/controls/handle/settings'
|
22
24
|
|
23
25
|
require 'consumer/controls/actor'
|
24
26
|
|
@@ -1,20 +1,35 @@
|
|
1
1
|
module Consumer
|
2
2
|
module Controls
|
3
3
|
module PositionStore
|
4
|
-
def self.example
|
5
|
-
|
4
|
+
def self.example(&block)
|
5
|
+
if block.nil?
|
6
|
+
cls = Example
|
7
|
+
else
|
8
|
+
cls = example_class(&block)
|
9
|
+
end
|
10
|
+
|
11
|
+
cls.build
|
6
12
|
end
|
7
13
|
|
8
|
-
|
9
|
-
|
14
|
+
def self.example_class(&block)
|
15
|
+
Class.new do
|
16
|
+
include ::Consumer::PositionStore
|
10
17
|
|
11
|
-
|
18
|
+
def self.build
|
19
|
+
instance = new
|
20
|
+
instance.configure
|
21
|
+
instance
|
22
|
+
end
|
12
23
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
24
|
+
def configure
|
25
|
+
end
|
26
|
+
|
27
|
+
class_exec(&block) unless block.nil?
|
17
28
|
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Example = example_class do
|
32
|
+
attr_accessor :telemetry_sink
|
18
33
|
|
19
34
|
def configure
|
20
35
|
self.telemetry_sink = ::Consumer::PositionStore::Telemetry::Sink.new
|
@@ -29,6 +44,12 @@ module Consumer
|
|
29
44
|
def put(_)
|
30
45
|
end
|
31
46
|
end
|
47
|
+
|
48
|
+
module Location
|
49
|
+
def self.example
|
50
|
+
'somePositionStream'
|
51
|
+
end
|
52
|
+
end
|
32
53
|
end
|
33
54
|
end
|
34
55
|
end
|
@@ -3,6 +3,7 @@ module Consumer
|
|
3
3
|
def self.included(cls)
|
4
4
|
cls.class_exec do
|
5
5
|
include Dependency
|
6
|
+
include Virtual
|
6
7
|
include Log::Dependency
|
7
8
|
|
8
9
|
extend Build
|
@@ -13,6 +14,8 @@ module Consumer
|
|
13
14
|
prepend Put
|
14
15
|
|
15
16
|
dependency :telemetry, ::Telemetry
|
17
|
+
|
18
|
+
virtual :location
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
@@ -60,7 +63,7 @@ module Consumer
|
|
60
63
|
|
61
64
|
position = super
|
62
65
|
|
63
|
-
logger.
|
66
|
+
logger.debug(tags: [:position_store, :get]) { "Get position done (Position: #{position || '(none)'})" }
|
64
67
|
|
65
68
|
telemetry.record(:get, Telemetry::Get.new(position))
|
66
69
|
|
@@ -0,0 +1 @@
|
|
1
|
+
lib/consumer/Users/sbellware/projects/eventide/consumer-postgres/lib/consumer/postgres
|
@@ -0,0 +1 @@
|
|
1
|
+
lib/consumer/Users/sbellware/projects/eventide/consumer-postgres/lib/consumer/postgres.rb
|
@@ -53,7 +53,7 @@ module Consumer
|
|
53
53
|
end
|
54
54
|
|
55
55
|
if batch.nil? || batch.empty?
|
56
|
-
logger.debug { "Did not resupply; no events available (
|
56
|
+
logger.debug { "Did not resupply; no events available (Stream: #{get.stream_name}, Position: #{position})" }
|
57
57
|
|
58
58
|
:resupply
|
59
59
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evt-consumer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Eventide Project
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ntl-actor
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- lib/consumer/controls/get/incrementing.rb
|
115
115
|
- lib/consumer/controls/handle.rb
|
116
116
|
- lib/consumer/controls/handle/raise_error.rb
|
117
|
+
- lib/consumer/controls/handle/settings.rb
|
117
118
|
- lib/consumer/controls/id.rb
|
118
119
|
- lib/consumer/controls/identifier.rb
|
119
120
|
- lib/consumer/controls/message_data.rb
|
@@ -123,7 +124,7 @@ files:
|
|
123
124
|
- lib/consumer/controls/position_store.rb
|
124
125
|
- lib/consumer/controls/position_store/file.rb
|
125
126
|
- lib/consumer/controls/session.rb
|
126
|
-
- lib/consumer/controls/
|
127
|
+
- lib/consumer/controls/settings.rb
|
127
128
|
- lib/consumer/controls/subscription.rb
|
128
129
|
- lib/consumer/defaults.rb
|
129
130
|
- lib/consumer/handler_registry.rb
|
@@ -132,6 +133,8 @@ files:
|
|
132
133
|
- lib/consumer/position_store.rb
|
133
134
|
- lib/consumer/position_store/substitute.rb
|
134
135
|
- lib/consumer/position_store/telemetry.rb
|
136
|
+
- lib/consumer/postgres
|
137
|
+
- lib/consumer/postgres.rb
|
135
138
|
- lib/consumer/subscription.rb
|
136
139
|
- lib/consumer/subscription/defaults.rb
|
137
140
|
- lib/consumer/subscription/get_batch.rb
|
@@ -140,7 +143,7 @@ homepage: https://github.com/eventide-project/consumer
|
|
140
143
|
licenses:
|
141
144
|
- MIT
|
142
145
|
metadata: {}
|
143
|
-
post_install_message:
|
146
|
+
post_install_message:
|
144
147
|
rdoc_options: []
|
145
148
|
require_paths:
|
146
149
|
- lib
|
@@ -155,8 +158,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
158
|
- !ruby/object:Gem::Version
|
156
159
|
version: '0'
|
157
160
|
requirements: []
|
158
|
-
rubygems_version: 3.
|
159
|
-
signing_key:
|
161
|
+
rubygems_version: 3.1.2
|
162
|
+
signing_key:
|
160
163
|
specification_version: 4
|
161
164
|
summary: Continuous subscription to a category and message dispatching to handlers
|
162
165
|
test_files: []
|