pubcontrol 1.1.0 → 1.2.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/pubcontrol.rb +87 -5
- data/lib/pubcontrolclient.rb +21 -11
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36d18a43fb9eccdb7b0090e848c793d2e542832d
|
4
|
+
data.tar.gz: d7054ee29c3dc2c62042dae493d5de1ce96721ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c8fd3c684fde6b24183d29740f62ee5b91aebb27393a318caefd423615eef57f650b33a716a4e29dcc2de505e3db3760987b653b74dba7f88d22586dfc585ca
|
7
|
+
data.tar.gz: 51920a6f60f0e0686d7284704393c85d267fc9f11ff2dc8d1f80629e0d133b073037cfb3d9fad88208c0d166b9c5958c9660fab59247a07b0ec8c020f2e66e35
|
data/lib/pubcontrol.rb
CHANGED
@@ -10,20 +10,34 @@ require_relative 'item.rb'
|
|
10
10
|
require_relative 'pubcontrolclient.rb'
|
11
11
|
require_relative 'pcccbhandler.rb'
|
12
12
|
|
13
|
+
# Register the close_pubcontrols method with at_exit to ensure that it is
|
14
|
+
# called on exit.
|
15
|
+
at_exit do
|
16
|
+
PubControl.close_pubcontrols
|
17
|
+
end
|
18
|
+
|
13
19
|
# The PubControl class allows a consumer to manage a set of publishing
|
14
20
|
# endpoints and to publish to all of those endpoints via a single publish
|
15
21
|
# or publish_async method call. A PubControl instance can be configured
|
16
22
|
# either using a hash or array of hashes containing configuration information
|
17
23
|
# or by manually adding PubControlClient instances.
|
18
24
|
class PubControl
|
25
|
+
# The global list of PubControl instances used to ensure that each instance
|
26
|
+
# is properly closed on exit.
|
27
|
+
@@pubcontrols = Array.new
|
28
|
+
@@lock = Mutex.new
|
19
29
|
|
20
30
|
# Initialize with or without a configuration. A configuration can be applied
|
21
31
|
# after initialization via the apply_config method.
|
22
32
|
def initialize(config=nil)
|
23
33
|
@clients = Array.new
|
34
|
+
@closed = false
|
24
35
|
if !config.nil?
|
25
36
|
apply_config(config)
|
26
37
|
end
|
38
|
+
@@lock.synchronize do
|
39
|
+
@@pubcontrols.push(self)
|
40
|
+
end
|
27
41
|
end
|
28
42
|
|
29
43
|
# Remove all of the configured PubControlClient instances.
|
@@ -54,15 +68,40 @@ class PubControl
|
|
54
68
|
end
|
55
69
|
end
|
56
70
|
|
57
|
-
# The
|
58
|
-
#
|
59
|
-
#
|
60
|
-
|
71
|
+
# The close method is a blocking call that closes all ZMQ sockets and
|
72
|
+
# ensures that all PubControlClient async publishing is completed prior
|
73
|
+
# to returning and allowing the consumer to proceed. Note that the
|
74
|
+
# PubControl instance cannot be used after calling this method.
|
75
|
+
def close
|
76
|
+
close_clients
|
77
|
+
unregister_pubcontrol
|
78
|
+
end
|
79
|
+
|
80
|
+
# Internal close method, used during shutdown while class lock is held.
|
81
|
+
def close_locked
|
82
|
+
close_clients
|
83
|
+
unregister_pubcontrol_locked
|
84
|
+
end
|
85
|
+
|
86
|
+
# This method is a blocking method that ensures that all asynchronous
|
87
|
+
# publishing is complete for all of the configured client instances prior
|
88
|
+
# to returning and allowing the consumer to proceed.
|
89
|
+
# NOTE: This only applies to PubControlClient and not ZmqPubControlClient
|
90
|
+
# since all ZMQ socket operations are non-blocking.
|
91
|
+
def wait_all_sent
|
92
|
+
verify_not_closed
|
61
93
|
@clients.each do |pub|
|
62
|
-
pub.
|
94
|
+
pub.wait_all_sent
|
63
95
|
end
|
64
96
|
end
|
65
97
|
|
98
|
+
# DEPRECATED: The finish method is now deprecated in favor of the more
|
99
|
+
# descriptive wait_all_sent method.
|
100
|
+
def finish
|
101
|
+
verify_not_closed
|
102
|
+
wait_all_sent
|
103
|
+
end
|
104
|
+
|
66
105
|
# The synchronous publish method for publishing the specified item to the
|
67
106
|
# specified channels for all of the configured PubControlClient instances.
|
68
107
|
def publish(channels, item)
|
@@ -87,4 +126,47 @@ class PubControl
|
|
87
126
|
pub.publish_async(channels, item, cb)
|
88
127
|
end
|
89
128
|
end
|
129
|
+
|
130
|
+
# An internal method used for closing all existing PubControl instances.
|
131
|
+
def self.close_pubcontrols
|
132
|
+
@@lock.synchronize do
|
133
|
+
pubcontrols = Array.new(@@pubcontrols)
|
134
|
+
pubcontrols.each do |pub|
|
135
|
+
pub.close_locked
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
# An internal method for verifying that the PubControl instance has
|
143
|
+
# not been closed via the close() method. If it has then an error
|
144
|
+
# is raised.
|
145
|
+
def verify_not_closed
|
146
|
+
if @closed
|
147
|
+
raise 'pubcontrol instance is closed'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Internal method to close clients.
|
152
|
+
def close_clients
|
153
|
+
verify_not_closed
|
154
|
+
@clients.each do |pub|
|
155
|
+
pub.close()
|
156
|
+
end
|
157
|
+
@closed = true
|
158
|
+
end
|
159
|
+
|
160
|
+
# Internal method to unregister from the list of pubcontrols.
|
161
|
+
def unregister_pubcontrol
|
162
|
+
@@lock.synchronize do
|
163
|
+
@@pubcontrols.delete(self)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Internal method to unregister from the list of pubcontrols, used during
|
168
|
+
# shutdown while class lock is held.
|
169
|
+
def unregister_pubcontrol_locked
|
170
|
+
@@pubcontrols.delete(self)
|
171
|
+
end
|
90
172
|
end
|
data/lib/pubcontrolclient.rb
CHANGED
@@ -10,7 +10,7 @@ require 'thread'
|
|
10
10
|
require 'base64'
|
11
11
|
require 'jwt'
|
12
12
|
require 'json'
|
13
|
-
require 'net/http'
|
13
|
+
require 'net/http/persistent'
|
14
14
|
require_relative 'item.rb'
|
15
15
|
|
16
16
|
# The PubControlClient class allows consumers to publish either synchronously
|
@@ -34,6 +34,7 @@ class PubControlClient
|
|
34
34
|
@auth_basic_pass = nil
|
35
35
|
@auth_jwt_claim = nil
|
36
36
|
@auth_jwt_key = nil
|
37
|
+
@http = Net::HTTP::Persistent.new @object_id.to_s
|
37
38
|
end
|
38
39
|
|
39
40
|
# Call this method and pass a username and password to use basic
|
@@ -91,10 +92,10 @@ class PubControlClient
|
|
91
92
|
queue_req(['pub', uri, auth, exports, callback])
|
92
93
|
end
|
93
94
|
|
94
|
-
#
|
95
|
+
# This method is a blocking method that ensures that all asynchronous
|
95
96
|
# publishing is complete prior to returning and allowing the consumer to
|
96
97
|
# proceed.
|
97
|
-
def
|
98
|
+
def wait_all_sent
|
98
99
|
@lock.synchronize do
|
99
100
|
if !@thread.nil?
|
100
101
|
queue_req(['stop'])
|
@@ -104,6 +105,19 @@ class PubControlClient
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
108
|
+
# DEPRECATED: The finish method is now deprecated in favor of the more
|
109
|
+
# descriptive wait_all_sent method.
|
110
|
+
def finish
|
111
|
+
wait_all_sent
|
112
|
+
end
|
113
|
+
|
114
|
+
# This method closes the PubControlClient instance by ensuring all pending
|
115
|
+
# data is sent and any open connections are closed.
|
116
|
+
def close
|
117
|
+
wait_all_sent
|
118
|
+
@http.shutdown
|
119
|
+
end
|
120
|
+
|
107
121
|
# A helper method for returning the current UNIX UTC timestamp.
|
108
122
|
def self.timestamp_utcnow
|
109
123
|
return Time.now.utc.to_i
|
@@ -124,8 +138,7 @@ class PubControlClient
|
|
124
138
|
request['Authorization'] = auth_header
|
125
139
|
end
|
126
140
|
request['Content-Type'] = 'application/json'
|
127
|
-
|
128
|
-
response = make_http_request(uri, use_ssl, request)
|
141
|
+
response = make_http_request(uri, request)
|
129
142
|
if !response.kind_of? Net::HTTPSuccess
|
130
143
|
raise 'failed to publish: ' + response.class.to_s + ' ' +
|
131
144
|
response.message
|
@@ -133,12 +146,9 @@ class PubControlClient
|
|
133
146
|
end
|
134
147
|
|
135
148
|
# An internal method for making the specified HTTP request to the
|
136
|
-
# specified URI
|
137
|
-
|
138
|
-
|
139
|
-
response = Net::HTTP.start(uri.host, uri.port, use_ssl: use_ssl) do |http|
|
140
|
-
http.request(request)
|
141
|
-
end
|
149
|
+
# specified URI.
|
150
|
+
def make_http_request(uri, request)
|
151
|
+
response = @http.request uri, request
|
142
152
|
return response
|
143
153
|
end
|
144
154
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pubcontrol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Bokarius
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: net-http-persistent
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.9'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.9'
|
41
55
|
description: A Ruby convenience library for publishing messages using the EPCP protocol
|
42
56
|
email: bokarius@comcast.net
|
43
57
|
executables: []
|
@@ -69,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
83
|
version: '0'
|
70
84
|
requirements: []
|
71
85
|
rubyforge_project:
|
72
|
-
rubygems_version: 2.
|
86
|
+
rubygems_version: 2.4.5
|
73
87
|
signing_key:
|
74
88
|
specification_version: 4
|
75
89
|
summary: Ruby EPCP library
|