protein 0.4.0 → 0.5.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/protein/amqp_adapter.rb +39 -19
- data/lib/protein/version.rb +1 -1
- metadata +21 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45f21a4d7185d3be24bb0125c0cc33102f64c0b0
|
4
|
+
data.tar.gz: 3db590ca179c16f5e5a7d7de7bc878a7734d56ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7679e7bc9a29e477a5f0a15f82e89dbaa775340cedfd6e831c9af4e690efa42370c81a6edda62fc14dc43fa2b6f3e7e5cf5767064d2b88d403534a9d316b23a7
|
7
|
+
data.tar.gz: a7cc6dfd6efed158af28a6a7c0edabbc5e3fd0de70f2979679735b18f02f369635e219eb331e975b011fe8e8cb441dbb319d790ce51636da84aed13fcae6c774
|
data/lib/protein/amqp_adapter.rb
CHANGED
@@ -35,22 +35,30 @@ class AMQPAdapter
|
|
35
35
|
end
|
36
36
|
|
37
37
|
attr_reader :reply_queue
|
38
|
-
attr_accessor :
|
39
|
-
attr_reader :lock, :condition
|
38
|
+
attr_accessor :calls
|
40
39
|
|
41
40
|
def call(request_payload)
|
42
41
|
prepare_client
|
43
42
|
|
44
|
-
|
43
|
+
call_id = SecureRandom.uuid
|
45
44
|
|
46
45
|
@x.publish(request_payload,
|
47
|
-
correlation_id:
|
46
|
+
correlation_id: call_id,
|
48
47
|
routing_key: @server_queue,
|
49
48
|
reply_to: @reply_queue.name,
|
50
49
|
expiration: timeout)
|
51
50
|
|
52
|
-
|
53
|
-
|
51
|
+
call = Concurrent::Hash.new
|
52
|
+
mutex = Mutex.new
|
53
|
+
condition = ConditionVariable.new
|
54
|
+
call[:mutex] = mutex
|
55
|
+
call[:condition] = condition
|
56
|
+
calls[call_id] = call
|
57
|
+
|
58
|
+
mutex.synchronize { condition.wait(mutex, timeout && timeout * 0.001) }
|
59
|
+
|
60
|
+
response = call[:response]
|
61
|
+
calls.delete(call_id)
|
54
62
|
|
55
63
|
if response == nil
|
56
64
|
raise(TransportError, "timeout after #{timeout}ms")
|
@@ -70,7 +78,13 @@ class AMQPAdapter
|
|
70
78
|
|
71
79
|
def serve(router)
|
72
80
|
@conn = Bunny.new(url)
|
73
|
-
|
81
|
+
begin
|
82
|
+
@conn.start
|
83
|
+
rescue Bunny::TCPConnectionFailed => e
|
84
|
+
Protein.logger.error "RPC server connection error: #{e.inspect}"
|
85
|
+
log_error(e)
|
86
|
+
raise(e)
|
87
|
+
end
|
74
88
|
@ch = @conn.create_channel
|
75
89
|
@ch.prefetch(1)
|
76
90
|
@q = @ch.queue(queue)
|
@@ -96,15 +110,13 @@ class AMQPAdapter
|
|
96
110
|
end
|
97
111
|
|
98
112
|
@ch.ack(delivery_info.delivery_tag)
|
99
|
-
|
100
113
|
if @error
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
raise(@error)
|
114
|
+
log_error(@error)
|
115
|
+
raise(message)
|
105
116
|
end
|
106
117
|
end
|
107
118
|
rescue StandardError => e
|
119
|
+
log_error(e)
|
108
120
|
Protein.logger.error "RPC server error: #{e.inspect}, restarting the server in 5s..."
|
109
121
|
|
110
122
|
sleep 5
|
@@ -114,6 +126,11 @@ class AMQPAdapter
|
|
114
126
|
|
115
127
|
private
|
116
128
|
|
129
|
+
def log_error(error)
|
130
|
+
@error_logger ||= Protein.config.error_logger
|
131
|
+
@error_logger.call(error) if @error_logger
|
132
|
+
end
|
133
|
+
|
117
134
|
def prepare_client
|
118
135
|
return if @conn
|
119
136
|
|
@@ -123,15 +140,18 @@ class AMQPAdapter
|
|
123
140
|
@x = @ch.default_exchange
|
124
141
|
@server_queue = queue
|
125
142
|
@reply_queue = @ch.queue("", exclusive: true)
|
126
|
-
@
|
127
|
-
@condition = ConditionVariable.new
|
128
|
-
|
129
|
-
that = self
|
143
|
+
@calls = Concurrent::Hash.new
|
130
144
|
|
131
145
|
@reply_queue.subscribe do |delivery_info, properties, payload|
|
132
|
-
|
133
|
-
|
134
|
-
|
146
|
+
call_id = properties[:correlation_id]
|
147
|
+
call = calls[call_id]
|
148
|
+
|
149
|
+
if call
|
150
|
+
mutex = call[:mutex]
|
151
|
+
condition = call[:condition]
|
152
|
+
call[:response] = payload
|
153
|
+
|
154
|
+
mutex.synchronize { condition.signal }
|
135
155
|
end
|
136
156
|
end
|
137
157
|
end
|
data/lib/protein/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protein
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karol Słuszniak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -16,20 +16,34 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
19
|
+
version: '2.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: concurrent-ruby
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
20
34
|
- - ">="
|
21
35
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
-
type: :
|
36
|
+
version: 1.0.5
|
37
|
+
type: :runtime
|
24
38
|
prerelease: false
|
25
39
|
version_requirements: !ruby/object:Gem::Requirement
|
26
40
|
requirements:
|
27
41
|
- - "~>"
|
28
42
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
43
|
+
version: '1.0'
|
30
44
|
- - ">="
|
31
45
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
46
|
+
version: 1.0.5
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: google-protobuf
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,9 +51,6 @@ dependencies:
|
|
37
51
|
- - "~>"
|
38
52
|
- !ruby/object:Gem::Version
|
39
53
|
version: '3.0'
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: 3.0.0
|
43
54
|
type: :runtime
|
44
55
|
prerelease: false
|
45
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -47,9 +58,6 @@ dependencies:
|
|
47
58
|
- - "~>"
|
48
59
|
- !ruby/object:Gem::Version
|
49
60
|
version: '3.0'
|
50
|
-
- - ">="
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: 3.0.0
|
53
61
|
- !ruby/object:Gem::Dependency
|
54
62
|
name: parallel
|
55
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,9 +65,6 @@ dependencies:
|
|
57
65
|
- - "~>"
|
58
66
|
- !ruby/object:Gem::Version
|
59
67
|
version: '1.0'
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 1.0.0
|
63
68
|
type: :runtime
|
64
69
|
prerelease: false
|
65
70
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -67,9 +72,6 @@ dependencies:
|
|
67
72
|
- - "~>"
|
68
73
|
- !ruby/object:Gem::Version
|
69
74
|
version: '1.0'
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 1.0.0
|
73
75
|
description:
|
74
76
|
email: karol@shedul.com
|
75
77
|
executables: []
|