queue_classic 0.3.5.pre → 0.3.7.pre

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.
@@ -27,6 +27,11 @@ module QC
27
27
  execute("SET application_name = 'queue_classic'")
28
28
  end
29
29
 
30
+ def notify
31
+ log("NOTIFY")
32
+ execute("NOTIFY queue_classic_jobs")
33
+ end
34
+
30
35
  def listen
31
36
  log("LISTEN")
32
37
  execute("LISTEN queue_classic_jobs")
@@ -37,9 +42,15 @@ module QC
37
42
  execute("UNLISTEN queue_classic_jobs")
38
43
  end
39
44
 
40
- def wait_for_notify
41
- log("waiting for notify timeout=#{NOTIFY_TIMEOUT}")
42
- connection.wait_for_notify(NOTIFY_TIMEOUT)
45
+ def drain_notify
46
+ until connection.notifies.nil?
47
+ log("draining notifications")
48
+ end
49
+ end
50
+
51
+ def wait_for_notify(t)
52
+ log("waiting for notify timeout=#{t}")
53
+ connection.wait_for_notify(t)
43
54
  log("done waiting for notify")
44
55
  end
45
56
 
@@ -14,6 +14,9 @@ module QC
14
14
  @fork_worker = ENV["QC_FORK_WORKER"] == "true"
15
15
  log("worker fork=#{@fork_worker}")
16
16
 
17
+ @listening_worker = ENV["QC_LISTENING_WORKER"] == "true"
18
+ log("worker listen=#{@listening_worker}")
19
+
17
20
  handle_signals
18
21
  end
19
22
 
@@ -25,6 +28,10 @@ module QC
25
28
  @fork_worker
26
29
  end
27
30
 
31
+ def can_listen?
32
+ @listening_worker
33
+ end
34
+
28
35
  def handle_signals
29
36
  %W(INT TERM).each do |sig|
30
37
  trap(sig) do
@@ -88,8 +95,7 @@ module QC
88
95
  attempts += 1
89
96
  if attempts < MAX_LOCK_ATTEMPTS
90
97
  seconds = 2**attempts
91
- log("worker sleeps seconds=#{seconds}")
92
- sleep(seconds)
98
+ wait(seconds)
93
99
  log("worker tries again")
94
100
  next
95
101
  else
@@ -103,6 +109,20 @@ module QC
103
109
  job
104
110
  end
105
111
 
112
+ def wait(t)
113
+ if can_listen?
114
+ log("worker waiting on LISTEN")
115
+ @queue.database.listen
116
+ @queue.database.wait_for_notify(t) { log("message received") }
117
+ @queue.database.unlisten
118
+ @queue.database.drain_notify
119
+ log("worker finished LISTEN")
120
+ else
121
+ log("worker sleeps seconds=#{t}")
122
+ Kernel.sleep(t)
123
+ end
124
+ end
125
+
106
126
  #override this method to do whatever you want
107
127
  def handle_failure(job,e)
108
128
  puts "!"
@@ -0,0 +1,28 @@
1
+ require File.expand_path("../helper.rb", __FILE__)
2
+
3
+ context "DatabaseTest" do
4
+
5
+ setup do
6
+ @database = init_db
7
+ end
8
+
9
+ teardown do
10
+ @database.disconnect
11
+ end
12
+
13
+ test "drain_notify clears all of the notifications" do
14
+ @database.listen
15
+ @database.execute("NOTIFY queue_classic_jobs, 'hello'")
16
+
17
+ assert ! @database.connection.notifies.nil?
18
+ assert @database.connection.notifies.nil?
19
+
20
+ @database.execute("NOTIFY queue_classic_jobs, 'hello'")
21
+ @database.execute("NOTIFY queue_classic_jobs, 'hello'")
22
+ @database.execute("NOTIFY queue_classic_jobs, 'hello'")
23
+
24
+ @database.drain_notify
25
+ assert @database.connection.notifies.nil?
26
+ end
27
+
28
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queue_classic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5.pre
4
+ version: 0.3.7.pre
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-08-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pg
16
- requirement: &2160828260 !ruby/object:Gem::Requirement
16
+ requirement: &2152255440 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 0.11.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2160828260
24
+ version_requirements: *2152255440
25
25
  description: Queue Classic (beta) is a queueing library for Ruby apps (Rails, Sinatra,
26
26
  Etc...) Queue Classic features asynchronous job polling, database maintained locks
27
27
  and no ridiculous dependencies. As a matter of fact, Queue Classic only requires
@@ -41,6 +41,7 @@ files:
41
41
  - lib/queue_classic/worker.rb
42
42
  - lib/queue_classic.rb
43
43
  - test/database_helpers.rb
44
+ - test/database_test.rb
44
45
  - test/durable_array_test.rb
45
46
  - test/helper.rb
46
47
  - test/job_test.rb
@@ -74,6 +75,7 @@ summary: Queue Classic (beta) is a queueing library for Ruby apps (Rails, Sinatr
74
75
  and no ridiculous dependencies. As a matter of fact, Queue Classic only requires
75
76
  the pg and json.(simple)
76
77
  test_files:
78
+ - test/database_test.rb
77
79
  - test/durable_array_test.rb
78
80
  - test/job_test.rb
79
81
  - test/queue_test.rb