railway-ipc 1.0.1 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +77 -0
- data/README.md +1 -1
- data/lib/railway_ipc.rb +3 -7
- data/lib/railway_ipc/consumer/consumer.rb +19 -8
- data/lib/railway_ipc/consumer/process_incoming_message.rb +14 -8
- data/lib/railway_ipc/handler.rb +15 -3
- data/lib/railway_ipc/handler_store.rb +2 -2
- data/lib/railway_ipc/logger.rb +42 -25
- data/lib/railway_ipc/models/consumed_message.rb +0 -1
- data/lib/railway_ipc/publisher.rb +24 -7
- data/lib/railway_ipc/rabbitmq/adapter.rb +1 -1
- data/lib/railway_ipc/responder.rb +5 -1
- data/lib/railway_ipc/rpc/client/client.rb +16 -5
- data/lib/railway_ipc/rpc/server/server.rb +20 -5
- data/lib/railway_ipc/version.rb +1 -1
- data/priv/migrations/add_railway_ipc_consumed_messages.rb +3 -3
- data/railway_ipc.gemspec +1 -0
- metadata +4 -6
- data/CHANGELOG.MD +0 -43
- data/lib/railway_ipc/consumer/consumer_response_handlers.rb +0 -16
- data/lib/railway_ipc/handler_manifest.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 444dfeb8a9729ca23276ce6f4a899589a646c93d3671fb517ab81d0fdc85958e
|
4
|
+
data.tar.gz: 9ede7408f2a428cf3345ef3b8aa684c6aa3fe43a6d460ef7eb6866a99f46fe71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d15afcbeec8272d7e9b3c9e589f7ed88ffc8fb50fbf370cbaabf596a753e435bd7c67980668c7ce27d13b1b4dff7adf2b4b11f3b7c2f28ec224295bfc7f8ec69
|
7
|
+
data.tar.gz: 1d39cf3abce42366a096a83d15f8a287e32fbb7ef239fd17f04707ef0eed9fc7c5e3c06e129b4e4345871def82914a740fc6cab5039cc5d2934886342207aa67
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [Unreleased]
|
8
|
+
### Added
|
9
|
+
### Changed
|
10
|
+
### Removed
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
## [2.0.3] - 2020-09-02
|
14
|
+
### Fixed
|
15
|
+
* Fix RPC server. RPC servers need to conform to the Sneaker worker API (i.e. their initializers need to be able to accept queue name / pool and they require a `stop` method.
|
16
|
+
|
17
|
+
## [2.0.2] - 2020-08-27
|
18
|
+
### Changed
|
19
|
+
* RPC `RailwayIpc::Client` does not need to log the queue name.
|
20
|
+
|
21
|
+
## [2.0.1] - 2020-08-24
|
22
|
+
### Fixed
|
23
|
+
* `RailwayIpc::Logger` now handles block syntax (i.e. `logger.info { 'my message' }`) correctly.
|
24
|
+
|
25
|
+
## [2.0.0] - 2020-08-20
|
26
|
+
### Added
|
27
|
+
* Several additions to internal logging:
|
28
|
+
- Log messages now include a `feature` key. This can be used by logging aggregator tools to group log messages across different systems that use the gem. If one isn't provided a default value of `railway_ipc` is used.
|
29
|
+
- Protobufs are logged as a sub-hash which contains both the protobuf type and payload.
|
30
|
+
- Exchange and queue names are logged where applicable.
|
31
|
+
- The internal Bunny connection now uses the `RailwayIpc::Logger` instead of a generic `Logger`.
|
32
|
+
|
33
|
+
### Changed
|
34
|
+
* *Breaking Change* `RailwayIpc.configure` now takes `device`, `level`, and `formatter` instead of a complete `Logger` instance. The instance is now managed internally by Railway. This is a breaking change to the `RailwayIpc.configure` API, clients will need to be updated to use the new syntax.
|
35
|
+
|
36
|
+
## [1.1.0] - 2020-08-07
|
37
|
+
### Changed
|
38
|
+
* allow multiple consumers to handle the same message
|
39
|
+
* consumed messages table requires its own primary key due to ActiveRecord not having support for composite primary keys
|
40
|
+
|
41
|
+
## [1.0.1] - 2020-07-23
|
42
|
+
### Fixed
|
43
|
+
* Fix publisher connection by using default connection if one isn't provided
|
44
|
+
|
45
|
+
## [1.0.0] - 2020-07-20
|
46
|
+
### Added
|
47
|
+
* CircleCI build that runs the specs
|
48
|
+
* Rubocop (also ran by CircleCI)
|
49
|
+
* New error types for incoming messages
|
50
|
+
* RailwayIpc::Messages::Unknown protobuf
|
51
|
+
|
52
|
+
### Changed
|
53
|
+
* Refactored worker to use ProcessIncomingMessage and IncomingMessage abstractions
|
54
|
+
* Moved decoding logic from ConsumedMessage to IncomingMessage
|
55
|
+
* Removed STATUSES constant from ConsumedMessage
|
56
|
+
* Publisher is no longer a Singleton; kept a Singleton version of the Publisher for backwards compatibility that gives a "deprecated" warning
|
57
|
+
|
58
|
+
### Removed
|
59
|
+
* Removed `BaseMessage` protobuf
|
60
|
+
* NullMessage and NullHandler were removed
|
61
|
+
|
62
|
+
### Fixed
|
63
|
+
* Fixed all Rubocop warnings and errors
|
64
|
+
|
65
|
+
## [0.1.7] - 2020-06-29
|
66
|
+
### Added
|
67
|
+
- Correlation ID and message UUID are auto generated for messages for IDs are not passed in [#23](https://github.com/learn-co/railway_ipc_gem/pull/23)
|
68
|
+
|
69
|
+
[Unreleased]: https://github.com/learn-co/railway_ipc_gem/compare/v2.0.3...HEAD
|
70
|
+
[2.0.3]: https://github.com/learn-co/railway_ipc_gem/compare/v2.0.2...v2.0.3
|
71
|
+
[2.0.2]: https://github.com/learn-co/railway_ipc_gem/compare/v2.0.1...v2.0.2
|
72
|
+
[2.0.1]: https://github.com/learn-co/railway_ipc_gem/compare/v2.0.0...v2.0.1
|
73
|
+
[2.0.0]: https://github.com/learn-co/railway_ipc_gem/compare/v1.1.0...v2.0.0
|
74
|
+
[1.1.0]: https://github.com/learn-co/railway_ipc_gem/compare/v1.0.1...v1.1.0
|
75
|
+
[1.0.1]: https://github.com/learn-co/railway_ipc_gem/compare/v1.0.0...v1.0.1
|
76
|
+
[1.0.0]: https://github.com/learn-co/railway_ipc_gem/compare/v0.1.7...v1.0.0
|
77
|
+
[0.1.7]: https://github.com/learn-co/railway_ipc_gem/releases/tag/v0.1.7
|
data/README.md
CHANGED
data/lib/railway_ipc.rb
CHANGED
@@ -29,16 +29,12 @@ module RailwayIpc
|
|
29
29
|
Rake::Task['sneakers:run'].invoke
|
30
30
|
end
|
31
31
|
|
32
|
-
def self.configure(
|
33
|
-
@logger = RailwayIpc::Logger.new(
|
32
|
+
def self.configure(log_device=STDOUT, level=::Logger::INFO, log_formatter=nil)
|
33
|
+
@logger = RailwayIpc::Logger.new(log_device, level, log_formatter)
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.logger
|
37
|
-
@logger || RailwayIpc::Logger.new(
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.bunny_logger
|
41
|
-
logger.logger
|
37
|
+
@logger || RailwayIpc::Logger.new(STDOUT)
|
42
38
|
end
|
43
39
|
|
44
40
|
def self.bunny_connection
|
@@ -1,10 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'railway_ipc/consumer/consumer_response_handlers'
|
4
|
-
|
5
3
|
module RailwayIpc
|
6
4
|
class Consumer
|
7
5
|
include Sneakers::Worker
|
6
|
+
def self.inherited(base)
|
7
|
+
base.instance_eval do
|
8
|
+
def handlers
|
9
|
+
@handlers ||= RailwayIpc::HandlerStore.new
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
8
13
|
|
9
14
|
def self.listen_to(queue:, exchange:)
|
10
15
|
from_queue queue,
|
@@ -15,11 +20,15 @@ module RailwayIpc
|
|
15
20
|
end
|
16
21
|
|
17
22
|
def self.handle(message_type, with:)
|
18
|
-
|
23
|
+
handlers.register(message: message_type, handler: with)
|
24
|
+
end
|
25
|
+
|
26
|
+
def handlers
|
27
|
+
self.class.handlers
|
19
28
|
end
|
20
29
|
|
21
30
|
def registered_handlers
|
22
|
-
|
31
|
+
handlers.registered
|
23
32
|
end
|
24
33
|
|
25
34
|
def queue_name
|
@@ -35,17 +44,19 @@ module RailwayIpc
|
|
35
44
|
RailwayIpc::ProcessIncomingMessage.call(self, message)
|
36
45
|
ack!
|
37
46
|
rescue StandardError => e
|
38
|
-
RailwayIpc.logger.
|
39
|
-
|
47
|
+
RailwayIpc.logger.error(
|
48
|
+
e.message,
|
49
|
+
feature: 'railway_ipc_consumer',
|
50
|
+
exchange: exchange_name,
|
51
|
+
queue: queue_name,
|
40
52
|
error: e.class,
|
41
|
-
error_message: e.message,
|
42
53
|
payload: payload
|
43
54
|
)
|
44
55
|
raise e
|
45
56
|
end
|
46
57
|
|
47
58
|
def get_handler(type)
|
48
|
-
manifest =
|
59
|
+
manifest = handlers.get(type)
|
49
60
|
manifest ? manifest.handler.new : nil
|
50
61
|
end
|
51
62
|
end
|
@@ -16,8 +16,9 @@ module RailwayIpc
|
|
16
16
|
|
17
17
|
def run
|
18
18
|
logger.warn(
|
19
|
-
incoming_message.
|
20
|
-
|
19
|
+
"Ignoring unknown message of type '#{incoming_message.type}'",
|
20
|
+
feature: 'railway_ipc_consumer',
|
21
|
+
protobuf: { type: incoming_message.type, data: incoming_message.decoded }
|
21
22
|
)
|
22
23
|
end
|
23
24
|
end
|
@@ -36,8 +37,9 @@ module RailwayIpc
|
|
36
37
|
|
37
38
|
def run
|
38
39
|
logger.warn(
|
39
|
-
incoming_message.
|
40
|
-
|
40
|
+
"Ignoring message, no registered handler for '#{incoming_message.type}'",
|
41
|
+
feature: 'railway_ipc_consumer',
|
42
|
+
protobuf: { type: incoming_message.type, data: incoming_message.decoded }
|
41
43
|
)
|
42
44
|
end
|
43
45
|
end
|
@@ -81,16 +83,21 @@ module RailwayIpc
|
|
81
83
|
|
82
84
|
def raise_message_invalid_error
|
83
85
|
error = "Message is invalid: #{incoming_message.stringify_errors}."
|
84
|
-
logger.error(
|
86
|
+
logger.error(
|
87
|
+
error,
|
88
|
+
feature: 'railway_ipc_consumer',
|
89
|
+
exchange: consumer.exchange_name,
|
90
|
+
queue: consumer.queue_name,
|
91
|
+
protobuf: { type: incoming_message.class, data: incoming_message.decoded }
|
92
|
+
)
|
85
93
|
raise RailwayIpc::IncomingMessage::InvalidMessage.new(error)
|
86
94
|
end
|
87
95
|
|
88
96
|
def find_or_create_consumed_message
|
89
|
-
RailwayIpc::ConsumedMessage.find_by(uuid: incoming_message.uuid) ||
|
97
|
+
RailwayIpc::ConsumedMessage.find_by(uuid: incoming_message.uuid, queue: consumer.queue_name) ||
|
90
98
|
RailwayIpc::ConsumedMessage.create_processing(consumer, incoming_message)
|
91
99
|
end
|
92
100
|
|
93
|
-
# rubocop:disable Metrics/AbcSize
|
94
101
|
def classify_message
|
95
102
|
if incoming_message.decoded.is_a?(RailwayIpc::Messages::Unknown)
|
96
103
|
UnknownMessageJob.new(incoming_message, logger)
|
@@ -100,6 +107,5 @@ module RailwayIpc
|
|
100
107
|
IgnoredMessageJob.new(incoming_message, logger)
|
101
108
|
end
|
102
109
|
end
|
103
|
-
# rubocop:enable Metrics/AbcSize
|
104
110
|
end
|
105
111
|
end
|
data/lib/railway_ipc/handler.rb
CHANGED
@@ -11,15 +11,27 @@ module RailwayIpc
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def handle(message)
|
14
|
-
RailwayIpc.logger.info(
|
14
|
+
RailwayIpc.logger.info('Handling message', log_message_options(message))
|
15
15
|
response = self.class.block.call(message)
|
16
16
|
if response.success?
|
17
|
-
RailwayIpc.logger.info(
|
17
|
+
RailwayIpc.logger.info('Successfully handled message', log_message_options(message))
|
18
18
|
else
|
19
|
-
RailwayIpc.logger.error(
|
19
|
+
RailwayIpc.logger.error('Failed to handle message', log_message_options(message))
|
20
20
|
end
|
21
21
|
|
22
22
|
response
|
23
23
|
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def log_message_options(message)
|
28
|
+
{
|
29
|
+
feature: 'railway_ipc_consumer',
|
30
|
+
protobuf: {
|
31
|
+
type: message.class.name,
|
32
|
+
data: message
|
33
|
+
}
|
34
|
+
}
|
35
|
+
end
|
24
36
|
end
|
25
37
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'railway_ipc/handler_manifest'
|
4
3
|
module RailwayIpc
|
4
|
+
HandlerManifest = Struct.new(:message, :handler)
|
5
5
|
class HandlerStore
|
6
6
|
attr_reader :handler_map
|
7
7
|
|
@@ -14,7 +14,7 @@ module RailwayIpc
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def register(message:, handler:)
|
17
|
-
handler_map[message.to_s] = HandlerManifest.new(message
|
17
|
+
handler_map[message.to_s] = HandlerManifest.new(message, handler)
|
18
18
|
end
|
19
19
|
|
20
20
|
def get(response_message)
|
data/lib/railway_ipc/logger.rb
CHANGED
@@ -1,36 +1,53 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module RailwayIpc
|
4
|
+
# Custom logger that accepts a `device`, `level`, and `formatter`.
|
5
|
+
# `formatter` can be any object that responds to `call`; a
|
6
|
+
# `Logger::Formatter` is used if the argument is not provided.
|
7
|
+
#
|
8
|
+
# Here is an example formatter that uses `Oj` to format structured log
|
9
|
+
# messages:
|
10
|
+
#
|
11
|
+
# require 'oj'
|
12
|
+
# OjFormatter = proc do |severity, datetime, progname, data|
|
13
|
+
# data.merge!(
|
14
|
+
# name: progname,
|
15
|
+
# timestamp: datetime,
|
16
|
+
# severity: severity
|
17
|
+
# )
|
18
|
+
# Oj.dump(data, { mode: :compat, time_format: :xmlschema })
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# logger = RailwayIpc::Logger.new(STDOUT, Logger::INFO, OjFormatter)
|
22
|
+
#
|
4
23
|
class Logger
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@logger =
|
9
|
-
end
|
10
|
-
|
11
|
-
def info(message, statement)
|
12
|
-
logger.info("[#{message_header(message)}] #{statement}")
|
24
|
+
def initialize(device=STDOUT, level=::Logger::INFO, formatter=nil)
|
25
|
+
@logger = ::Logger.new(device)
|
26
|
+
@logger.level = level
|
27
|
+
@logger.formatter = formatter if formatter
|
13
28
|
end
|
14
29
|
|
15
|
-
|
16
|
-
|
30
|
+
%w[fatal error warn info debug].each do |level|
|
31
|
+
define_method(level) do |message=nil, data={}, &block|
|
32
|
+
data.merge!(feature: 'railway_ipc') unless data.key?(:feature)
|
33
|
+
return logger.send(level, data.merge(message: message)) unless block
|
34
|
+
|
35
|
+
data = message.merge(data) if message&.is_a?(Hash)
|
36
|
+
data.merge!(message: block.call)
|
37
|
+
|
38
|
+
# This is for compatability w/ Ruby's Logger. Ruby's Logger class
|
39
|
+
# assumes that if both a `message` argument and a block are given,
|
40
|
+
# that the block contains the actual message. The `message` argument
|
41
|
+
# is assumed to be the `progname`.
|
42
|
+
#
|
43
|
+
# https://github.com/ruby/logger/blob/master/lib/logger.rb#L471
|
44
|
+
data.merge!(progname: message) if message&.is_a?(String)
|
45
|
+
logger.send(level, data)
|
46
|
+
end
|
17
47
|
end
|
18
48
|
|
19
|
-
|
20
|
-
logger.debug("[#{message_header(message)}] #{statement}")
|
21
|
-
end
|
49
|
+
private
|
22
50
|
|
23
|
-
|
24
|
-
logger.error("[#{message_header(message)}] #{statement}")
|
25
|
-
end
|
26
|
-
|
27
|
-
def log_exception(exception)
|
28
|
-
logger.error(exception)
|
29
|
-
end
|
30
|
-
|
31
|
-
def message_header(message)
|
32
|
-
log_statement = "message type: #{message.class}, uuid: #{message.uuid}, correlation_id: #{message.correlation_id}"
|
33
|
-
message.respond_to?(:user_uuid) ? "#{log_statement}, user_uuid: #{message.user_uuid}" : log_statement
|
34
|
-
end
|
51
|
+
attr_reader :logger
|
35
52
|
end
|
36
53
|
end
|
@@ -21,16 +21,15 @@ module RailwayIpc
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def publish(message, published_message_store=RailwayIpc::PublishedMessage)
|
24
|
-
RailwayIpc.logger.
|
24
|
+
RailwayIpc.logger.warn('DEPRECATED: Use new PublisherInstance class', log_message_options)
|
25
25
|
ensure_message_uuid(message)
|
26
26
|
ensure_correlation_id(message)
|
27
|
-
RailwayIpc.logger.info(
|
28
|
-
|
27
|
+
RailwayIpc.logger.info('Publishing message', log_message_options(message))
|
29
28
|
result = super(RailwayIpc::Rabbitmq::Payload.encode(message))
|
30
29
|
published_message_store.store_message(self.class.exchange_name, message)
|
31
30
|
result
|
32
31
|
rescue RailwayIpc::InvalidProtobuf => e
|
33
|
-
RailwayIpc.logger.error(
|
32
|
+
RailwayIpc.logger.error('Invalid protobuf', log_message_options(message))
|
34
33
|
raise e
|
35
34
|
end
|
36
35
|
|
@@ -45,6 +44,11 @@ module RailwayIpc
|
|
45
44
|
message.correlation_id = SecureRandom.uuid if message.correlation_id.blank?
|
46
45
|
message
|
47
46
|
end
|
47
|
+
|
48
|
+
def log_message_options(message=nil)
|
49
|
+
options = { feature: 'railway_ipc_publisher', exchange: self.class.exchange_name }
|
50
|
+
message.nil? ? options : options.merge(protobuf: { type: message.class, data: message })
|
51
|
+
end
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
@@ -68,20 +72,33 @@ module RailwayIpc
|
|
68
72
|
def publish(message)
|
69
73
|
message.uuid = SecureRandom.uuid if message.uuid.blank?
|
70
74
|
message.correlation_id = SecureRandom.uuid if message.correlation_id.blank?
|
71
|
-
RailwayIpc.logger.info(
|
75
|
+
RailwayIpc.logger.info('Publishing message', log_message_options(message))
|
72
76
|
|
73
77
|
stored_message = message_store.store_message(exchange_name, message)
|
74
78
|
super(RailwayIpc::Rabbitmq::Payload.encode(message))
|
75
79
|
rescue RailwayIpc::InvalidProtobuf => e
|
76
|
-
RailwayIpc.logger.error(
|
80
|
+
RailwayIpc.logger.error('Invalid protobuf', log_message_options(message))
|
77
81
|
raise e
|
78
82
|
rescue ActiveRecord::RecordInvalid => e
|
79
|
-
RailwayIpc.logger.error(
|
83
|
+
RailwayIpc.logger.error('Failed to store outgoing message', log_message_options(message))
|
80
84
|
raise RailwayIpc::FailedToStoreOutgoingMessage.new(e)
|
81
85
|
rescue StandardError => e
|
82
86
|
stored_message&.destroy
|
83
87
|
raise e
|
84
88
|
end
|
85
89
|
# rubocop:enable Metrics/AbcSize
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def log_message_options(message)
|
94
|
+
{
|
95
|
+
feature: 'railway_ipc_publisher',
|
96
|
+
exchange: exchange_name,
|
97
|
+
protobuf: {
|
98
|
+
type: message.class,
|
99
|
+
data: message
|
100
|
+
}
|
101
|
+
}
|
102
|
+
end
|
86
103
|
end
|
87
104
|
end
|
@@ -11,7 +11,11 @@ module RailwayIpc
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def respond(request)
|
14
|
-
RailwayIpc.logger.info(
|
14
|
+
RailwayIpc.logger.info(
|
15
|
+
'Responding to request',
|
16
|
+
protobuf: { type: request.class, data: request },
|
17
|
+
feature: 'railway_ipc_request'
|
18
|
+
)
|
15
19
|
response = self.class.block.call(request)
|
16
20
|
raise ResponseTypeError.new(response.class) unless response.is_a?(Google::Protobuf::MessageExts)
|
17
21
|
|
@@ -44,7 +44,12 @@ module RailwayIpc
|
|
44
44
|
case decoded_payload.type
|
45
45
|
when *registered_handlers
|
46
46
|
@message = get_message_class(decoded_payload).decode(decoded_payload.message)
|
47
|
-
RailwayIpc.logger.info(
|
47
|
+
RailwayIpc.logger.info(
|
48
|
+
'Handling response',
|
49
|
+
feature: 'railway_ipc_consumer',
|
50
|
+
exchange: self.class.exchange_name,
|
51
|
+
protobuf: { type: message.class, data: message }
|
52
|
+
)
|
48
53
|
RailwayIpc::Response.new(message, success: true)
|
49
54
|
else
|
50
55
|
@message = LearnIpc::ErrorMessage.decode(decoded_payload.message)
|
@@ -78,10 +83,11 @@ module RailwayIpc
|
|
78
83
|
private
|
79
84
|
|
80
85
|
def log_exception(exception, payload)
|
81
|
-
RailwayIpc.logger.
|
82
|
-
|
86
|
+
RailwayIpc.logger.error(
|
87
|
+
exception.message,
|
88
|
+
feature: 'railway_ipc_consumer',
|
89
|
+
exchange: self.class.exchange_name,
|
83
90
|
error: exception.class,
|
84
|
-
error_message: exception.message,
|
85
91
|
payload: decode_for_error(exception, payload)
|
86
92
|
)
|
87
93
|
end
|
@@ -99,7 +105,12 @@ module RailwayIpc
|
|
99
105
|
end
|
100
106
|
|
101
107
|
def publish_message
|
102
|
-
RailwayIpc.logger.info(
|
108
|
+
RailwayIpc.logger.info(
|
109
|
+
'Sending request',
|
110
|
+
feature: 'railway_ipc_publisher',
|
111
|
+
exchange: self.class.exchange_name,
|
112
|
+
protobuf: { type: request_message.class, data: request_message }
|
113
|
+
)
|
103
114
|
rabbit_connection.publish(RailwayIpc::Rabbitmq::Payload.encode(request_message), routing_key: '')
|
104
115
|
end
|
105
116
|
|
@@ -14,7 +14,7 @@ module RailwayIpc
|
|
14
14
|
RailwayIpc::RPC::ServerResponseHandlers.instance.register(handler: with, message: message_type)
|
15
15
|
end
|
16
16
|
|
17
|
-
def initialize(opts={ automatic_recovery: true }, rabbit_adapter: RailwayIpc::Rabbitmq::Adapter)
|
17
|
+
def initialize(_queue, _pool, opts={ automatic_recovery: true }, rabbit_adapter: RailwayIpc::Rabbitmq::Adapter)
|
18
18
|
@rabbit_connection = rabbit_adapter.new(
|
19
19
|
queue_name: self.class.queue_name,
|
20
20
|
exchange_name: self.class.exchange_name,
|
@@ -31,6 +31,10 @@ module RailwayIpc
|
|
31
31
|
subscribe_to_queue
|
32
32
|
end
|
33
33
|
|
34
|
+
def stop
|
35
|
+
rabbit_connection.disconnect
|
36
|
+
end
|
37
|
+
|
34
38
|
# rubocop:disable Metrics/AbcSize
|
35
39
|
# rubocop:disable Metrics/MethodLength
|
36
40
|
def work(payload)
|
@@ -45,10 +49,12 @@ module RailwayIpc
|
|
45
49
|
raise RailwayIpc::UnhandledMessageError.new("#{self.class} does not know how to handle #{decoded_payload.type}")
|
46
50
|
end
|
47
51
|
rescue StandardError => e
|
48
|
-
RailwayIpc.logger.
|
49
|
-
|
52
|
+
RailwayIpc.logger.error(
|
53
|
+
e.message,
|
54
|
+
feature: 'railway_ipc_consumer',
|
55
|
+
exchange: self.class.exchange_name,
|
56
|
+
queue: self.class.queue_name,
|
50
57
|
error: e.class,
|
51
|
-
error_message: e.message,
|
52
58
|
payload: payload
|
53
59
|
)
|
54
60
|
raise e
|
@@ -57,10 +63,18 @@ module RailwayIpc
|
|
57
63
|
# rubocop:enable Metrics/MethodLength
|
58
64
|
|
59
65
|
# rubocop:disable Metrics/AbcSize
|
66
|
+
# rubocop:disable Metrics/MethodLength
|
60
67
|
def handle_request(payload)
|
61
68
|
response = work(payload)
|
62
69
|
rescue StandardError => e
|
63
|
-
RailwayIpc.logger.error(
|
70
|
+
RailwayIpc.logger.error(
|
71
|
+
'Error responding to message.',
|
72
|
+
exception: e,
|
73
|
+
feature: 'railway_ipc_consumer',
|
74
|
+
exchange: self.class.exchange_name,
|
75
|
+
queue: self.class.queue_name,
|
76
|
+
protobuf: { type: message.class, data: message }
|
77
|
+
)
|
64
78
|
response = self.class.rpc_error_adapter_class.error_message(e, message)
|
65
79
|
ensure
|
66
80
|
if response
|
@@ -70,6 +84,7 @@ module RailwayIpc
|
|
70
84
|
end
|
71
85
|
end
|
72
86
|
# rubocop:enable Metrics/AbcSize
|
87
|
+
# rubocop:enable Metrics/MethodLength
|
73
88
|
|
74
89
|
private
|
75
90
|
|
data/lib/railway_ipc/version.rb
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
|
3
3
|
class AddRailwayIpcConsumedMessages < ActiveRecord::Migration
|
4
4
|
def change
|
5
|
-
create_table :railway_ipc_consumed_messages
|
5
|
+
create_table :railway_ipc_consumed_messages do |t|
|
6
6
|
t.uuid :uuid, null: false
|
7
7
|
t.string :message_type
|
8
8
|
t.uuid :user_uuid
|
9
9
|
t.uuid :correlation_id
|
10
10
|
t.text :encoded_message
|
11
11
|
t.string :status, null: false
|
12
|
-
t.string :queue
|
12
|
+
t.string :queue, null: false
|
13
13
|
t.string :exchange
|
14
14
|
|
15
15
|
t.datetime :updated_at
|
16
16
|
t.datetime :inserted_at
|
17
17
|
end
|
18
18
|
|
19
|
-
add_index :railway_ipc_consumed_messages,
|
19
|
+
add_index :railway_ipc_consumed_messages, %i[uuid queue], unique: true
|
20
20
|
end
|
21
21
|
end
|
data/railway_ipc.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: railway-ipc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -213,7 +213,7 @@ extensions: []
|
|
213
213
|
extra_rdoc_files: []
|
214
214
|
files:
|
215
215
|
- ".gitignore"
|
216
|
-
- CHANGELOG.
|
216
|
+
- CHANGELOG.md
|
217
217
|
- CODE_OF_CONDUCT.md
|
218
218
|
- Gemfile
|
219
219
|
- LICENSE.txt
|
@@ -226,11 +226,9 @@ files:
|
|
226
226
|
- lib/railway_ipc.rb
|
227
227
|
- lib/railway_ipc/Rakefile
|
228
228
|
- lib/railway_ipc/consumer/consumer.rb
|
229
|
-
- lib/railway_ipc/consumer/consumer_response_handlers.rb
|
230
229
|
- lib/railway_ipc/consumer/process_incoming_message.rb
|
231
230
|
- lib/railway_ipc/errors.rb
|
232
231
|
- lib/railway_ipc/handler.rb
|
233
|
-
- lib/railway_ipc/handler_manifest.rb
|
234
232
|
- lib/railway_ipc/handler_store.rb
|
235
233
|
- lib/railway_ipc/incoming_message.rb
|
236
234
|
- lib/railway_ipc/logger.rb
|
@@ -273,7 +271,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
273
271
|
requirements:
|
274
272
|
- - ">="
|
275
273
|
- !ruby/object:Gem::Version
|
276
|
-
version: '
|
274
|
+
version: '2.5'
|
277
275
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
278
276
|
requirements:
|
279
277
|
- - ">="
|
data/CHANGELOG.MD
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# Changelog
|
2
|
-
All notable changes to this project will be documented in this file.
|
3
|
-
|
4
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
|
-
|
7
|
-
## [Unreleased]
|
8
|
-
### Added
|
9
|
-
### Changed
|
10
|
-
### Removed
|
11
|
-
### Fixed
|
12
|
-
|
13
|
-
## [1.0.1] - 2020-07-23
|
14
|
-
### Fixed
|
15
|
-
* Fix publisher connection by using default connection if one isn't provided
|
16
|
-
|
17
|
-
## [1.0.0] - 2020-07-20
|
18
|
-
### Added
|
19
|
-
* CircleCI build that runs the specs
|
20
|
-
* Rubocop (also ran by CircleCI)
|
21
|
-
* New error types for incoming messages
|
22
|
-
* RailwayIpc::Messages::Unknown protobuf
|
23
|
-
|
24
|
-
### Changed
|
25
|
-
* Refactored worker to use ProcessIncomingMessage and IncomingMessage abstractions
|
26
|
-
* Moved decoding logic from ConsumedMessage to IncomingMessage
|
27
|
-
* Removed STATUSES constant from ConsumedMessage
|
28
|
-
* Publisher is no longer a Singleton; kept a Singleton version of the Publisher for backwards compatibility that gives a "deprecated" warning
|
29
|
-
|
30
|
-
### Removed
|
31
|
-
* Removed `BaseMessage` protobuf
|
32
|
-
* NullMessage and NullHandler were removed
|
33
|
-
|
34
|
-
### Fixed
|
35
|
-
* Fixed all Rubocop warnings and errors
|
36
|
-
|
37
|
-
## [0.1.7] - 2020-06-29
|
38
|
-
### Added
|
39
|
-
- Correlation ID and message UUID are auto generated for messages for IDs are not passed in [#23](https://github.com/learn-co/railway_ipc_gem/pull/23)
|
40
|
-
|
41
|
-
[Unreleased]: https://github.com/learn-co/railway_ipc_gem/compare/v1.0.0...HEAD
|
42
|
-
[1.0.0]: https://github.com/learn-co/railway_ipc_gem/compare/v0.1.7...v1.0.0
|
43
|
-
[0.1.7]: https://github.com/learn-co/railway_ipc_gem/releases/tag/v0.1.7
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'railway_ipc/handler_store'
|
4
|
-
module RailwayIpc
|
5
|
-
class ConsumerResponseHandlers
|
6
|
-
include Singleton
|
7
|
-
extend Forwardable
|
8
|
-
def_delegators :handler_store, :registered, :register, :get
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def handler_store
|
13
|
-
@handler_store ||= RailwayIpc::HandlerStore.new
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|