bbk-app 1.0.0.141716 → 1.1.0.199383

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
2
  SHA256:
3
- metadata.gz: ddd13011788fd70fb38bb3d91d436cea5a602d2d74be9780759a6a8df4378b78
4
- data.tar.gz: 2819543d3971764f12bcca9554a18ac715477815a27d539bd6f942e3263e45c5
3
+ metadata.gz: cfb0384af4545b59b59a7de1f309e71e895bf2af47ce0526bcf0265b54606c60
4
+ data.tar.gz: 7fb2b293747d66a4d818bacf32a8fb72f5c48e48f7937d1931e4c2e73472cdc1
5
5
  SHA512:
6
- metadata.gz: f07b3488745b25b86e82e2472de8678e05f0772c805a2e9e0d0faab087620ea90e6f29e7a65911955a51925c01aed4adc422a353d716cef59070a33365670706
7
- data.tar.gz: 8511a776aa500dfa4fdec5638d04070c7bd869227f413e3b0fdcc30b8d33ab9b272eced03c3b3a79f289c28ce9916c5baccddfcbf0be6b595b3a787fd569bf39
6
+ metadata.gz: 17de92ea6e1492d94b66ad4af0efa83dc8ea43f4d3591250f39ae379323978e33da4541093b0d89451af71bb4e3bdfe820a50d30ebf938ad6bfc37ac07b679ca
7
+ data.tar.gz: '080cff24d3c3521d4c563433e001f6945571eb678849c2549ccc4a23148bd196e1f45164081e3a9c7dc295890b2552f5c960fb200cc3678fe797df11f352eff6'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bbk-app (1.0.0.141716)
4
+ bbk-app (1.1.0.199383)
5
5
  activesupport
6
6
  bbk-utils (> 1.0.1)
7
7
  timeouter
@@ -29,7 +29,7 @@ GEM
29
29
  descendants_tracker (~> 0.0.4)
30
30
  ice_nine (~> 0.11.0)
31
31
  thread_safe (~> 0.3, >= 0.3.1)
32
- bbk-utils (1.0.1.136047)
32
+ bbk-utils (1.0.1.147183)
33
33
  activesupport (>= 6.0)
34
34
  russian
35
35
  bunny (2.19.0)
@@ -122,7 +122,7 @@ GEM
122
122
  virtus (~> 1.0)
123
123
  russian (0.6.0)
124
124
  i18n (>= 0.5.0)
125
- set (1.0.2)
125
+ set (1.0.3)
126
126
  sexp_processor (4.16.0)
127
127
  simplecov (0.21.2)
128
128
  docile (~> 1.1)
@@ -13,6 +13,14 @@ module BBK
13
13
  @message = message
14
14
  end
15
15
 
16
+ def deconstruct
17
+ [route.to_s, message]
18
+ end
19
+
20
+ def deconstruct_keys(_keys)
21
+ {route: route.to_s, message: message}
22
+ end
23
+
16
24
  end
17
25
  end
18
26
  end
@@ -10,6 +10,8 @@ require 'bbk/utils/proxy_logger'
10
10
  module BBK
11
11
  module App
12
12
 
13
+ class InvalidAnswersMessagesCountError < StandardError; end
14
+
13
15
  class SimplePoolFactory
14
16
 
15
17
  def self.call(pool_size, queue_size)
@@ -32,7 +34,8 @@ module BBK
32
34
  attr_accessor :force_quit
33
35
  attr_reader :consumers, :publishers, :observer, :middlewares, :logger
34
36
 
35
- ANSWER_DOMAIN = 'answer'
37
+ ANSWER_DOMAIN = 'answer'.freeze
38
+ DEFAULT_PROTOCOL = 'default'.freeze
36
39
 
37
40
  def initialize(observer, pool_size: 3, logger: BBK::App.logger, pool_factory: SimplePoolFactory, stream_strategy: QueueStreamStrategy)
38
41
  @observer = observer
@@ -52,9 +55,20 @@ module BBK
52
55
  end
53
56
 
54
57
  def register_publisher(publisher)
58
+ raise "Publisher support #{DEFAULT_PROTOCOL}" if publisher.protocols.include?(DEFAULT_PROTOCOL)
55
59
  publishers << publisher
56
60
  end
57
61
 
62
+ # set default publisher for results with empty scheme or DEFAULT_PROTOCOL scheme
63
+ def default_publisher=(publisher)
64
+ @default_publisher = publisher
65
+ end
66
+
67
+ # get default publisher
68
+ def default_publisher
69
+ @default_publisher || (publishers.size == 1 ? publishers.first : nil)
70
+ end
71
+
58
72
  def register_middleware(middleware)
59
73
  middlewares << middleware
60
74
  end
@@ -122,18 +136,19 @@ module BBK
122
136
  end
123
137
  end
124
138
 
125
- protected
139
+ # process one message and sending existed results messages
140
+ def process(message)
141
+ results = execute_message(message)
142
+ logger.debug "There are #{results.count} results to send from #{message.headers[:message_id]}..."
143
+ send_results(message, results).value
144
+ rescue StandardError => e
145
+ logger.error "Failed processing message: #{e.inspect}"
146
+ ActiveSupport::Notifications.instrument 'dispatcher.exception', msg: message, exception: e
147
+ message.nack(error: e)
148
+ close if force_quit
149
+ end
126
150
 
127
- def process(message)
128
- results = execute_message(message)
129
- logger.debug "There are #{results.count} results to send from #{message.headers[:message_id]}..."
130
- send_results(message, results).value
131
- rescue StandardError => e
132
- logger.error "Failed processing message: #{e.inspect}"
133
- ActiveSupport::Notifications.instrument 'dispatcher.exception', msg: message, exception: e
134
- message.nack(error: e)
135
- close if force_quit
136
- end
151
+ protected
137
152
 
138
153
  def process_message(message)
139
154
  matched, processor = find_processor(message)
@@ -176,8 +191,12 @@ module BBK
176
191
  def send_results(incoming, results)
177
192
  message_id = incoming.headers[:message_id]
178
193
 
179
- answer = results.find {|msg| msg.route.domain == ANSWER_DOMAIN }
180
- Concurrent::Promises.zip_futures(*results.map do |result|
194
+ answers, sended_messages = results.partition { _1.route.domain == ANSWER_DOMAIN }
195
+ # allowed only one answer message
196
+ raise InvalidAnswersMessagesCountError.new("Get #{asnwers.size} on processing message with id=#{message_id}") if answers.size > 1
197
+
198
+ answer = answers.first
199
+ Concurrent::Promises.zip_futures(*sended_messages.map do |result|
181
200
  publish_result(result)
182
201
  end).then do |_successes|
183
202
  incoming.ack(answer: answer)
@@ -203,6 +222,10 @@ module BBK
203
222
  route = result.route
204
223
  logger.debug "Publish result to #{route} ..."
205
224
  publisher = publishers.find {|pub| pub.protocols.include?(route.scheme) }
225
+ if route.scheme.nil? || route.scheme == DEFAULT_PROTOCOL
226
+ logger.debug "Use default publisher for result with route=#{route}"
227
+ publisher = default_publisher
228
+ end
206
229
  raise "Not found publisher for scheme #{route.scheme}" if publisher.nil?
207
230
 
208
231
  # return Concurrent::Promises.resolvable_future
@@ -1,7 +1,7 @@
1
1
  module BBK
2
2
  module App
3
3
 
4
- VERSION = '1.0.0'
4
+ VERSION = '1.1.0'
5
5
 
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbk-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.141716
4
+ version: 1.1.0.199383
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samoilenko Yuri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-10 00:00:00.000000000 Z
11
+ date: 2023-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -320,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
320
  - !ruby/object:Gem::Version
321
321
  version: '0'
322
322
  requirements: []
323
- rubygems_version: 3.2.32
323
+ rubygems_version: 3.2.33
324
324
  signing_key:
325
325
  specification_version: 4
326
326
  summary: Classes for building services based on BBK stack