promiscuous 0.33.1 → 0.50.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.
- data/lib/promiscuous/amqp/ruby_amqp.rb +0 -8
- data/lib/promiscuous/cli.rb +29 -65
- data/lib/promiscuous/config.rb +1 -1
- data/lib/promiscuous/publisher/model/mongoid.rb +21 -0
- data/lib/promiscuous/publisher/model.rb +2 -3
- data/lib/promiscuous/subscriber/worker/message.rb +19 -5
- data/lib/promiscuous/subscriber/worker/message_synchronizer.rb +11 -11
- data/lib/promiscuous/subscriber/worker/pump.rb +51 -22
- data/lib/promiscuous/subscriber/worker.rb +8 -54
- data/lib/promiscuous/version.rb +1 -1
- metadata +5 -22
- data/lib/promiscuous/worker.rb +0 -22
@@ -27,20 +27,12 @@ module Promiscuous::AMQP::RubyAMQP
|
|
27
27
|
e = Promiscuous::AMQP.lost_connection_exception
|
28
28
|
Promiscuous.warn "[amqp] #{e}. Reconnecting..."
|
29
29
|
Promiscuous::Config.error_notifier.try(:call, e)
|
30
|
-
|
31
|
-
worker = Promiscuous::Worker.workers.first
|
32
|
-
worker.message_synchronizer.disconnect if worker
|
33
|
-
|
34
30
|
conn.periodically_reconnect(2.seconds)
|
35
31
|
end
|
36
32
|
end
|
37
33
|
|
38
34
|
connection.on_recovery do |conn|
|
39
35
|
Promiscuous.warn "[amqp] Reconnected"
|
40
|
-
|
41
|
-
worker = Promiscuous::Worker.workers.first
|
42
|
-
worker.message_synchronizer.reconnect if worker
|
43
|
-
|
44
36
|
Promiscuous::AMQP::RubyAMQP.channel.recover
|
45
37
|
end
|
46
38
|
|
data/lib/promiscuous/cli.rb
CHANGED
@@ -1,31 +1,5 @@
|
|
1
1
|
class Promiscuous::CLI
|
2
|
-
def
|
3
|
-
require 'eventmachine'
|
4
|
-
require 'em-synchrony'
|
5
|
-
|
6
|
-
EM.synchrony do
|
7
|
-
trap_signals
|
8
|
-
Promiscuous::Loader.load_descriptors if defined?(Rails)
|
9
|
-
force_backend :rubyamqp
|
10
|
-
block.call
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def force_backend(backend)
|
15
|
-
Promiscuous.disconnect
|
16
|
-
Promiscuous::Config.backend = backend
|
17
|
-
Promiscuous.connect
|
18
|
-
end
|
19
|
-
|
20
|
-
def trap_signals
|
21
|
-
%w(SIGTERM SIGINT).each do |signal|
|
22
|
-
Signal.trap(signal) do
|
23
|
-
print_status "Exiting..."
|
24
|
-
Promiscuous::Worker.kill
|
25
|
-
EM.stop
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
2
|
+
def self.trap_signals
|
29
3
|
Signal.trap 'SIGUSR2' do
|
30
4
|
Thread.list.each do |thread|
|
31
5
|
print_status '-' * 80
|
@@ -38,38 +12,25 @@ class Promiscuous::CLI
|
|
38
12
|
end
|
39
13
|
end
|
40
14
|
end
|
15
|
+
trap_signals
|
41
16
|
|
42
|
-
def
|
43
|
-
print_status "
|
17
|
+
def publish(options={})
|
18
|
+
print_status "Publishing #{options[:criteria]}..."
|
44
19
|
criteria = eval(options[:criteria])
|
45
20
|
|
46
21
|
bar = ProgressBar.create(:format => '%t |%b>%i| %c/%C %e', :title => 'Publishing', :total => criteria.count)
|
47
22
|
criteria.each do |doc|
|
48
|
-
doc.promiscuous_sync
|
23
|
+
doc.promiscuous_sync
|
49
24
|
bar.increment
|
50
25
|
end
|
51
|
-
|
52
|
-
print_status "Done. You may switch your subscriber worker back to regular mode, and delete the sync queues"
|
53
26
|
end
|
54
27
|
|
55
28
|
def subscribe(options={})
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def subscribe_sync(options={})
|
63
|
-
replicate do
|
64
|
-
# Create the regular queue if needed, so we don't lose messages.
|
65
|
-
Promiscuous::AMQP.open_queue(Promiscuous::Subscriber::Worker.new.queue_bindings)
|
66
|
-
|
67
|
-
print_status "WARNING: --- SYNC MODE ----"
|
68
|
-
print_status "WARNING: Make sure you are not running the regular subscriber worker (it's racy)"
|
69
|
-
print_status "WARNING: --- SYNC MODE ----"
|
70
|
-
Promiscuous::Worker.replicate
|
71
|
-
print_status "Replicating with #{Promiscuous::Subscriber::AMQP.subscribers.count} subscribers"
|
72
|
-
end
|
29
|
+
Promiscuous::Loader.load_descriptors if defined?(Rails)
|
30
|
+
print_status "Replicating with #{Promiscuous::Subscriber::AMQP.subscribers.count} subscribers"
|
31
|
+
Promiscuous::Subscriber::Worker.run
|
32
|
+
rescue Interrupt
|
33
|
+
# SIGINT
|
73
34
|
end
|
74
35
|
|
75
36
|
def parse_args(args)
|
@@ -81,20 +42,12 @@ class Promiscuous::CLI
|
|
81
42
|
|
82
43
|
opts.separator ""
|
83
44
|
opts.separator "Actions:"
|
84
|
-
opts.separator " publish (
|
45
|
+
opts.separator " publish \"Model.where(:shard => 123)\""
|
85
46
|
opts.separator " subscribe"
|
86
47
|
opts.separator ""
|
87
48
|
opts.separator "Options:"
|
88
49
|
|
89
|
-
opts.on "-
|
90
|
-
options[:personality] = :sync
|
91
|
-
end
|
92
|
-
|
93
|
-
opts.on "-c", "--criteria CRITERIA", "Published criteria in sync mode. e.g. Member.where(:created_at.gt => 1.day.ago)" do |criteria|
|
94
|
-
options[:criteria] = criteria
|
95
|
-
end
|
96
|
-
|
97
|
-
opts.on "-b", "--bareback", "Bareback mode aka continue on error. Use with extreme caution" do
|
50
|
+
opts.on "-b", "--bareback", "Bareback mode aka no dependencies. Use with extreme caution" do
|
98
51
|
options[:bareback] = true
|
99
52
|
end
|
100
53
|
|
@@ -118,15 +71,23 @@ class Promiscuous::CLI
|
|
118
71
|
parser.parse!(args)
|
119
72
|
|
120
73
|
options[:action] = args.shift.try(:to_sym)
|
121
|
-
|
74
|
+
options[:criteria] = args.shift
|
122
75
|
|
123
|
-
|
76
|
+
unless options[:action].in? [:publish, :subscribe]
|
77
|
+
puts parser
|
78
|
+
exit
|
79
|
+
end
|
80
|
+
|
81
|
+
if options[:action] == :publish
|
124
82
|
raise "Please specify a criteria" unless options[:criteria]
|
125
83
|
else
|
126
84
|
raise "Why are you specifying a criteria?" if options[:criteria]
|
127
85
|
end
|
128
86
|
|
129
87
|
options
|
88
|
+
rescue Exception => e
|
89
|
+
puts e
|
90
|
+
exit
|
130
91
|
end
|
131
92
|
|
132
93
|
def load_app(options={})
|
@@ -142,14 +103,17 @@ class Promiscuous::CLI
|
|
142
103
|
def run
|
143
104
|
options = parse_args(ARGV)
|
144
105
|
load_app(options)
|
145
|
-
|
106
|
+
maybe_run_bareback(options)
|
146
107
|
|
147
|
-
|
148
|
-
|
108
|
+
case options[:action]
|
109
|
+
when :publish then publish(options)
|
110
|
+
when :subscribe then subscribe(options)
|
111
|
+
end
|
149
112
|
end
|
150
113
|
|
151
|
-
def
|
114
|
+
def maybe_run_bareback(options)
|
152
115
|
if options[:bareback]
|
116
|
+
Promiscuous::Config.bareback = true
|
153
117
|
print_status "WARNING: --- BAREBACK MODE ----"
|
154
118
|
print_status "WARNING: You are replicating without protection, you can get corrupted in no time"
|
155
119
|
print_status "WARNING: --- BAREBACK MODE ----"
|
data/lib/promiscuous/config.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Promiscuous::Config
|
2
|
-
mattr_accessor :app, :logger, :error_notifier, :backend, :amqp_url, :redis_url, :queue_options, :heartbeat
|
2
|
+
mattr_accessor :app, :logger, :error_notifier, :backend, :amqp_url, :redis_url, :queue_options, :heartbeat, :bareback
|
3
3
|
|
4
4
|
def self.backend=(value)
|
5
5
|
@@backend = value
|
@@ -43,6 +43,27 @@ module Promiscuous::Publisher::Model::Mongoid
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
module ModelInstanceMethods
|
47
|
+
extend ActiveSupport::Concern
|
48
|
+
|
49
|
+
def promiscuous_sync
|
50
|
+
publisher = self.class.promiscuous_publisher
|
51
|
+
|
52
|
+
fetch_proc = proc { self.class.with(:consistency => :strong).where(atomic_selector).first }
|
53
|
+
|
54
|
+
publisher.new(:operation => :update,
|
55
|
+
:instance => self,
|
56
|
+
:fetch_proc => fetch_proc).commit
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module ClassMethods
|
61
|
+
def setup_class_binding
|
62
|
+
super
|
63
|
+
klass.__send__(:include, ModelInstanceMethods) if klass
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
46
67
|
def self.hook_mongoid
|
47
68
|
Moped::Collection.class_eval do
|
48
69
|
alias_method :insert_orig, :insert
|
@@ -60,7 +60,7 @@ module Promiscuous::Publisher::Model
|
|
60
60
|
with_lock do
|
61
61
|
update_dependencies
|
62
62
|
begin
|
63
|
-
ret = yield
|
63
|
+
ret = yield if block_given?
|
64
64
|
rescue Exception => e
|
65
65
|
# we must publish something so the subscriber can sync
|
66
66
|
# with the updated dependencies
|
@@ -81,11 +81,10 @@ module Promiscuous::Publisher::Model
|
|
81
81
|
ret
|
82
82
|
end
|
83
83
|
|
84
|
-
|
85
84
|
module ClassMethods
|
86
85
|
def setup_class_binding
|
87
86
|
super
|
88
|
-
Promiscuous::Publisher::Model.klasses << klass
|
87
|
+
Promiscuous::Publisher::Model.klasses << klass if klass
|
89
88
|
end
|
90
89
|
end
|
91
90
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
class Promiscuous::Subscriber::Worker::Message
|
2
|
-
attr_accessor :
|
2
|
+
attr_accessor :metadata, :payload, :parsed_payload
|
3
3
|
|
4
|
-
def initialize(
|
5
|
-
self.worker = worker
|
4
|
+
def initialize(metadata, payload)
|
6
5
|
self.metadata = metadata
|
7
6
|
self.payload = payload
|
8
7
|
end
|
@@ -24,6 +23,7 @@ class Promiscuous::Subscriber::Worker::Message
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def has_dependencies?
|
26
|
+
return false if Promiscuous::Config.bareback
|
27
27
|
!!global_version
|
28
28
|
end
|
29
29
|
|
@@ -37,11 +37,25 @@ class Promiscuous::Subscriber::Worker::Message
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
def unit_of_work(type, &block)
|
41
|
+
# type is used by the new relic agent, by monkey patching.
|
42
|
+
# middleware?
|
43
|
+
if defined?(Mongoid)
|
44
|
+
Mongoid.unit_of_work { yield }
|
45
|
+
else
|
46
|
+
yield
|
47
|
+
end
|
48
|
+
ensure
|
49
|
+
if defined?(ActiveRecord)
|
50
|
+
ActiveRecord::Base.clear_active_connections!
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
40
54
|
def process
|
41
|
-
return if worker.stopped?
|
55
|
+
#return if worker.stopped?
|
42
56
|
|
43
57
|
Promiscuous.debug "[receive] #{payload}"
|
44
|
-
|
58
|
+
unit_of_work(queue_name) do
|
45
59
|
Promiscuous::Subscriber.process(parsed_payload, :message => self)
|
46
60
|
end
|
47
61
|
|
@@ -1,13 +1,9 @@
|
|
1
1
|
class Promiscuous::Subscriber::Worker::MessageSynchronizer
|
2
2
|
include Celluloid::IO
|
3
3
|
|
4
|
-
attr_accessor :
|
4
|
+
attr_accessor :redis
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
self.worker = worker
|
8
|
-
end
|
9
|
-
|
10
|
-
def start
|
6
|
+
def initialize
|
11
7
|
connect
|
12
8
|
main_loop!
|
13
9
|
end
|
@@ -36,7 +32,7 @@ class Promiscuous::Subscriber::Worker::MessageSynchronizer
|
|
36
32
|
Promiscuous.warn "[redis] #{e}. Reconnecting..."
|
37
33
|
Promiscuous::Config.error_notifier.try(:call, e)
|
38
34
|
|
39
|
-
|
35
|
+
# TODO stop the pump to unack all messages
|
40
36
|
reconnect_later
|
41
37
|
end
|
42
38
|
|
@@ -56,7 +52,7 @@ class Promiscuous::Subscriber::Worker::MessageSynchronizer
|
|
56
52
|
main_loop!
|
57
53
|
|
58
54
|
Promiscuous.warn "[redis] Reconnected"
|
59
|
-
|
55
|
+
# TODO restart the pump
|
60
56
|
end
|
61
57
|
rescue
|
62
58
|
reconnect_later
|
@@ -94,7 +90,7 @@ class Promiscuous::Subscriber::Worker::MessageSynchronizer
|
|
94
90
|
rescue Exception => e
|
95
91
|
Promiscuous.warn "[redis] #{e} #{e.backtrace.join("\n")}"
|
96
92
|
|
97
|
-
Promiscuous::Worker.stop
|
93
|
+
#Promiscuous::Worker.stop TODO
|
98
94
|
Promiscuous::Config.error_notifier.try(:call, e)
|
99
95
|
end
|
100
96
|
|
@@ -110,15 +106,19 @@ class Promiscuous::Subscriber::Worker::MessageSynchronizer
|
|
110
106
|
# when calling worker.pump.start
|
111
107
|
return unless self.redis
|
112
108
|
|
113
|
-
return
|
109
|
+
return process_message!(msg) unless msg.has_dependencies?
|
114
110
|
|
115
111
|
# The message synchronizer only takes care of happens before (>=) dependencies.
|
116
112
|
# The message will handle the skip logic in case of duplicates.
|
117
113
|
on_version Promiscuous::Redis.sub_key('global'), msg.global_version do
|
118
|
-
|
114
|
+
process_message!(msg)
|
119
115
|
end
|
120
116
|
end
|
121
117
|
|
118
|
+
def process_message!(msg)
|
119
|
+
Celluloid::Actor[:runners].process!(msg)
|
120
|
+
end
|
121
|
+
|
122
122
|
def on_version(key, version, &callback)
|
123
123
|
return unless @subscriptions
|
124
124
|
cb = Subscription::Callback.new(version, callback)
|
@@ -1,42 +1,71 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
|
1
3
|
class Promiscuous::Subscriber::Worker::Pump
|
2
|
-
|
3
|
-
|
4
|
+
include Celluloid
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
# signals do not work when initializing with Celluloid
|
8
|
+
# I wish ruby had semaphores, it would make much more sense.
|
9
|
+
@initialize_mutex = Mutex.new
|
10
|
+
@initialization_done = ConditionVariable.new
|
11
|
+
|
12
|
+
@em_thread = Thread.new { EM.run { start } }
|
13
|
+
|
14
|
+
# The event machine thread will unlock us
|
15
|
+
wait_for_initialization
|
16
|
+
raise @exception if @exception
|
17
|
+
end
|
18
|
+
|
19
|
+
def wait_for_initialization
|
20
|
+
@initialize_mutex.synchronize do
|
21
|
+
@initialization_done.wait(@initialize_mutex)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def finalize_initialization
|
26
|
+
@initialize_mutex.synchronize do
|
27
|
+
@initialization_done.signal
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def finalize
|
32
|
+
@dont_reconnect = true
|
33
|
+
EM.next_tick do
|
34
|
+
Promiscuous::AMQP.disconnect
|
35
|
+
EM.stop
|
36
|
+
end
|
37
|
+
@em_thread.join
|
38
|
+
rescue
|
39
|
+
# Let amqp die like a pro
|
40
|
+
end
|
4
41
|
|
5
|
-
def
|
6
|
-
|
42
|
+
def force_use_ruby_amqp
|
43
|
+
Promiscuous::AMQP.disconnect
|
44
|
+
Promiscuous::Config.backend = :rubyamqp
|
45
|
+
Promiscuous::AMQP.connect
|
7
46
|
end
|
8
47
|
|
9
48
|
def start
|
10
|
-
|
49
|
+
force_use_ruby_amqp
|
11
50
|
Promiscuous::AMQP.open_queue(queue_bindings) do |queue|
|
12
|
-
|
13
|
-
|
14
|
-
# we drop the payload if we switched to another queue,
|
15
|
-
# duplicate messages could hurt us.
|
16
|
-
process_payload(metadata, payload) if queue == @queue
|
51
|
+
queue.subscribe :ack => true do |metadata, payload|
|
52
|
+
process_payload(metadata, payload)
|
17
53
|
end
|
18
54
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
queue, @queue = @queue, nil
|
23
|
-
queue.unsubscribe if queue rescue nil
|
55
|
+
rescue Exception => @exception
|
56
|
+
ensure
|
57
|
+
finalize_initialization
|
24
58
|
end
|
25
59
|
|
26
60
|
def process_payload(metadata, payload)
|
27
|
-
msg = Promiscuous::Subscriber::Worker::Message.new(
|
28
|
-
|
61
|
+
msg = Promiscuous::Subscriber::Worker::Message.new(metadata, payload)
|
62
|
+
Celluloid::Actor[:message_synchronizer].process_when_ready(msg)
|
29
63
|
end
|
30
64
|
|
31
65
|
def queue_bindings
|
32
66
|
queue_name = "#{Promiscuous::Config.app}.promiscuous"
|
33
67
|
exchange_name = Promiscuous::AMQP::EXCHANGE
|
34
68
|
|
35
|
-
if worker.options[:personality]
|
36
|
-
queue_name += ".#{worker.options[:personality]}"
|
37
|
-
exchange_name += ".#{worker.options[:personality]}"
|
38
|
-
end
|
39
|
-
|
40
69
|
# We need to subscribe to everything to keep up with the version tracking
|
41
70
|
bindings = ['*']
|
42
71
|
{:exchange_name => exchange_name, :queue_name => queue_name, :bindings => bindings}
|
@@ -1,59 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'celluloid/io'
|
1
|
+
require 'celluloid'
|
2
|
+
require 'celluloid/io'
|
4
3
|
|
4
|
+
class Promiscuous::Subscriber::Worker < Celluloid::SupervisionGroup
|
5
5
|
extend Promiscuous::Autoload
|
6
6
|
autoload :Message, :Pump, :MessageSynchronizer, :Runner
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(options={})
|
12
|
-
Celluloid.exception_handler { |e| Promiscuous::Config.error_notifier.try(:call, e) }
|
13
|
-
|
14
|
-
self.options = options
|
15
|
-
self.stopped = true
|
16
|
-
|
17
|
-
self.pump = Pump.new(self)
|
18
|
-
end
|
19
|
-
|
20
|
-
def start
|
21
|
-
return unless self.stopped
|
22
|
-
self.stopped = false
|
23
|
-
self.runners = Runner.pool
|
24
|
-
self.message_synchronizer = MessageSynchronizer.new(self)
|
25
|
-
self.message_synchronizer.start
|
26
|
-
self.pump.start
|
27
|
-
end
|
28
|
-
|
29
|
-
def stop
|
30
|
-
return if self.stopped
|
31
|
-
self.pump.stop
|
32
|
-
if self.message_synchronizer
|
33
|
-
self.message_synchronizer.stop rescue Celluloid::Task::TerminatedError
|
34
|
-
self.message_synchronizer = nil
|
35
|
-
end
|
36
|
-
if self.runners
|
37
|
-
self.runners.terminate
|
38
|
-
self.runners = nil
|
39
|
-
end
|
40
|
-
self.stopped = true
|
41
|
-
|
42
|
-
# TODO wait for the runners to finish
|
43
|
-
sleep 1
|
44
|
-
end
|
45
|
-
|
46
|
-
def unit_of_work(type, &block)
|
47
|
-
# type is used by the new relic agent, by monkey patching.
|
48
|
-
# middleware?
|
49
|
-
if defined?(Mongoid)
|
50
|
-
Mongoid.unit_of_work { yield }
|
51
|
-
else
|
52
|
-
yield
|
53
|
-
end
|
54
|
-
ensure
|
55
|
-
if defined?(ActiveRecord)
|
56
|
-
ActiveRecord::Base.clear_active_connections!
|
57
|
-
end
|
58
|
-
end
|
8
|
+
pool Runner, :as => :runners, :size => 10
|
9
|
+
supervise MessageSynchronizer, :as => :message_synchronizer
|
10
|
+
supervise Pump, :as => :pump
|
59
11
|
end
|
12
|
+
|
13
|
+
Celluloid.exception_handler { |e| Promiscuous::Config.error_notifier.try(:call, e) }
|
data/lib/promiscuous/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: promiscuous
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.50.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-02-
|
13
|
+
date: 2013-02-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -76,22 +76,6 @@ dependencies:
|
|
76
76
|
- - ~>
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: 0.9.8
|
79
|
-
- !ruby/object:Gem::Dependency
|
80
|
-
name: em-synchrony
|
81
|
-
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
|
-
requirements:
|
84
|
-
- - ~>
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 1.0.3
|
87
|
-
type: :runtime
|
88
|
-
prerelease: false
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
|
-
requirements:
|
92
|
-
- - ~>
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: 1.0.3
|
95
79
|
- !ruby/object:Gem::Dependency
|
96
80
|
name: ruby-progressbar
|
97
81
|
requirement: !ruby/object:Gem::Requirement
|
@@ -182,8 +166,8 @@ extensions: []
|
|
182
166
|
extra_rdoc_files: []
|
183
167
|
files:
|
184
168
|
- lib/promiscuous/amqp/null.rb
|
185
|
-
- lib/promiscuous/amqp/ruby_amqp.rb
|
186
169
|
- lib/promiscuous/amqp/bunny.rb
|
170
|
+
- lib/promiscuous/amqp/ruby_amqp.rb
|
187
171
|
- lib/promiscuous/common/lint/base.rb
|
188
172
|
- lib/promiscuous/common/class_helpers.rb
|
189
173
|
- lib/promiscuous/common/options.rb
|
@@ -230,10 +214,10 @@ files:
|
|
230
214
|
- lib/promiscuous/subscriber/lint.rb
|
231
215
|
- lib/promiscuous/subscriber/mongoid.rb
|
232
216
|
- lib/promiscuous/subscriber/observer.rb
|
233
|
-
- lib/promiscuous/subscriber/model.rb
|
234
217
|
- lib/promiscuous/subscriber/amqp.rb
|
235
218
|
- lib/promiscuous/subscriber/dummy.rb
|
236
219
|
- lib/promiscuous/subscriber/worker.rb
|
220
|
+
- lib/promiscuous/subscriber/model.rb
|
237
221
|
- lib/promiscuous/error/subscriber.rb
|
238
222
|
- lib/promiscuous/error/publisher.rb
|
239
223
|
- lib/promiscuous/error/connection.rb
|
@@ -245,12 +229,11 @@ files:
|
|
245
229
|
- lib/promiscuous/railtie.rb
|
246
230
|
- lib/promiscuous/common.rb
|
247
231
|
- lib/promiscuous/publisher.rb
|
248
|
-
- lib/promiscuous/worker.rb
|
249
232
|
- lib/promiscuous/amqp.rb
|
250
233
|
- lib/promiscuous/subscriber.rb
|
234
|
+
- lib/promiscuous/redis.rb
|
251
235
|
- lib/promiscuous/config.rb
|
252
236
|
- lib/promiscuous/cli.rb
|
253
|
-
- lib/promiscuous/redis.rb
|
254
237
|
- lib/promiscuous/version.rb
|
255
238
|
- lib/promiscuous.rb
|
256
239
|
- bin/promiscuous
|
data/lib/promiscuous/worker.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Promiscuous::Worker
|
2
|
-
mattr_accessor :workers
|
3
|
-
self.workers = []
|
4
|
-
|
5
|
-
def self.replicate(options={})
|
6
|
-
self.workers << Promiscuous::Subscriber::Worker.new(options).tap { |w| w.start }
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.kill
|
10
|
-
stop
|
11
|
-
# TODO FIXME We should wait for them to be idle
|
12
|
-
workers.clear
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.stop
|
16
|
-
workers.each(&:stop)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.start
|
20
|
-
workers.each(&:start)
|
21
|
-
end
|
22
|
-
end
|