isimud 1.4.6 → 1.4.7

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: 2769638fbc9d69ddf26502e1929baf2884a2e821
4
- data.tar.gz: 3f565c195f891af40a07e9c9f05bea6557c9519e
3
+ metadata.gz: d4207fca361f4d4e6c45f15c44fe366661d5894b
4
+ data.tar.gz: 5a0e5c2016441e4d23c98efe6fc5c84575c3b96b
5
5
  SHA512:
6
- metadata.gz: c3aac1635d4399cf011cb013b7d5930bfb9026f7da390ce2d78db1e451dc90b73d44d2d6e2759185b0392820f0fd6a1176dfa9a5db7b4520e117dfbee59b1690
7
- data.tar.gz: bb8de5051878f5a25e1552934c9a4c22b44691e45dfd59e30396c76e89de894a037b7617f5bde92cdf7b28fe1ac859560b63fb930e0ed1b7ed22347d2bdad485
6
+ metadata.gz: f64c5e07ce74f71273c98647359d12a89985eef2a779b0a63f7cb94377316be78bce63fc2554c124df7be9508f8e77054539c22c3ffe1f7a3637e82bc99c2252
7
+ data.tar.gz: b0808273f6ad6c0364688652ccc7f9bcdcb6d80841629c6ebb1a0142878618c8ef28a5bc99537be095ae707ba057ec7b9fa22ecb31953b50a603e236bafd4e4b
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -86,7 +86,7 @@ for each instance.
86
86
  2. Custom standalone queues. You may extend EventListener to declare individual queues not associated with a specific
87
87
  object instance.
88
88
 
89
- The EventListener process will automatically create queues on initial startup if they do not already exist. This allows
89
+ The EventListener process will automatically create and bind queues on startup if they do not already exist. This allows
90
90
  for cold startup on a new AMQP broker.
91
91
 
92
92
  ### Message Delivery Information and Metadata
@@ -120,6 +120,13 @@ the message is not re-queued.
120
120
 
121
121
  # Changes
122
122
 
123
+ ## 1.4.7
124
+
125
+ * Simplify the AMQP queue lifecycle for EventObserver instances when they are updated.
126
+ * Any previously existing queue for the instance is deleted on the broker.
127
+ * When an EventListener process receives the EventObserver update message, it always recreates and rebinds the
128
+ queue for the instance.
129
+
123
130
  ## 1.4.6
124
131
 
125
132
  * When consuming messages, use the channel setting from the delivery_info
@@ -0,0 +1 @@
1
+ fe13f8a3d39cb69f6d3dea3520349d29dfd4ea05608b3b233797d32074007b2bb9b502c9bf4682defcd3ca8997a023157e58f9f957380ab0b68f6471d85594b0
@@ -121,6 +121,11 @@ module Isimud
121
121
  @observers.has_key?(observer_key_for(observer.class, observer.id))
122
122
  end
123
123
 
124
+ # @private
125
+ def find_observer(klass, id)
126
+ @observers[observer_key_for(klass, id)]
127
+ end
128
+
124
129
  private
125
130
 
126
131
  def test_env?
@@ -242,7 +247,7 @@ module Isimud
242
247
  def register_observer(observer)
243
248
  @observer_mutex.synchronize do
244
249
  log "EventListener: registering observer #{observer.class} #{observer.id}"
245
- @observers[observer_key_for(observer.class, observer.id)] = observer.observe_events(client, initializing?)
250
+ @observers[observer_key_for(observer.class, observer.id)] = observer.observe_events(client)
246
251
  end
247
252
  end
248
253
 
@@ -53,13 +53,12 @@ module Isimud
53
53
  # Create or attach to a queue on the specified exchange. When an event message that matches the observer's routing keys
54
54
  # is received, parse the event and call handle_event on same.
55
55
  # @param [Isimud::Client] client client instance
56
- # @param [Boolean] refresh_bindings when set, refresh bindings on queue (true)
57
56
  # @return queue or consumer object
58
57
  # @see BunnyClient#subscribe
59
58
  # @see TestClient#subscribe
60
- def observe_events(client, refresh_bindings = true)
59
+ def observe_events(client)
61
60
  return unless enable_listener?
62
- queue = (refresh_bindings || client.kind_of?(Isimud::TestClient)) ? create_queue(client) : client.find_queue(event_queue_name)
61
+ queue = create_queue(client)
63
62
  client.subscribe(queue) do |message|
64
63
  event = Event.parse(message)
65
64
  handle_event(event)
@@ -99,18 +98,8 @@ module Isimud
99
98
  end
100
99
 
101
100
  def update_queue
102
- if enable_listener?
103
- routing_key_changes = previous_changes[:exchange_routing_keys]
104
- prev_keys = routing_key_changes.try(:[], 0) || []
105
- current_keys = routing_key_changes.try(:[], 1) || exchange_routing_keys
106
- queue = isimud_client.find_queue(event_queue_name)
107
- exchange = observed_exchange || Isimud.events_exchange
108
- (prev_keys - current_keys).each { |key| queue.unbind(exchange, routing_key: key) }
109
- log "Isimud::EventObserver: binding queue #{event_queue_name} on exchange #{exchange} with bindings [#{current_keys.join(',')}]"
110
- (current_keys).each { |key| queue.bind(exchange, routing_key: key) }
111
- else
112
- isimud_client.delete_queue(event_queue_name)
113
- end
101
+ delete_queue
102
+ create_queue if enable_listener? && exchange_routing_keys.any?
114
103
  end
115
104
 
116
105
  def delete_queue(client = isimud_client)
@@ -28,7 +28,6 @@ module Isimud
28
28
  end
29
29
 
30
30
  def cancel
31
- @proc = nil
32
31
  end
33
32
 
34
33
  def delete(opts = {})
@@ -81,6 +80,7 @@ module Isimud
81
80
  end
82
81
 
83
82
  def delete_queue(queue_name)
83
+ log "Isimud::TestClient: deleting queue #{queue_name}"
84
84
  queues.delete(queue_name)
85
85
  end
86
86
 
@@ -89,13 +89,13 @@ module Isimud
89
89
  subscribe(queue, &block)
90
90
  end
91
91
 
92
- def find_queue(queue_name, options = {})
92
+ def find_queue(queue_name, _options = {})
93
93
  queues[queue_name] ||= Queue.new(self, queue_name)
94
94
  end
95
95
 
96
96
  def create_queue(queue_name, exchange_name, options = {})
97
97
  keys = options[:routing_keys] || []
98
- log "Isimud::TestClient: Binding queue #{queue_name} for keys #{keys.inspect}"
98
+ log "Isimud::TestClient: Binding queue #{queue_name} on exchange #{exchange_name} for keys #{keys.inspect}"
99
99
  queue = find_queue(queue_name)
100
100
  keys.each do |k|
101
101
  queue.bind(exchange_name, routing_key: k)
@@ -103,7 +103,8 @@ module Isimud
103
103
  queue
104
104
  end
105
105
 
106
- def subscribe(queue, options = {}, &block)
106
+ def subscribe(queue, _options = {}, &block)
107
+ log "Isimud::TestClient: subscribing to events on queue #{queue.name}"
107
108
  queue.proc = block
108
109
  queue
109
110
  end
@@ -1,3 +1,3 @@
1
1
  module Isimud
2
- VERSION = '1.4.6'
2
+ VERSION = '1.4.7'
3
3
  end
@@ -22,11 +22,18 @@ class Company < ActiveRecord::Base
22
22
  end
23
23
 
24
24
  def handle_event(event)
25
+ Rails.logger.info "Company#handle_event: id=#{id} event=#{event.inspect}"
25
26
  user = User.find(event.parameters[:id])
26
27
  return unless user.company_id == id
27
- raise "unexpected action: #{event.action}" unless ['create','destroy' ].include?(event.action.to_s)
28
- self.user_count = User.where(company: self).count
29
- self.total_points = user_count * points_per_user
28
+ case event.action
29
+ when :create
30
+ Rails.logger.info "recording new user for company #{id}"
31
+ self.user_count += 1
32
+ self.total_points += points_per_user
33
+ when :destroy
34
+ self.user_count -= 1
35
+ self.total_points -= points_per_user
36
+ end
30
37
  save!
31
38
  end
32
39
  end
@@ -1,9 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Isimud::EventListener do
4
- let!(:company) { Company.create(name: 'Google', active: true) }
4
+ before do
5
+ @company = Company.create(name: 'Google', active: true)
6
+ @listener = Isimud::EventListener.new(name: 'all_ears', error_limit: 5, exchange: 'test-listener')
7
+ end
8
+
9
+ let!(:company) { @company }
5
10
  let!(:inactive_company) { Company.create(name: 'Radio Shack', active: false) }
6
- let!(:listener) { Isimud::EventListener.new(name: 'all_ears', error_limit: 5, exchange: 'test-listener') }
11
+ let!(:listener) { @listener }
7
12
 
8
13
  after(:each) do
9
14
  Isimud.client.reset
@@ -75,13 +80,9 @@ describe Isimud::EventListener do
75
80
 
76
81
  context 'handling observer update messages' do
77
82
  it 'reloads the observer and processes events accordingly' do
83
+ expect(listener).to receive(:unregister_observer).with('Company', company.id).and_call_original
84
+ expect(listener).to receive(:register_observer).with an_instance_of(Company)
78
85
  company.update_attributes!(points_per_user: 2)
79
- expect(listener).to have_observer(company)
80
- expect {
81
- User.create!(company: company, first_name: 'Larry', last_name: 'Page')
82
- company.reload
83
- }.to change(company, :user_count).by(1)
84
- expect(company.total_points).to eql(company.user_count * 2)
85
86
  end
86
87
  end
87
88
 
@@ -57,14 +57,9 @@ describe Isimud::EventObserver do
57
57
  end
58
58
 
59
59
  it 'creates the queue' do
60
- expect(@client).to receive(:find_queue).with(@user.event_queue_name).and_call_original
61
- @user.update_attributes(deactivated: false)
62
- end
63
-
64
- it 'binds the routing keys' do
65
- @user.exchange_routing_keys.each do |k|
66
- expect(@queue).to receive(:bind).with(@exchange, routing_key: k).and_call_original
67
- end
60
+ expect(@client).to receive(:create_queue).with("combustion.user.#{@user.id}",
61
+ @exchange,
62
+ routing_keys: keys)
68
63
  @user.update_attributes(deactivated: false)
69
64
  end
70
65
  end
@@ -75,23 +70,17 @@ describe Isimud::EventObserver do
75
70
  @queue = @client.find_queue(@user.event_queue_name)
76
71
  end
77
72
 
78
- it 'binds new keys' do
79
- @user.exchange_routing_keys.each do |k|
80
- expect(@queue).to receive(:bind).with(@exchange, routing_key: k).and_call_original
81
- end
82
- expect(@queue).to receive(:bind).with(@exchange, routing_key: 'some_other_value').and_call_original
73
+ it 'deletes and recreates the queue' do
74
+ new_keys = keys << 'some_other_value'
75
+ expect(@client).to receive(:delete_queue).with(@user.event_queue_name)
76
+ expect(@client).to receive(:create_queue).with("combustion.user.#{@user.id}",
77
+ @exchange,
78
+ routing_keys: new_keys)
83
79
  @user.transaction do
84
80
  @user.keys << 'some_other_value'
85
81
  @user.save!
86
82
  end
87
83
  end
88
-
89
- it 'removes old keys' do
90
- expect(@queue).to receive(:unbind).with(@exchange, routing_key: 'a.b.c')
91
- expect(@queue).not_to receive(:unbind).with(@exchange, routing_key: 'd.*.f')
92
- @user.keys.delete('a.b.c')
93
- @user.save!
94
- end
95
84
  end
96
85
  end
97
86
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isimud
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.6
4
+ version: 1.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - George Feil
@@ -31,7 +31,7 @@ cert_chain:
31
31
  wSKk31gq6KY7rgi11mcLvVzwSuwZFqnonAmu/uin3cbXcOUkqNsyzZ0LQLXNKiwi
32
32
  k0RgrsSNtQ8hcsVSQla0Ot+X3WpFI4ZuIfSLFA==
33
33
  -----END CERTIFICATE-----
34
- date: 2016-09-20 00:00:00.000000000 Z
34
+ date: 2017-03-10 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activerecord
@@ -120,6 +120,7 @@ files:
120
120
  - checksum/isimud-1.4.3.gem.sha512
121
121
  - checksum/isimud-1.4.4.gem.sha512
122
122
  - checksum/isimud-1.4.5.gem.sha512
123
+ - checksum/isimud-1.4.6.gem.sha512
123
124
  - config.ru
124
125
  - config/tddium.yml
125
126
  - doc/Isimud.html
metadata.gz.sig CHANGED
Binary file