multiple_man 0.5.9 → 0.5.10
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/multiple_man/async_model_publisher.rb +30 -0
- data/lib/multiple_man/configuration.rb +2 -1
- data/lib/multiple_man/connection.rb +25 -21
- data/lib/multiple_man/mixins/publisher.rb +1 -1
- data/lib/multiple_man/model_publisher.rb +11 -1
- data/lib/multiple_man/routing_key.rb +1 -1
- data/lib/multiple_man/version.rb +1 -1
- data/lib/multiple_man.rb +2 -0
- data/spec/connection_spec.rb +2 -4
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55f92c313a41df73f660aeb11219df30699b05d2
|
4
|
+
data.tar.gz: 363a8538cf04a8dc30a3092a6ce83cb4f9c81ab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9255e20caedf780c92afc54c206b0bafed00b49dc0e6ba0e4646946344ba80356127e56b91bc911f1eb9f0511a08597b9d64972ccac610aa5d1354028b02b8d
|
7
|
+
data.tar.gz: d3aef199d466696ff5978d7057a4c86b799c6dbc8f2f5384068f5daccea2dc252831c8e213eacf774f85e75f1150d761323a90fbefc9cfa6b7fa937af339a467
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module MultipleMan
|
2
|
+
class AsyncModelPublisher < ModelPublisher
|
3
|
+
|
4
|
+
def publish(records, operation=:create)
|
5
|
+
return unless MultipleMan.configuration.enabled
|
6
|
+
|
7
|
+
if records.respond_to?(:pluck)
|
8
|
+
return unless records.any?
|
9
|
+
ids = records.pluck(:id)
|
10
|
+
klass = records.first.class.name
|
11
|
+
else
|
12
|
+
return if records.nil?
|
13
|
+
ids = [records.id]
|
14
|
+
klass = records.class.name
|
15
|
+
end
|
16
|
+
|
17
|
+
ModelPublisherJob.perform_async(klass, ids, options, operation)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
class ModelPublisherJob
|
23
|
+
include Sidekiq::Worker
|
24
|
+
|
25
|
+
def perform(record_type, ids, options, operation)
|
26
|
+
records = Kernel.const_get(record_type).where(id: ids)
|
27
|
+
ModelPublisher.new(options).publish(records, operation)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -7,6 +7,7 @@ module MultipleMan
|
|
7
7
|
self.enabled = true
|
8
8
|
self.channel_pool_size = 5
|
9
9
|
self.worker_concurrency = 1
|
10
|
+
self.reraise_errors = true
|
10
11
|
end
|
11
12
|
|
12
13
|
def logger
|
@@ -18,7 +19,7 @@ module MultipleMan
|
|
18
19
|
end
|
19
20
|
|
20
21
|
attr_accessor :topic_name, :app_name, :connection, :enabled, :channel_pool_size, :error_handler,
|
21
|
-
:worker_concurrency
|
22
|
+
:worker_concurrency, :reraise_errors
|
22
23
|
attr_writer :logger
|
23
24
|
end
|
24
25
|
|
@@ -4,18 +4,36 @@ require 'active_support/core_ext/module'
|
|
4
4
|
|
5
5
|
module MultipleMan
|
6
6
|
class Connection
|
7
|
+
@mutex = Mutex.new
|
8
|
+
|
9
|
+
def self.connection
|
10
|
+
@mutex.synchronize do
|
11
|
+
@connection ||= begin
|
12
|
+
connection = Bunny.new(MultipleMan.configuration.connection)
|
13
|
+
MultipleMan.logger.debug "Connecting to #{MultipleMan.configuration.connection}"
|
14
|
+
connection.start
|
15
|
+
connection
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
7
20
|
def self.connect
|
8
|
-
|
9
|
-
|
21
|
+
reconnect unless connection.open?
|
22
|
+
|
23
|
+
channel = connection.create_channel
|
24
|
+
yield new(channel) if block_given?
|
10
25
|
ensure
|
11
|
-
|
26
|
+
channel.close if channel
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.reconnect
|
30
|
+
connection.start
|
12
31
|
end
|
13
32
|
|
14
33
|
attr_reader :topic
|
15
34
|
|
16
|
-
def initialize
|
17
|
-
|
18
|
-
init_channel!
|
35
|
+
def initialize(channel)
|
36
|
+
self.channel = channel
|
19
37
|
self.topic = channel.topic(topic_name)
|
20
38
|
end
|
21
39
|
|
@@ -23,25 +41,11 @@ module MultipleMan
|
|
23
41
|
MultipleMan.configuration.topic_name
|
24
42
|
end
|
25
43
|
|
26
|
-
def close!
|
27
|
-
channel.close if channel
|
28
|
-
connection.close if connection
|
29
|
-
end
|
30
|
-
|
31
44
|
delegate :queue, to: :channel
|
32
45
|
|
33
46
|
private
|
34
47
|
|
35
|
-
|
36
|
-
self.connection = Bunny.new(MultipleMan.configuration.connection)
|
37
|
-
connection.start
|
38
|
-
end
|
39
|
-
|
40
|
-
def init_channel!
|
41
|
-
self.channel = connection.create_channel
|
42
|
-
end
|
43
|
-
|
44
|
-
attr_accessor :channel, :connection
|
48
|
+
attr_accessor :channel
|
45
49
|
attr_writer :topic
|
46
50
|
|
47
51
|
end
|
@@ -1,8 +1,18 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
|
1
3
|
module MultipleMan
|
2
4
|
class ModelPublisher
|
3
5
|
|
6
|
+
def self.build(options = {})
|
7
|
+
if options[:async] == true
|
8
|
+
AsyncModelPublisher.new(options)
|
9
|
+
else
|
10
|
+
new(options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
def initialize(options = {})
|
5
|
-
self.options = options
|
15
|
+
self.options = options.with_indifferent_access
|
6
16
|
end
|
7
17
|
|
8
18
|
def publish(records, operation=:create)
|
@@ -19,7 +19,7 @@ module MultipleMan
|
|
19
19
|
attr_accessor :klass
|
20
20
|
|
21
21
|
def operation=(value)
|
22
|
-
raise "Operation #{value} is not recognized" unless ALLOWED_OPERATIONS.include?(value)
|
22
|
+
raise "Operation #{value} is not recognized" unless ALLOWED_OPERATIONS.include?(value.to_sym)
|
23
23
|
@operation = value
|
24
24
|
end
|
25
25
|
|
data/lib/multiple_man/version.rb
CHANGED
data/lib/multiple_man.rb
CHANGED
@@ -10,6 +10,7 @@ module MultipleMan
|
|
10
10
|
require 'multiple_man/subscribers/registry'
|
11
11
|
require 'multiple_man/configuration'
|
12
12
|
require 'multiple_man/model_publisher'
|
13
|
+
require 'multiple_man/async_model_publisher'
|
13
14
|
require 'multiple_man/attribute_extractor'
|
14
15
|
require 'multiple_man/connection'
|
15
16
|
require 'multiple_man/routing_key'
|
@@ -34,6 +35,7 @@ module MultipleMan
|
|
34
35
|
def self.error(ex)
|
35
36
|
if configuration.error_handler
|
36
37
|
configuration.error_handler.call(ex)
|
38
|
+
raise ex if configuration.reraise_errors
|
37
39
|
else
|
38
40
|
raise ex
|
39
41
|
end
|
data/spec/connection_spec.rb
CHANGED
@@ -3,21 +3,19 @@ require 'spec_helper'
|
|
3
3
|
describe MultipleMan::Connection do
|
4
4
|
|
5
5
|
let(:mock_bunny) { double(Bunny) }
|
6
|
-
let(:mock_channel) { double(Bunny::Channel,
|
6
|
+
let(:mock_channel) { double(Bunny::Channel, close: nil) }
|
7
7
|
|
8
8
|
describe "connect" do
|
9
9
|
it "should open a connection and a channel" do
|
10
10
|
mock_bunny.should_receive(:start)
|
11
11
|
Bunny.should_receive(:new).and_return(mock_bunny)
|
12
12
|
mock_bunny.should_receive(:create_channel).once.and_return(mock_channel)
|
13
|
-
mock_bunny.should_receive(:close)
|
14
|
-
mock_channel.should_receive(:close)
|
15
13
|
|
16
14
|
described_class.connect { }
|
17
15
|
end
|
18
16
|
end
|
19
17
|
|
20
|
-
subject { described_class.new }
|
18
|
+
subject { described_class.new(mock_channel) }
|
21
19
|
|
22
20
|
its(:topic_name) { should == MultipleMan.configuration.topic_name }
|
23
21
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multiple_man
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Brunner
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- README.md
|
109
109
|
- Rakefile
|
110
110
|
- lib/multiple_man.rb
|
111
|
+
- lib/multiple_man/async_model_publisher.rb
|
111
112
|
- lib/multiple_man/attribute_extractor.rb
|
112
113
|
- lib/multiple_man/configuration.rb
|
113
114
|
- lib/multiple_man/connection.rb
|