philotic 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/examples/simple_instance.rb +1 -1
- data/examples/simple_singleton.rb +1 -1
- data/examples/subscribing/acks.rb +6 -6
- data/examples/subscribing/anonymous_queue.rb +1 -1
- data/examples/subscribing/multiple_named_queues.rb +2 -2
- data/examples/subscribing/named_queue.rb +1 -1
- data/lib/philotic/config.rb +6 -0
- data/lib/philotic/connection.rb +24 -4
- data/lib/philotic/event.rb +8 -1
- data/lib/philotic/publisher.rb +10 -3
- data/lib/philotic/subscriber.rb +3 -2
- data/lib/philotic/version.rb +1 -1
- data/spec/philotic/connection_spec.rb +10 -0
- data/spec/philotic/publisher_spec.rb +20 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ed9395d1fe81863b4c38f92ab7caa95186d7731
|
4
|
+
data.tar.gz: d550b106f564a798635798e121dcd80d192d9e10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 160ebead89967ffdcd676867166573334df6d8b7a01fe08fa061043a0cb7b23b31a8ac23d2ad9c6cff2876871b0b039ed10f4ab00dab48e8451ce4756a1a0d94
|
7
|
+
data.tar.gz: 8e40399b956a627bc93ccd1e7bca8e0408efe25e9cba930ba2833139c8a299d6e5fe95ec206bbbd2ca3f8867f125c19688aeeba06399ad8b5bd4887be6d29b81
|
data/README.md
CHANGED
@@ -19,7 +19,7 @@ Philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
19
19
|
Philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
20
20
|
end
|
21
21
|
|
22
|
-
Philotic.
|
22
|
+
Philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
23
23
|
ap message[:attributes]
|
24
24
|
end
|
25
25
|
|
@@ -48,7 +48,7 @@ philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
48
48
|
philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
49
49
|
end
|
50
50
|
|
51
|
-
philotic.
|
51
|
+
philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
52
52
|
ap message[:attributes]
|
53
53
|
end
|
54
54
|
|
data/examples/simple_instance.rb
CHANGED
@@ -12,7 +12,7 @@ philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
12
12
|
philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
13
13
|
end
|
14
14
|
|
15
|
-
philotic.
|
15
|
+
philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
16
16
|
ap message[:attributes]
|
17
17
|
end
|
18
18
|
|
@@ -10,7 +10,7 @@ Philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
10
10
|
Philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
11
11
|
end
|
12
12
|
|
13
|
-
Philotic.
|
13
|
+
Philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
14
14
|
ap message[:attributes]
|
15
15
|
end
|
16
16
|
|
@@ -6,20 +6,20 @@ require 'philotic'
|
|
6
6
|
require 'awesome_print'
|
7
7
|
|
8
8
|
# sometimes ack
|
9
|
-
Philotic.
|
9
|
+
Philotic.subscribe('flaky_queue', ack: true) do |metadata, message|
|
10
10
|
ap message[:attributes]
|
11
|
-
[true, false].sample ?
|
11
|
+
[true, false].sample ? acknowledge(message) : reject(message)
|
12
12
|
end
|
13
13
|
|
14
14
|
# always ack
|
15
|
-
Philotic.
|
15
|
+
Philotic.subscribe('flaky_queue', ack: true) do |metadata, message|
|
16
16
|
ap message[:attributes]
|
17
|
-
|
17
|
+
acknowledge(message, true)
|
18
18
|
end
|
19
19
|
|
20
20
|
# always reject
|
21
|
-
Philotic.
|
21
|
+
Philotic.subscribe('flaky_queue', ack: true) do |metadata, message|
|
22
22
|
ap message[:attributes]
|
23
|
-
|
23
|
+
reject message
|
24
24
|
end
|
25
25
|
Philotic.subscriber.endure
|
@@ -7,7 +7,7 @@ require 'awesome_print'
|
|
7
7
|
|
8
8
|
Philotic.config.load_file(File.join(File.dirname(__FILE__), '../../', 'Philotic.yml.example'))
|
9
9
|
|
10
|
-
Philotic.
|
10
|
+
Philotic.subscribe(philotic_firehose: true) do |metadata, message|
|
11
11
|
ap message[:attributes]
|
12
12
|
end
|
13
13
|
|
@@ -7,11 +7,11 @@ require 'awesome_print'
|
|
7
7
|
|
8
8
|
Philotic.config.load_file(File.join(File.dirname(__FILE__), '../../', 'Philotic.yml.example'))
|
9
9
|
|
10
|
-
Philotic.
|
10
|
+
Philotic.subscribe('female_queue') do |metadata, message|
|
11
11
|
ap message[:attributes]
|
12
12
|
end
|
13
13
|
|
14
|
-
Philotic.
|
14
|
+
Philotic.subscribe('male_queue') do |metadata, message|
|
15
15
|
ap message[:attributes]
|
16
16
|
end
|
17
17
|
|
data/lib/philotic/config.rb
CHANGED
@@ -39,6 +39,7 @@ module Philotic
|
|
39
39
|
DEFAULT_APP_ID = nil
|
40
40
|
DEFAULT_TIMESTAMP = nil
|
41
41
|
DEFAULT_EXPIRATION = nil
|
42
|
+
DEFAULT_CONNECTION_RETRIES = 2
|
42
43
|
|
43
44
|
attr_accessor :connection
|
44
45
|
|
@@ -77,6 +78,11 @@ module Philotic
|
|
77
78
|
def log_level
|
78
79
|
@log_level ||= defaults[:log_level].to_i
|
79
80
|
end
|
81
|
+
|
82
|
+
def connection_retries
|
83
|
+
@connection_retries ||= defaults[:connection_retries].to_i
|
84
|
+
end
|
85
|
+
|
80
86
|
attr_writer :connection_failed_handler, :connection_loss_handler, :message_return_handler
|
81
87
|
|
82
88
|
def connection_failed_handler
|
data/lib/philotic/connection.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'bunny'
|
3
3
|
require 'logger'
|
4
|
-
|
4
|
+
require 'bunny'
|
5
5
|
require 'philotic/constants'
|
6
6
|
require 'philotic/config'
|
7
7
|
require 'philotic/publisher'
|
@@ -9,13 +9,20 @@ require 'philotic/subscriber'
|
|
9
9
|
|
10
10
|
module Philotic
|
11
11
|
class Connection
|
12
|
+
|
13
|
+
class TCPConnectionFailed < Bunny::TCPConnectionFailed; end
|
14
|
+
|
12
15
|
extend Forwardable
|
13
16
|
|
14
|
-
attr_reader :connection
|
17
|
+
attr_reader :connection, :connection_attempts
|
15
18
|
attr_accessor :logger
|
16
19
|
|
17
20
|
attr_writer :publisher, :subscriber
|
18
21
|
|
22
|
+
def initialize
|
23
|
+
@connection_attempts = 0
|
24
|
+
end
|
25
|
+
|
19
26
|
def publisher
|
20
27
|
@publisher ||= Philotic::Publisher.new self
|
21
28
|
end
|
@@ -44,7 +51,20 @@ module Philotic
|
|
44
51
|
end
|
45
52
|
|
46
53
|
def start_connection!
|
47
|
-
|
54
|
+
begin
|
55
|
+
attempt_connection
|
56
|
+
rescue ::Bunny::TCPConnectionFailed => e
|
57
|
+
if connection_attempts <= config.connection_retries
|
58
|
+
retry
|
59
|
+
else
|
60
|
+
raise TCPConnectionFailed.new "Failed to connect after #{connection_attempts} attempts", config.rabbit_host, config.rabbit_port
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def attempt_connection
|
66
|
+
@connection_attempts += 1
|
67
|
+
@connection = Bunny.new(config.rabbit_url, connection_settings)
|
48
68
|
@connection.start
|
49
69
|
end
|
50
70
|
|
@@ -130,7 +150,7 @@ module Philotic
|
|
130
150
|
|
131
151
|
def logger
|
132
152
|
unless @logger
|
133
|
-
@logger
|
153
|
+
@logger = Logger.new(STDOUT)
|
134
154
|
@logger.level = config.log_level
|
135
155
|
end
|
136
156
|
@logger
|
data/lib/philotic/event.rb
CHANGED
@@ -6,7 +6,8 @@ module Philotic
|
|
6
6
|
class Event
|
7
7
|
include Philotic::Routable
|
8
8
|
|
9
|
-
attr_accessor :connection
|
9
|
+
attr_accessor :connection, :publish_error
|
10
|
+
attr_writer :published
|
10
11
|
|
11
12
|
def initialize(routables={}, payloads={}, connection=nil)
|
12
13
|
self.timestamp = Time.now.to_i
|
@@ -19,6 +20,8 @@ module Philotic
|
|
19
20
|
# over into the bus
|
20
21
|
_set_routables_or_payloads(:routable, routables)
|
21
22
|
_set_routables_or_payloads(:payload, payloads)
|
23
|
+
|
24
|
+
@published = false
|
22
25
|
end
|
23
26
|
|
24
27
|
def self.inherited(sub)
|
@@ -48,6 +51,10 @@ module Philotic
|
|
48
51
|
@connection ||= Philotic.connection
|
49
52
|
end
|
50
53
|
|
54
|
+
def published?
|
55
|
+
!!@published
|
56
|
+
end
|
57
|
+
|
51
58
|
def publish
|
52
59
|
connection.publish self
|
53
60
|
end
|
data/lib/philotic/publisher.rb
CHANGED
@@ -21,19 +21,25 @@ module Philotic
|
|
21
21
|
def publish(event)
|
22
22
|
message_metadata = {headers: event.headers}
|
23
23
|
message_metadata.merge!(event.message_metadata) if event.message_metadata
|
24
|
-
|
24
|
+
begin
|
25
|
+
event.published = _publish(event.payload, message_metadata)
|
26
|
+
rescue => e
|
27
|
+
event.publish_error = e
|
28
|
+
logger.error e.message
|
29
|
+
end
|
30
|
+
event
|
25
31
|
end
|
26
32
|
|
27
33
|
private
|
28
34
|
def _publish(payload, message_metadata = {})
|
29
35
|
if config.disable_publish
|
30
|
-
log_event_published(:warn,
|
36
|
+
log_event_published(:warn, message_metadata, payload, 'attempted to publish a message when publishing is disabled.')
|
31
37
|
return false
|
32
38
|
end
|
33
39
|
connection.connect!
|
34
40
|
unless connection.connected?
|
35
41
|
log_event_published(:error, message_metadata, payload, 'unable to publish event, not connected to RabbitMQ')
|
36
|
-
return
|
42
|
+
return false
|
37
43
|
end
|
38
44
|
message_metadata = merge_metadata(message_metadata)
|
39
45
|
|
@@ -41,6 +47,7 @@ module Philotic
|
|
41
47
|
|
42
48
|
connection.exchange.publish(payload.to_json, message_metadata)
|
43
49
|
log_event_published(:debug, message_metadata, payload, 'published event')
|
50
|
+
true
|
44
51
|
end
|
45
52
|
|
46
53
|
def normalize_payload_times(payload)
|
data/lib/philotic/subscriber.rb
CHANGED
@@ -20,7 +20,7 @@ module Philotic
|
|
20
20
|
connection.logger
|
21
21
|
end
|
22
22
|
|
23
|
-
def subscription_callback
|
23
|
+
def subscription_callback(&block)
|
24
24
|
lambda do |delivery_info, metadata, payload|
|
25
25
|
hash_payload = JSON.parse payload
|
26
26
|
|
@@ -30,7 +30,8 @@ module Philotic
|
|
30
30
|
delivery_info: delivery_info,
|
31
31
|
attributes: metadata[:headers] ? hash_payload.merge(metadata[:headers]) : hash_payload
|
32
32
|
}
|
33
|
-
|
33
|
+
|
34
|
+
instance_exec(Metadata.new(metadata), event, &block)
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
data/lib/philotic/version.rb
CHANGED
@@ -43,6 +43,7 @@ describe Philotic::Connection do
|
|
43
43
|
|
44
44
|
describe '#start_connection!' do
|
45
45
|
let(:connection) { double }
|
46
|
+
let(:connection_error) {Bunny::TCPConnectionFailed.new 'connection failed', 'localhost', '5672'}
|
46
47
|
subject { Philotic::Connection.new }
|
47
48
|
specify do
|
48
49
|
expect(Bunny).to receive(:new).with(subject.config.rabbit_url, subject.connection_settings).and_return(connection)
|
@@ -50,6 +51,15 @@ describe Philotic::Connection do
|
|
50
51
|
|
51
52
|
subject.start_connection!
|
52
53
|
end
|
54
|
+
|
55
|
+
it 'should retry connecting' do
|
56
|
+
expect(Bunny).to receive(:new) do
|
57
|
+
raise connection_error
|
58
|
+
end.exactly(subject.config.connection_retries + 1).times
|
59
|
+
|
60
|
+
expect { subject.start_connection! }.to raise_error(Philotic::Connection::TCPConnectionFailed)
|
61
|
+
end
|
62
|
+
|
53
63
|
end
|
54
64
|
|
55
65
|
describe '#close' do
|
@@ -17,6 +17,7 @@ describe Philotic::Publisher do
|
|
17
17
|
subject { publisher }
|
18
18
|
|
19
19
|
describe 'publish' do
|
20
|
+
let(:publish_error) {StandardError.new 'publish error'}
|
20
21
|
it 'should call _publish with the right values' do
|
21
22
|
Timecop.freeze
|
22
23
|
expect(subject).to receive(:_publish).with(
|
@@ -36,7 +37,22 @@ describe Philotic::Publisher do
|
|
36
37
|
timestamp: Time.now.to_i
|
37
38
|
}
|
38
39
|
)
|
40
|
+
expect(event).to_not be_published
|
39
41
|
subject.publish(event)
|
42
|
+
expect(event).to_not be_published # not connected
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should fail gracefully' do
|
46
|
+
expect(subject).to receive(:_publish) do
|
47
|
+
raise publish_error
|
48
|
+
end
|
49
|
+
|
50
|
+
expect(subject.logger).to receive(:error).with(publish_error.message)
|
51
|
+
expect(event).to_not be_published
|
52
|
+
subject.publish(event)
|
53
|
+
expect(event).to_not be_published
|
54
|
+
expect(event.publish_error).to eq publish_error
|
55
|
+
|
40
56
|
end
|
41
57
|
|
42
58
|
end
|
@@ -83,7 +99,9 @@ describe Philotic::Publisher do
|
|
83
99
|
}.to_json,
|
84
100
|
metadata
|
85
101
|
)
|
102
|
+
expect(event).to_not be_published
|
86
103
|
subject.publish(event)
|
104
|
+
expect(event).to be_published
|
87
105
|
end
|
88
106
|
|
89
107
|
it 'should log an error when there is no connection' do
|
@@ -93,7 +111,9 @@ describe Philotic::Publisher do
|
|
93
111
|
expect(subject.connection).to receive(:connected?).once.and_return(false)
|
94
112
|
|
95
113
|
expect(subject.logger).to receive(:error)
|
114
|
+
expect(event).to_not be_published
|
96
115
|
subject.publish(event)
|
116
|
+
expect(event).to_not be_published
|
97
117
|
end
|
98
118
|
|
99
119
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: philotic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Keyes
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2014-12-
|
12
|
+
date: 2014-12-24 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: codeclimate-test-reporter
|