queue_classic 2.1.1 → 2.1.2

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.
@@ -61,6 +61,11 @@ module QC
61
61
  default_queue.send(sym, *args, &block)
62
62
  end
63
63
 
64
+ # Ensure QC.respond_to?(:enqueue) equals true (ruby 1.9 only)
65
+ def self.respond_to_missing?(method_name, include_private = false)
66
+ default_queue.respond_to?(method_name)
67
+ end
68
+
64
69
  def self.default_queue
65
70
  @default_queue ||= begin
66
71
  Queue.new(QUEUE)
@@ -86,7 +86,7 @@ module QC
86
86
  def connect
87
87
  log(:at => "establish_conn")
88
88
  conn = PGconn.connect(
89
- db_url.host,
89
+ db_url.host.gsub(/%2F/i, '/'), # host or percent-encoded socket path
90
90
  db_url.port || 5432,
91
91
  nil, '', #opts, tty
92
92
  db_url.path.gsub("/",""), # database name
@@ -41,20 +41,11 @@ module QC
41
41
  Process.wait(@cpid)
42
42
  end
43
43
 
44
- # This method will lock a job & evaluate the code defined by the job.
45
- # Also, this method will make the best attempt to delete the job
46
- # from the queue before returning.
44
+ # This method will lock a job & process the job.
47
45
  def work
48
46
  if job = lock_job
49
47
  QC.log_yield(:at => "work", :job => job[:id]) do
50
- begin
51
- call(job)
52
- rescue => e
53
- handle_failure(job, e)
54
- ensure
55
- @queue.delete(job[:id])
56
- log(:at => "delete_job", :job => job[:id])
57
- end
48
+ process(job)
58
49
  end
59
50
  end
60
51
  end
@@ -90,6 +81,21 @@ module QC
90
81
  job
91
82
  end
92
83
 
84
+ # A job is processed by evaluating the target code.
85
+ # Errors are delegated to the handle_failure method.
86
+ # Also, this method will make the best attempt to delete the job
87
+ # from the queue before returning.
88
+ def process(job)
89
+ begin
90
+ call(job)
91
+ rescue => e
92
+ handle_failure(job, e)
93
+ ensure
94
+ @queue.delete(job[:id])
95
+ log(:at => "delete_job", :job => job[:id])
96
+ end
97
+ end
98
+
93
99
  # Each job includes a method column. We will use ruby's eval
94
100
  # to grab the ruby object from memory. We send the method to
95
101
  # the object and pass the args.
data/readme.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # queue_classic
2
2
 
3
- v2.1.1
3
+ v2.1.2
4
4
 
5
5
  queue_classic provides a simple interface to a PostgreSQL-backed message queue. queue_classic specializes in concurrent locking and minimizing database load while providing a simple, intuitive developer experience. queue_classic assumes that you are already using PostgreSQL in your production environment and that adding another dependency (e.g. redis, beanstalkd, 0mq) is undesirable.
6
6
 
@@ -47,7 +47,7 @@ QC.enqueue("Kernel.puts", {"hello" => "world"})
47
47
  QC.enqueue("Kernel.puts", ["hello", "world"])
48
48
 
49
49
  # This method uses a non-default queue.
50
- p_queue = QC::Queue.new(q_name: "priority_queue")
50
+ p_queue = QC::Queue.new("priority_queue")
51
51
  p_queue.enqueue("Kernel.puts", ["hello", "world"])
52
52
  ```
53
53
 
@@ -83,7 +83,7 @@ $ bundle exec rake qc:work
83
83
  Setup a worker to work a non-default queue.
84
84
 
85
85
  ```bash
86
- $ QUEUE="p_queue" bundle exec rake qc:work
86
+ $ QUEUE="priority_queue" bundle exec rake qc:work
87
87
  ```
88
88
 
89
89
  #### Custom Worker
@@ -110,13 +110,7 @@ worker = MyWorker.new(max_attempts: 10, listening_worker: true)
110
110
  loop do
111
111
  job = worker.lock_job
112
112
  Thread.new do
113
- begin
114
- Timeout::timeout(5) {worker.call(job)}
115
- rescue => e
116
- handle_failure(job, e)
117
- ensure
118
- worker.delete(job[:id])
119
- end
113
+ Timeout::timeout(5) { worker.process(job) }
120
114
  end
121
115
  end
122
116
  ```
@@ -1,5 +1,5 @@
1
1
  CREATE TABLE queue_classic_jobs (
2
- id serial PRIMARY KEY,
2
+ id bigserial PRIMARY KEY,
3
3
  q_name varchar(255),
4
4
  method varchar(255),
5
5
  args text,
@@ -6,7 +6,7 @@
6
6
  CREATE OR REPLACE FUNCTION lock_head(q_name varchar, top_boundary integer)
7
7
  RETURNS SETOF queue_classic_jobs AS $$
8
8
  DECLARE
9
- unlocked integer;
9
+ unlocked bigint;
10
10
  relative_top integer;
11
11
  job_count integer;
12
12
  BEGIN
@@ -21,6 +21,32 @@ class QCTest < MiniTest::Unit::TestCase
21
21
  QC::Conn.execute("SET client_min_messages TO 'warning'")
22
22
  QC::Setup.drop
23
23
  QC::Setup.create
24
+ QC::Conn.execute(<<EOS)
25
+ DO $$
26
+ -- Set initial sequence to a large number to test the entire toolchain
27
+ -- works on integers with higher bits set.
28
+ DECLARE
29
+ quoted_name text;
30
+ quoted_size text;
31
+ BEGIN
32
+ -- Find the name of the relevant sequence.
33
+ --
34
+ -- pg_get_serial_sequence quotes identifiers as part of its
35
+ -- behavior.
36
+ SELECT name
37
+ INTO STRICT quoted_name
38
+ FROM pg_get_serial_sequence('queue_classic_jobs', 'id') AS name;
39
+
40
+ -- Don't quote, because ALTER SEQUENCE RESTART doesn't like
41
+ -- general literals, only unquoted numeric literals.
42
+ SELECT pow(2, 34)::text AS size
43
+ INTO STRICT quoted_size;
44
+
45
+ EXECUTE 'ALTER SEQUENCE ' || quoted_name ||
46
+ ' RESTART ' || quoted_size || ';';
47
+ END;
48
+ $$;
49
+ EOS
24
50
  QC::Conn.disconnect
25
51
  end
26
52
 
@@ -6,9 +6,16 @@ class QueueTest < QCTest
6
6
  QC.enqueue("Klass.method")
7
7
  end
8
8
 
9
+ def test_respond_to
10
+ assert_equal(true, QC.respond_to?(:enqueue))
11
+ end
12
+
9
13
  def test_lock
10
14
  QC.enqueue("Klass.method")
11
- expected = {:id=>"1", :method=>"Klass.method", :args=>[]}
15
+
16
+ # See helper.rb for more information about the large initial id
17
+ # number.
18
+ expected = {:id=>(2**34).to_s, :method=>"Klass.method", :args=>[]}
12
19
  assert_equal(expected, QC.lock)
13
20
  end
14
21
 
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: 2.1.1
4
+ version: 2.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: