worker_roulette 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,7 @@ module WorkerRoulette
4
4
  def wait_for_work_orders(on_subscribe_callback = nil, &on_message_callback)
5
5
  @redis_pubsub ||= WorkerRoulette.new_redis_pubsub #cannot use connection pool bc redis expects each obj to own its own pubsub connection for the life of the subscription
6
6
  @redis_pubsub.on(:subscribe) {|channel, subscription_count| on_subscribe_callback.call(channel, subscription_count) if on_subscribe_callback}
7
- @redis_pubsub.on(:message) {|channel, message| work_orders! {|work_orders| on_message_callback.call(work_orders, message, channel)} if on_message_callback}
7
+ @redis_pubsub.on(:message) {|channel, message| set_timer(on_message_callback); work_orders! {|work_orders| on_message_callback.call(work_orders, message, channel)} if on_message_callback}
8
8
  @redis_pubsub.subscribe(@channel)
9
9
  end
10
10
 
@@ -30,6 +30,15 @@ module WorkerRoulette
30
30
  end
31
31
 
32
32
  private
33
+ attr_reader :timer
34
+ def set_timer(on_message_callback)
35
+ return unless on_message_callback
36
+ @timer && @timer.cancel
37
+ @timer = EM::PeriodicTimer.new(rand(20..25)) do
38
+ work_orders! {|work_orders| on_message_callback.call(work_orders, nil, nil)}
39
+ end
40
+ end
41
+
33
42
  def self.lua_drain_work_orders
34
43
  <<-HERE
35
44
  local job_board_key = KEYS[1]
@@ -1,3 +1,3 @@
1
1
  module WorkerRoulette
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
@@ -227,15 +227,49 @@ describe WorkerRoulette do
227
227
  EM::Hiredis::PubsubClient.any_instance.should_receive(:close_connection).and_call_original
228
228
  end
229
229
 
230
- it "should periodically (random time between 10 and 15 seconds?) poll the job board for new work, in case it missed a notification"
231
- it "should not delete the messages from the queue until they have been processed succcesfully"
232
- it "should not cache the sender our counter keys"
233
- it "should pull off work orders for more than one sender"
230
+ it "should periodically (random time between 20 and 25 seconds?) poll the job board for new work, in case it missed a notification" do
231
+ EM::PeriodicTimer.should_receive(:new) {|time| time.should be_within(2.5).of(22.5)}
232
+ publish = proc {foreman.enqueue_work_order('foo')}
233
+ subject.wait_for_work_orders(publish) {done}
234
+ end
235
+
236
+ xit "should cancel the old timer when the on_message callback is called" do
237
+ publish = proc {foreman.enqueue_work_order('foo')}
238
+ subject.wait_for_work_orders(publish) do
239
+ subject.send(:timer).should_receive(:cancel).and_call_original
240
+ done
241
+ end
242
+ end
243
+
244
+ it "should pull off work orders for more than one sender" do
245
+ tradesman = WorkerRoulette.a_tradesman('good_channel')
246
+
247
+ good_foreman = WorkerRoulette.a_foreman('good_foreman', 'good_channel')
248
+ lazy_foreman = WorkerRoulette.a_foreman('lazy_foreman', 'good_channel')
249
+
250
+ got_good = false
251
+ got_lazy = false
252
+ good_foreman.enqueue_work_order('do good work') do
253
+ tradesman.work_orders! do |r|
254
+ got_good = true
255
+ r.first['payload'].should == ('do good work')
256
+ end
257
+ end
258
+ lazy_foreman.enqueue_work_order('just get it done') do
259
+ tradesman.work_orders! do |r|
260
+ got_lazy = true
261
+ r.first['payload'].should == ('just get it done')
262
+ end
263
+ end
264
+
265
+ done(0.2) {(got_good && got_lazy).should == true}
266
+ end
234
267
  end
235
268
 
236
- context "Read Lock" do
237
- it "should checkout a readlock for a queue and put it back when its done processing; lock should expire after 5 minutes?"
238
- it "should retry doing work on a queue 3 times if it is locked (ex backoff)"
269
+ context "Potential Ack Success/Failure for Processing Queues" do
270
+ xit "should not delete the messages from the queue until they have been processed succcesfully"
271
+ xit "should checkout a readlock for a queue and put it back when its done processing; lock should expire after 5 minutes?"
272
+ xit "should retry doing work on a queue 3 times if it is locked (ex backoff)"
239
273
  end
240
274
 
241
275
  context "Failure" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: worker_roulette
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: