queue_classic 2.0.0rc12 → 2.0.0rc13

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.
@@ -9,6 +9,7 @@ require "queue_classic/conn"
9
9
  require "queue_classic/queries"
10
10
  require "queue_classic/queue"
11
11
  require "queue_classic/worker"
12
+ require "queue_classic/setup"
12
13
 
13
14
  module QC
14
15
  # ENV["LOG_LEVEL"] is used in Scrolls
@@ -17,6 +18,7 @@ module QC
17
18
  Root = File.expand_path("..", File.dirname(__FILE__))
18
19
  SqlFunctions = File.join(QC::Root, "/sql/ddl.sql")
19
20
  DropSqlFunctions = File.join(QC::Root, "/sql/drop_ddl.sql")
21
+ CreateTable = File.join(QC::Root, "/sql/create_table.sql")
20
22
 
21
23
  # You can use the APP_NAME to query for
22
24
  # postgres related process information in the
@@ -38,21 +38,5 @@ module QC
38
38
  Conn.execute(*[s, q_name].compact)
39
39
  end
40
40
 
41
- def load_functions
42
- file = File.open(SqlFunctions)
43
- Conn.transaction do
44
- Conn.execute(file.read)
45
- end
46
- file.close
47
- end
48
-
49
- def drop_functions
50
- file = File.open(DropSqlFunctions)
51
- Conn.transaction do
52
- Conn.execute(file.read)
53
- end
54
- file.close
55
- end
56
-
57
41
  end
58
42
  end
@@ -0,0 +1,40 @@
1
+ module QC
2
+ module Setup
3
+ extend self
4
+
5
+ def create
6
+ create_table
7
+ create_functions
8
+ end
9
+
10
+ def drop
11
+ drop_functions
12
+ drop_table
13
+ end
14
+
15
+ def create_table
16
+ Conn.transaction do
17
+ Conn.execute(File.read(CreateTable))
18
+ end
19
+ end
20
+
21
+ def drop_table
22
+ Conn.transaction do
23
+ Conn.execute("DROP TABLE IF EXISTS queue_classic_jobs")
24
+ end
25
+ end
26
+
27
+ def create_functions
28
+ Conn.transaction do
29
+ Conn.execute(File.read(SqlFunctions))
30
+ end
31
+ end
32
+
33
+ def drop_functions
34
+ Conn.transaction do
35
+ Conn.execute(File.read(DropSqlFunctions))
36
+ end
37
+ end
38
+
39
+ end
40
+ end
@@ -6,33 +6,21 @@ end
6
6
  namespace :qc do
7
7
  desc "Start a new worker for the (default or $QUEUE) queue"
8
8
  task :work => :environment do
9
- QC::Worker.new(
10
- QC::QUEUE,
11
- QC::TOP_BOUND,
12
- QC::FORK_WORKER,
13
- QC::LISTENING_WORKER,
14
- QC::MAX_LOCK_ATTEMPTS
15
- ).start
9
+ QC::Worker.new.start
16
10
  end
17
11
 
18
12
  desc "Returns the number of jobs in the (default or QUEUE) queue"
19
- task :length => :environment do
20
- puts QC::Worker.new(
21
- QC::QUEUE,
22
- QC::TOP_BOUND,
23
- QC::FORK_WORKER,
24
- QC::LISTENING_WORKER,
25
- QC::MAX_LOCK_ATTEMPTS
26
- ).length
13
+ task :count => :environment do
14
+ QC::Worker.new.queue.count
27
15
  end
28
16
 
29
- desc "Ensure the database has the necessary functions for QC"
30
- task :load_functions => :environment do
31
- QC::Queries.load_functions
17
+ desc "Setup queue_classic tables and funtions in database"
18
+ task :create => :environment do
19
+ QC::Setup.create
32
20
  end
33
21
 
34
- desc "Remove queue_classic functions from database."
35
- task :drop_functions => :environment do
36
- QC::Queries.drop_functions
22
+ desc "Remove queue_classic tables and functions from database."
23
+ task :drop => :environment do
24
+ QC::Setup.drop
37
25
  end
38
26
  end
@@ -1,6 +1,8 @@
1
1
  module QC
2
2
  class Worker
3
3
 
4
+ attr_reader :queue
5
+
4
6
  def initialize(*args)
5
7
  if args.length == 5
6
8
  q_name, top_bound, fork_worker, listening_worker, max_attempts = *args
data/readme.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # queue_classic
2
2
 
3
- v2.0.0rc12
3
+ v2.0.0rc13
4
4
 
5
5
  queue_classic is a PostgreSQL-backed queueing library that is focused on
6
6
  concurrent job locking, minimizing database load & providing a simple &
@@ -10,7 +10,7 @@ queue_classic features:
10
10
 
11
11
  * Support for multiple queues with heterogeneous workers
12
12
  * Utilization of Postgres' PUB/SUB
13
- * JSON encoding for jobs
13
+ * JSON encoding
14
14
  * Forking workers
15
15
  * Postgres' rock-solid locking mechanism
16
16
  * Fuzzy-FIFO support [academic paper](http://www.cs.tau.ac.il/~shanir/nir-pubs-web/Papers/Lock_Free.pdf)
@@ -19,7 +19,7 @@ queue_classic features:
19
19
 
20
20
  ## Proven
21
21
 
22
- Queue_classic was designed out of necessity. I needed a message queue that was
22
+ queue_classic was designed out of necessity. I needed a message queue that was
23
23
  fast, reliable, and low maintenance. It was built upon PostgreSQL out of a motivation
24
24
  of not wanting to add a redis or 0MQ service to my network of services. It boasts
25
25
  a small API and very few features. It was designed to be simple. Thus, if you need
@@ -55,13 +55,12 @@ database migration.
55
55
  ### Quick Start
56
56
 
57
57
  ```bash
58
+ $ gem install queue_classic
58
59
  $ createdb queue_classic_test
59
- $ psql queue_classic_test -c "CREATE TABLE queue_classic_jobs (id serial, q_name varchar(255), method varchar(255), args text, locked_at timestamp);"
60
60
  $ export QC_DATABASE_URL="postgres://username:password@localhost/queue_classic_test"
61
- $ gem install queue_classic
62
- $ ruby -r queue_classic -e "QC::Queries.load_functions"
61
+ $ ruby -r queue_classic -e "QC::Setup.create"
63
62
  $ ruby -r queue_classic -e "QC.enqueue('Kernel.puts', 'hello world')"
64
- $ ruby -r queue_classic -e "QC::Worker.new.start"
63
+ $ ruby -r queue_classic -e "QC::Worker.new.work"
65
64
  ```
66
65
 
67
66
  ### Ruby on Rails Setup
@@ -90,24 +89,16 @@ ENV["DATABASE_URL"] = "postgres://username:password@localhost/database_name"
90
89
  **db/migrations/add_queue_classic.rb**
91
90
 
92
91
  ```ruby
93
- class CreateJobsTable < ActiveRecord::Migration
92
+ require 'queue_classic'
93
+
94
+ class AddQueueClassic < ActiveRecord::Migration
94
95
 
95
96
  def self.up
96
- create_table :queue_classic_jobs do |t|
97
- t.string :q_name
98
- t.string :method
99
- t.text :args
100
- t.timestamp :locked_at
101
- end
102
- add_index :queue_classic_jobs, :id
103
- require "queue_classic"
104
- QC::Queries.load_functions
97
+ QC::Setup.create
105
98
  end
106
99
 
107
100
  def self.down
108
- drop_table :queue_classic_jobs
109
- require "queue_classic"
110
- QC::Queries.drop_functions
101
+ QC::Setup.drop
111
102
  end
112
103
 
113
104
  end
@@ -118,23 +109,11 @@ end
118
109
  **db/migrations/1_add_queue_classic.rb**
119
110
 
120
111
  ```ruby
121
- Sequel.migration do
122
- up do
123
- create_table :queue_classic_jobs do
124
- primary_key :id
125
- String :q_name
126
- String :details
127
- Time :locked_at
128
- end
129
- require "queue_classic"
130
- QC::Queries.load_functions
131
- end
112
+ require 'queue_classic'
132
113
 
133
- down do
134
- drop_table :queue_classic_jobs
135
- require "queue_classic"
136
- QC::Queries.drop_functions
137
- end
114
+ Sequel.migration do
115
+ up {QC::Setup.create}
116
+ down {QC::Setup.down}
138
117
  end
139
118
  ```
140
119
 
@@ -178,7 +157,7 @@ QC.enqueue("Kernel.printf", "hello %s", "world")
178
157
  # This method has a hash argument.
179
158
  QC.enqueue("Kernel.puts", {"hello" => "world"})
180
159
 
181
- # This method has a array argument.
160
+ # This method has an array argument.
182
161
  QC.enqueue("Kernel.puts", ["hello", "world"])
183
162
  ```
184
163
 
@@ -219,7 +198,7 @@ p_queue.enqueue("Kernel.printf", "hello %s", "world")
219
198
  # This method has a hash argument.
220
199
  p_queue.enqueue("Kernel.puts", {"hello" => "world"})
221
200
 
222
- # This method has a array argument.
201
+ # This method has an array argument.
223
202
  p_queue.enqueue("Kernel.puts", ["hello", "world"])
224
203
  ```
225
204
 
@@ -265,8 +244,7 @@ trap('TERM') {exit}
265
244
 
266
245
  require "your_app"
267
246
  require "queue_classic"
268
- worker = QC::Worker.new(q_name, top_bound, fork_worker, listening_worker, max_attempts)
269
- worker.start
247
+ QC::Worker.new.start
270
248
  ```
271
249
 
272
250
  #### Sublcass QC::Worker
@@ -312,8 +290,7 @@ require "your_app"
312
290
  require "queue_classic"
313
291
  require "my_worker"
314
292
 
315
- worker = MyWorker.new(q_name, top_bound, fork_worker, listening_worker, max_attempts)
316
- worker.start
293
+ MyWorker.new.start
317
294
  ```
318
295
 
319
296
  #### QC::Worker Details
@@ -1,2 +1,3 @@
1
1
  DROP FUNCTION IF EXISTS lock_head(tname varchar);
2
2
  DROP FUNCTION IF EXISTS lock_head(tname name, top_boundary integer);
3
+ DROP FUNCTION IF EXISTS lock_head(q_name varchar, top_boundary integer)
@@ -19,9 +19,8 @@ class QCTest < MiniTest::Unit::TestCase
19
19
 
20
20
  def init_db(table_name="queue_classic_jobs")
21
21
  QC::Conn.execute("SET client_min_messages TO 'warning'")
22
- QC::Conn.execute("DROP TABLE IF EXISTS #{table_name} CASCADE")
23
- QC::Conn.execute("CREATE TABLE #{table_name} (id serial, q_name varchar(255), method varchar(255), args text, locked_at timestamptz)")
24
- QC::Queries.load_functions
22
+ QC::Setup.drop
23
+ QC::Setup.create
25
24
  QC::Conn.disconnect
26
25
  end
27
26
 
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.0.0rc12
4
+ version: 2.0.0rc13
5
5
  prerelease: 5
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-29 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pg
16
- requirement: &11432220 !ruby/object:Gem::Requirement
16
+ requirement: &18438700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.13.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *11432220
24
+ version_requirements: *18438700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: scrolls
27
- requirement: &11431140 !ruby/object:Gem::Requirement
27
+ requirement: &18438040 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 0.0.8
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *11431140
35
+ version_requirements: *18438040
36
36
  description: queue_classic is a queueing library for Ruby apps. (Rails, Sinatra, Etc...)
37
37
  queue_classic features asynchronous job polling, database maintained locks and no
38
38
  ridiculous dependencies. As a matter of fact, queue_classic only requires pg.
@@ -49,6 +49,7 @@ files:
49
49
  - lib/queue_classic/worker.rb
50
50
  - lib/queue_classic/queue.rb
51
51
  - lib/queue_classic/tasks.rb
52
+ - lib/queue_classic/setup.rb
52
53
  - lib/queue_classic/queries.rb
53
54
  - lib/queue_classic.rb
54
55
  - test/worker_test.rb