manageiq-messaging 0.1.4 → 0.1.5
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/CHANGES +3 -0
- data/README.md +18 -0
- data/lib/manageiq/messaging/client.rb +2 -0
- data/lib/manageiq/messaging/kafka/common.rb +21 -5
- data/lib/manageiq/messaging/kafka/queue.rb +1 -1
- data/lib/manageiq/messaging/received_message.rb +3 -3
- data/lib/manageiq/messaging/stomp/common.rb +8 -0
- data/lib/manageiq/messaging/stomp/queue.rb +7 -1
- data/lib/manageiq/messaging/stomp/topic.rb +3 -1
- data/lib/manageiq/messaging/version.rb +1 -1
- data/manageiq-messaging.gemspec +2 -1
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d0c0df7c314aa421d82df4122b949a0c3a1bdb10619e77de5e56453b363d339
|
4
|
+
data.tar.gz: 41d110a2e0625e016ba6e9744cfa0c2cf3ae58dae9944aa0ac144b5dbc144905
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9abed064106ee030cd2dd04a7571f91f51f75d2a97bf0c2c15be5a36c8150f8cf910c6c8e4b47c47a659ca4e2134e45798d2c78a62fbe1e92c10adafdfde9b31
|
7
|
+
data.tar.gz: ea8f2f8c8c7712cc91a7f27a47af03ebdbee2fe1366c05b185bf0293bab04d967e190c5b8914389c9c8db2ce82dd13a9b927ae57c9076a0af0cada7e36294481
|
data/CHANGES
CHANGED
@@ -11,3 +11,6 @@
|
|
11
11
|
= 0.1.4 - 3-Apr-2019
|
12
12
|
* Add an #ack method to a ReceivedMessage to simplify manual acknowledgements
|
13
13
|
* Allow caller to provide a session_timeout to kafka consumers, default of 30sec
|
14
|
+
|
15
|
+
= 0.1.5 - 6-Jun-2019
|
16
|
+
* Allow caller to provide extra headers to the message
|
data/README.md
CHANGED
@@ -156,6 +156,24 @@ This is the one-to-many publish/subscribe pattern. Multiple subscribers can subs
|
|
156
156
|
|
157
157
|
By default, events are delivered to live subscribers only. Some messaging systems support persistence with options.
|
158
158
|
|
159
|
+
### Add your own headers to a message (Queue or Topic)
|
160
|
+
|
161
|
+
If you want you can add in your own headers to the send message
|
162
|
+
|
163
|
+
```
|
164
|
+
client.publish_topic(
|
165
|
+
:service => 'provider_events',
|
166
|
+
:event => 'powered_on',
|
167
|
+
:headers => {:request_id => "12345"},
|
168
|
+
:payload => {:ems_ref => 'uid987'}
|
169
|
+
|
170
|
+
)
|
171
|
+
|
172
|
+
client.subscribe_topic(:service => 'provider_events', :persist_ref => 'automate_1') do |msg|
|
173
|
+
puts "Received event #{msg.message} with request-id: #{msg.headers['request_id']}"
|
174
|
+
end
|
175
|
+
```
|
176
|
+
|
159
177
|
## Development
|
160
178
|
|
161
179
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -58,6 +58,7 @@ module ManageIQ
|
|
58
58
|
# * :message (e.g. method name or message type)
|
59
59
|
# * :payload (message body, a string or an user object that can be serialized)
|
60
60
|
# * :sender (optional, identify the sender)
|
61
|
+
# * :headers (optional, additional headers to add to the message)
|
61
62
|
# Other options are underlying messaging system specific.
|
62
63
|
#
|
63
64
|
# Optionally a call back block can be provided to wait on the consumer to send
|
@@ -164,6 +165,7 @@ module ManageIQ
|
|
164
165
|
# * :event (event name)
|
165
166
|
# * :payload (message body, a string or an user object that can be serialized)
|
166
167
|
# * :sender (optional, identify the sender)
|
168
|
+
# * :headers (optional, additional headers to add to the message)
|
167
169
|
# Other options are underlying messaging system specific.
|
168
170
|
#
|
169
171
|
def publish_topic(options)
|
@@ -53,6 +53,7 @@ module ManageIQ
|
|
53
53
|
body, kafka_opts = for_publish(options)
|
54
54
|
kafka_opts[:headers][:message_type] = options[:message] if options[:message]
|
55
55
|
kafka_opts[:headers][:class_name] = options[:class_name] if options[:class_name]
|
56
|
+
kafka_opts[:headers].merge!(options[:headers].except(*message_header_keys)) if options.key?(:headers)
|
56
57
|
|
57
58
|
[body, kafka_opts]
|
58
59
|
end
|
@@ -60,13 +61,15 @@ module ManageIQ
|
|
60
61
|
def topic_for_publish(options)
|
61
62
|
body, kafka_opts = for_publish(options)
|
62
63
|
kafka_opts[:headers][:event_type] = options[:event] if options[:event]
|
64
|
+
kafka_opts[:headers].merge!(options[:headers].except(*event_header_keys)) if options.key?(:headers)
|
63
65
|
|
64
66
|
[body, kafka_opts]
|
65
67
|
end
|
66
68
|
|
67
69
|
def for_publish(options)
|
68
|
-
kafka_opts = {:topic => address(options)
|
69
|
-
kafka_opts[:partition_key]
|
70
|
+
kafka_opts = {:topic => address(options)}
|
71
|
+
kafka_opts[:partition_key] = options[:group_name] if options[:group_name]
|
72
|
+
kafka_opts[:headers] = {}
|
70
73
|
kafka_opts[:headers][:sender] = options[:sender] if options[:sender]
|
71
74
|
|
72
75
|
body = options[:payload] || ''
|
@@ -85,26 +88,39 @@ module ManageIQ
|
|
85
88
|
def process_queue_message(queue, message)
|
86
89
|
payload = decode_body(message.headers, message.value)
|
87
90
|
sender, message_type, class_name = parse_message_headers(message.headers)
|
91
|
+
client_headers = message.headers.except(*message_header_keys)
|
92
|
+
|
88
93
|
logger.info("Message received: queue(#{queue}), message(#{payload_log(payload)}), sender(#{sender}), type(#{message_type})")
|
89
|
-
[sender, message_type, class_name, payload]
|
94
|
+
[sender, message_type, class_name, payload, client_headers]
|
90
95
|
end
|
91
96
|
|
92
97
|
def process_topic_message(topic, message)
|
93
98
|
begin
|
94
99
|
payload = decode_body(message.headers, message.value)
|
95
100
|
sender, event_type = parse_event_headers(message.headers)
|
101
|
+
client_headers = message.headers.except(*event_header_keys)
|
102
|
+
|
96
103
|
logger.info("Event received: topic(#{topic}), event(#{payload_log(payload)}), sender(#{sender}), type(#{event_type})")
|
97
|
-
yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, payload, message, self)
|
104
|
+
yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, payload, client_headers, message, self)
|
98
105
|
logger.info("Event processed")
|
99
106
|
rescue StandardError => e
|
100
107
|
logger.error("Event processing error: #{e.message}")
|
101
108
|
logger.error(e.backtrace.join("\n"))
|
109
|
+
raise
|
102
110
|
end
|
103
111
|
end
|
104
112
|
|
113
|
+
def message_header_keys
|
114
|
+
['sender', 'message_type', 'class_name']
|
115
|
+
end
|
116
|
+
|
105
117
|
def parse_message_headers(headers)
|
106
118
|
return [nil, nil, nil] unless headers.kind_of?(Hash)
|
107
|
-
headers.values_at(
|
119
|
+
headers.values_at(*message_header_keys)
|
120
|
+
end
|
121
|
+
|
122
|
+
def event_header_keys
|
123
|
+
['sender', 'event_type']
|
108
124
|
end
|
109
125
|
|
110
126
|
def parse_event_headers(headers)
|
@@ -29,7 +29,7 @@ module ManageIQ
|
|
29
29
|
begin
|
30
30
|
messages = batch.messages.collect do |message|
|
31
31
|
sender, message_type, _class_name, payload = process_queue_message(topic, message)
|
32
|
-
ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, payload, message, self)
|
32
|
+
ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, payload, headers, message, self)
|
33
33
|
end
|
34
34
|
|
35
35
|
yield messages
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module ManageIQ
|
2
2
|
module Messaging
|
3
3
|
class ReceivedMessage
|
4
|
-
attr_accessor :sender, :message, :payload, :ack_ref, :client
|
4
|
+
attr_accessor :sender, :message, :payload, :headers, :ack_ref, :client
|
5
5
|
|
6
|
-
def initialize(sender, message, payload, ack_ref, client)
|
7
|
-
@sender, @message, @payload, @ack_ref, @client = sender, message, payload, ack_ref, client
|
6
|
+
def initialize(sender, message, payload, headers, ack_ref, client)
|
7
|
+
@sender, @message, @payload, @headers, @ack_ref, @client = sender, message, payload, headers, ack_ref, client
|
8
8
|
end
|
9
9
|
|
10
10
|
def ack
|
@@ -17,6 +17,8 @@ module ManageIQ
|
|
17
17
|
address = "queue/#{options[:service]}.#{affinity}"
|
18
18
|
|
19
19
|
headers = {:"destination-type" => 'ANYCAST', :persistent => true}
|
20
|
+
headers.merge!(options[:headers].except(*internal_header_keys)) if options.key?(:headers)
|
21
|
+
|
20
22
|
headers[:expires] = options[:expires_on].to_i * 1000 if options[:expires_on]
|
21
23
|
headers[:AMQ_SCHEDULED_TIME] = options[:deliver_on].to_i * 1000 if options[:deliver_on]
|
22
24
|
headers[:priority] = options[:priority] if options[:priority]
|
@@ -38,6 +40,8 @@ module ManageIQ
|
|
38
40
|
address = "topic/#{options[:service]}"
|
39
41
|
|
40
42
|
headers = {:"destination-type" => 'MULTICAST', :persistent => true}
|
43
|
+
headers.merge!(options[:headers].except(*internal_header_keys)) if options.key?(:headers)
|
44
|
+
|
41
45
|
headers[:expires] = options[:expires_on].to_i * 1000 if options[:expires_on]
|
42
46
|
headers[:AMQ_SCHEDULED_TIME] = options[:deliver_on].to_i * 1000 if options[:deliver_on]
|
43
47
|
headers[:priority] = options[:priority] if options[:priority]
|
@@ -63,6 +67,10 @@ module ManageIQ
|
|
63
67
|
raw_publish(address, result || '', response_headers.merge(:correlation_id => correlation_ref))
|
64
68
|
end
|
65
69
|
|
70
|
+
def internal_header_keys
|
71
|
+
[:"destination-type", :persistent, :expires, :AMQ_SCHEDULED_TIME, :priority, :_AMQ_GROUP_ID]
|
72
|
+
end
|
73
|
+
|
66
74
|
def receive_response(service, correlation_ref)
|
67
75
|
response_options = {
|
68
76
|
:service => "#{service}.response",
|
@@ -33,9 +33,15 @@ module ManageIQ
|
|
33
33
|
sender = msg.headers['sender']
|
34
34
|
message_type = msg.headers['message_type']
|
35
35
|
message_body = decode_body(msg.headers, msg.body)
|
36
|
+
client_headers = msg.headers.except(*internal_header_keys)
|
37
|
+
|
36
38
|
logger.info("Message received: queue(#{queue_name}), msg(#{payload_log(message_body)}), headers(#{msg.headers})")
|
37
39
|
|
38
|
-
|
40
|
+
messages = [
|
41
|
+
ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, message_body, client_headers, msg, self)
|
42
|
+
]
|
43
|
+
|
44
|
+
result = yield messages
|
39
45
|
logger.info("Message processed")
|
40
46
|
|
41
47
|
correlation_ref = msg.headers['correlation_id']
|
@@ -21,9 +21,11 @@ module ManageIQ
|
|
21
21
|
|
22
22
|
sender = event.headers['sender']
|
23
23
|
event_type = event.headers['event_type']
|
24
|
+
client_headers = event.headers.except(*internal_header_keys)
|
25
|
+
|
24
26
|
event_body = decode_body(event.headers, event.body)
|
25
27
|
logger.info("Event received: queue(#{queue_name}), event(#{event_body}), headers(#{event.headers})")
|
26
|
-
yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, event_body, event, self)
|
28
|
+
yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, event_body, client_headers, event, self)
|
27
29
|
logger.info("Event processed")
|
28
30
|
rescue => e
|
29
31
|
logger.error("Event processing error: #{e.message}")
|
data/manageiq-messaging.gemspec
CHANGED
@@ -24,10 +24,11 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency 'ruby-kafka', '~> 0.7.0'
|
25
25
|
spec.add_dependency 'stomp', '~> 1.4.4'
|
26
26
|
|
27
|
-
spec.add_development_dependency "bundler"
|
27
|
+
spec.add_development_dependency "bundler"
|
28
28
|
spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0.0"
|
29
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
31
31
|
spec.add_development_dependency "rubocop"
|
32
|
+
spec.add_development_dependency "rubocop-performance"
|
32
33
|
spec.add_development_dependency "simplecov"
|
33
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: manageiq-messaging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ManageIQ Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: codeclimate-test-reporter
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-performance
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: simplecov
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|