freddy 0.5.5 → 0.5.6
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
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b44c437c95066c2386f67bc9077fb0194376958
|
4
|
+
data.tar.gz: 8e4dc3ae45c00ff027a7eccd10609c77f146b715
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fc4ef697700812b814402e02892a5aea60348e6e8550f21de356fe68d22e2c354c785a5f09b18184c61de373b0e03bb203f6aa8f57c4e34d33c1c0dab2fbfcd
|
7
|
+
data.tar.gz: cd13ca536d3b50a2f650d9bfc6f32639b23273f3233de316ea1e87825aa73d6eebdeec816114bd149c245c9406238dcbb5458777b3bf4042e81be55e1d6bdd44
|
data/freddy.gemspec
CHANGED
@@ -22,33 +22,18 @@ class Freddy
|
|
22
22
|
@response_consumer.consume(@response_queue, &method(:handle_response))
|
23
23
|
end
|
24
24
|
|
25
|
-
def produce(destination, payload, properties)
|
26
|
-
timeout_in_seconds = properties.fetch(:timeout_in_seconds)
|
27
|
-
container = SyncResponseContainer.new
|
28
|
-
async_request destination, payload, container, properties
|
29
|
-
container.wait_for_response(timeout_in_seconds)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def async_request(destination, payload, container, timeout_in_seconds:, delete_on_timeout:, **properties)
|
25
|
+
def produce(destination, payload, timeout_in_seconds:, delete_on_timeout:, **properties)
|
35
26
|
correlation_id = SecureRandom.uuid
|
36
27
|
|
28
|
+
container = SyncResponseContainer.new(
|
29
|
+
on_timeout(correlation_id, destination, timeout_in_seconds)
|
30
|
+
)
|
31
|
+
|
37
32
|
@request_manager.store(correlation_id,
|
38
33
|
callback: container,
|
39
34
|
destination: destination
|
40
35
|
)
|
41
36
|
|
42
|
-
container.on_timeout do
|
43
|
-
@logger.warn "Request timed out waiting response from #{destination}, correlation id #{correlation_id}"
|
44
|
-
Utils.notify 'RequestTimeout', "Request timed out waiting for response from #{destination}", {
|
45
|
-
correlation_id: correlation_id,
|
46
|
-
destination: destination,
|
47
|
-
timeout_in_seconds: timeout_in_seconds
|
48
|
-
}
|
49
|
-
@request_manager.delete(correlation_id)
|
50
|
-
end
|
51
|
-
|
52
37
|
if delete_on_timeout
|
53
38
|
properties[:expiration] = (timeout_in_seconds * 1000).to_i
|
54
39
|
end
|
@@ -68,6 +53,8 @@ class Freddy
|
|
68
53
|
# need to lock these.
|
69
54
|
@topic_exchange.publish json_payload, properties.dup
|
70
55
|
@exchange.publish json_payload, properties.dup
|
56
|
+
|
57
|
+
container.wait_for_response(timeout_in_seconds)
|
71
58
|
end
|
72
59
|
|
73
60
|
def handle_response(delivery)
|
@@ -88,6 +75,23 @@ class Freddy
|
|
88
75
|
"with correlation_id #{delivery.correlation_id}"
|
89
76
|
request[:callback].call(delivery.payload, delivery)
|
90
77
|
end
|
78
|
+
|
79
|
+
def on_timeout(correlation_id, destination, timeout_in_seconds)
|
80
|
+
Proc.new do
|
81
|
+
@logger.warn "Request timed out waiting response from #{destination}"\
|
82
|
+
", correlation id #{correlation_id}"
|
83
|
+
|
84
|
+
Utils.notify 'RequestTimeout',
|
85
|
+
"Request timed out waiting for response from #{destination}",
|
86
|
+
{
|
87
|
+
correlation_id: correlation_id,
|
88
|
+
destination: destination,
|
89
|
+
timeout_in_seconds: timeout_in_seconds
|
90
|
+
}
|
91
|
+
|
92
|
+
@request_manager.delete(correlation_id)
|
93
|
+
end
|
94
|
+
end
|
91
95
|
end
|
92
96
|
end
|
93
97
|
end
|
@@ -3,32 +3,31 @@ require 'timeout'
|
|
3
3
|
|
4
4
|
class Freddy
|
5
5
|
class SyncResponseContainer
|
6
|
-
def initialize
|
6
|
+
def initialize(on_timeout)
|
7
7
|
@mutex = Mutex.new
|
8
8
|
@resource = ConditionVariable.new
|
9
|
+
@on_timeout = on_timeout
|
9
10
|
end
|
10
11
|
|
11
12
|
def call(response, delivery)
|
13
|
+
if response.nil?
|
14
|
+
raise StandardError, 'unexpected nil value for response'
|
15
|
+
end
|
16
|
+
|
12
17
|
@response = response
|
13
18
|
@delivery = delivery
|
14
19
|
@mutex.synchronize { @resource.signal }
|
15
20
|
end
|
16
21
|
|
17
|
-
def on_timeout(&block)
|
18
|
-
@on_timeout = block
|
19
|
-
end
|
20
|
-
|
21
22
|
def wait_for_response(timeout)
|
22
|
-
@mutex.synchronize { @resource.wait(@mutex, timeout) }
|
23
|
+
@mutex.synchronize { @response || @resource.wait(@mutex, timeout) }
|
23
24
|
|
24
|
-
if
|
25
|
+
if !@response
|
25
26
|
@on_timeout.call
|
26
27
|
raise TimeoutError.new(
|
27
28
|
error: 'RequestTimeout',
|
28
29
|
message: 'Timed out waiting for response'
|
29
30
|
)
|
30
|
-
elsif @response.nil?
|
31
|
-
raise StandardError, 'unexpected nil value for response'
|
32
31
|
elsif !@delivery || @delivery.type == 'error'
|
33
32
|
raise InvalidRequestError.new(@response)
|
34
33
|
else
|
@@ -1,11 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Freddy::SyncResponseContainer do
|
4
|
-
let(:container) { described_class.new }
|
5
|
-
|
6
|
-
before do
|
7
|
-
container.on_timeout {}
|
8
|
-
end
|
4
|
+
let(:container) { described_class.new(on_timeout) }
|
5
|
+
let(:on_timeout) { Proc.new {} }
|
9
6
|
|
10
7
|
context 'when timeout' do
|
11
8
|
subject { container.wait_for_response(0.01) }
|
@@ -21,19 +18,12 @@ describe Freddy::SyncResponseContainer do
|
|
21
18
|
end
|
22
19
|
end
|
23
20
|
|
24
|
-
context 'when nil
|
21
|
+
context 'when nil response' do
|
25
22
|
let(:delivery) { {} }
|
26
23
|
|
27
|
-
before do
|
28
|
-
Thread.new do
|
29
|
-
default_sleep
|
30
|
-
container.call(nil, delivery)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
24
|
it 'raises timeout error' do
|
35
25
|
expect {
|
36
|
-
container.
|
26
|
+
container.call(nil, delivery)
|
37
27
|
}.to raise_error(StandardError, 'unexpected nil value for response')
|
38
28
|
end
|
39
29
|
end
|
@@ -44,6 +34,8 @@ describe Freddy::SyncResponseContainer do
|
|
44
34
|
let(:delivery) { OpenStruct.new(type: 'success') }
|
45
35
|
|
46
36
|
context 'when called after #call' do
|
37
|
+
let(:max_wait_time_in_seconds) { 0.5 }
|
38
|
+
|
47
39
|
before do
|
48
40
|
container.call(response, delivery)
|
49
41
|
end
|
@@ -51,6 +43,12 @@ describe Freddy::SyncResponseContainer do
|
|
51
43
|
it 'returns response' do
|
52
44
|
expect(container.wait_for_response(timeout)).to eq(response)
|
53
45
|
end
|
46
|
+
|
47
|
+
it 'does not wait for timeout' do
|
48
|
+
expect {
|
49
|
+
container.wait_for_response(timeout)
|
50
|
+
}.to change(Time, :now).by_at_most(max_wait_time_in_seconds)
|
51
|
+
end
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: freddy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Urmas Talimaa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|