em-jack 0.0.4 → 0.0.5
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.
- data/lib/em-jack.rb +5 -1
- data/lib/em-jack/connection.rb +53 -84
- data/lib/em-jack/handlers/buried.rb +20 -0
- data/lib/em-jack/handlers/deleted.rb +20 -0
- data/lib/em-jack/handlers/errors.rb +19 -0
- data/lib/em-jack/handlers/inserted.rb +20 -0
- data/lib/em-jack/handlers/not_ignored.rb +20 -0
- data/lib/em-jack/handlers/ok.rb +25 -0
- data/lib/em-jack/handlers/released.rb +20 -0
- data/lib/em-jack/handlers/reserved.rb +28 -0
- data/lib/em-jack/handlers/using.rb +20 -0
- data/lib/em-jack/handlers/watching.rb +20 -0
- metadata +28 -9
data/lib/em-jack.rb
CHANGED
@@ -5,8 +5,12 @@ require 'em-jack/errors'
|
|
5
5
|
require 'em-jack/beanstalk_connection'
|
6
6
|
require 'em-jack/connection'
|
7
7
|
|
8
|
+
Dir["#{File.dirname(__FILE__)}/em-jack/handlers/*.rb"].each do |file|
|
9
|
+
require file
|
10
|
+
end
|
11
|
+
|
8
12
|
module EMJack
|
9
13
|
module VERSION
|
10
|
-
STRING = '0.0.
|
14
|
+
STRING = '0.0.5'
|
11
15
|
end
|
12
16
|
end
|
data/lib/em-jack/connection.rb
CHANGED
@@ -4,8 +4,19 @@ require 'yaml'
|
|
4
4
|
module EMJack
|
5
5
|
class Connection
|
6
6
|
RETRY_COUNT = 5
|
7
|
-
|
7
|
+
|
8
|
+
@@handlers = []
|
9
|
+
|
8
10
|
attr_accessor :host, :port
|
11
|
+
|
12
|
+
def self.register_handler(handler)
|
13
|
+
@@handlers ||= []
|
14
|
+
@@handlers << handler
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.handlers
|
18
|
+
@@handlers
|
19
|
+
end
|
9
20
|
|
10
21
|
def initialize(opts = {})
|
11
22
|
@host = opts[:host] || 'localhost'
|
@@ -62,18 +73,6 @@ module EMJack
|
|
62
73
|
add_deferrable(&blk)
|
63
74
|
end
|
64
75
|
|
65
|
-
def each_job(&blk)
|
66
|
-
work = Proc.new do
|
67
|
-
r = reserve
|
68
|
-
r.callback do |job|
|
69
|
-
blk.call(job)
|
70
|
-
|
71
|
-
EM.next_tick { work.call }
|
72
|
-
end
|
73
|
-
end
|
74
|
-
work.call
|
75
|
-
end
|
76
|
-
|
77
76
|
def stats(type = nil, val = nil, &blk)
|
78
77
|
case(type)
|
79
78
|
when nil then @conn.send(:stats)
|
@@ -99,10 +98,14 @@ module EMJack
|
|
99
98
|
@conn.send(:delete, job.jobid)
|
100
99
|
add_deferrable(&blk)
|
101
100
|
end
|
102
|
-
|
103
|
-
def release(job, &blk)
|
101
|
+
|
102
|
+
def release(job, opts = {}, &blk)
|
104
103
|
return if job.nil?
|
105
|
-
|
104
|
+
|
105
|
+
pri = (opts[:priority] || 65536).to_i
|
106
|
+
delay = (opts[:delay] || 0).to_i
|
107
|
+
|
108
|
+
@conn.send(:release, job.jobid, pri, delay)
|
106
109
|
add_deferrable(&blk)
|
107
110
|
end
|
108
111
|
|
@@ -123,14 +126,25 @@ module EMJack
|
|
123
126
|
@conn.send_with_data(:put, m, pri, delay, ttr, m.length)
|
124
127
|
add_deferrable(&blk)
|
125
128
|
end
|
126
|
-
|
129
|
+
|
130
|
+
def each_job(timeout = nil, &blk)
|
131
|
+
work = Proc.new do
|
132
|
+
r = reserve(timeout)
|
133
|
+
r.callback do |job|
|
134
|
+
blk.call(job)
|
135
|
+
|
136
|
+
EM.next_tick { work.call }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
work.call
|
140
|
+
end
|
141
|
+
|
127
142
|
def connected
|
128
143
|
@retries = 0
|
129
144
|
end
|
130
145
|
|
131
146
|
def disconnected
|
132
|
-
|
133
|
-
# since the connection was dropped
|
147
|
+
@deferrables.each { |df| df.fail(:disconnected) }
|
134
148
|
|
135
149
|
raise EMJack::Disconnected if @retries >= RETRY_COUNT
|
136
150
|
@retries += 1
|
@@ -156,7 +170,7 @@ module EMJack
|
|
156
170
|
def on_error(&blk)
|
157
171
|
@error_callback = blk
|
158
172
|
end
|
159
|
-
|
173
|
+
|
160
174
|
def received(data)
|
161
175
|
@data << data
|
162
176
|
|
@@ -166,75 +180,30 @@ module EMJack
|
|
166
180
|
|
167
181
|
first = @data[0..(idx + 1)]
|
168
182
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
next unless first =~ /^#{cmd}\r\n/i
|
174
|
-
df = @deferrables.shift
|
175
|
-
df.fail(cmd.downcase.to_sym)
|
176
|
-
|
177
|
-
@data = @data[(cmd.length + 2)..-1]
|
178
|
-
handled = true
|
179
|
-
break
|
180
|
-
end
|
181
|
-
next if handled
|
182
|
-
|
183
|
-
case (first)
|
184
|
-
when /^DELETED\r\n/ then
|
185
|
-
df = @deferrables.shift
|
186
|
-
df.succeed
|
183
|
+
df = @deferrables.shift
|
184
|
+
handled, skip = false, false
|
185
|
+
EMJack::Connection.handlers.each do |h|
|
186
|
+
handles, bytes = h.handles?(first)
|
187
187
|
|
188
|
-
|
189
|
-
|
190
|
-
df.succeed($1.to_i)
|
188
|
+
next unless handles
|
189
|
+
bytes = bytes.to_i
|
191
190
|
|
192
|
-
|
193
|
-
|
194
|
-
|
191
|
+
# if this handler requires us to receive a body make sure we can get
|
192
|
+
# the full length of body. If not, we'll go around and wait for more
|
193
|
+
# data to be received
|
194
|
+
body, @data = extract_body(bytes, @data) unless bytes <= 0
|
195
|
+
break if body.nil? && bytes > 0
|
195
196
|
|
196
|
-
|
197
|
-
|
198
|
-
df.fail(:buried, $1.to_i)
|
199
|
-
|
200
|
-
when /^USING\s+(.*)\r\n/ then
|
201
|
-
df = @deferrables.shift
|
202
|
-
df.succeed($1)
|
203
|
-
|
204
|
-
when /^WATCHING\s+(\d+)\r\n/ then
|
205
|
-
df = @deferrables.shift
|
206
|
-
df.succeed($1.to_i)
|
207
|
-
|
208
|
-
when /^NOT_IGNORED\r\n/ then
|
209
|
-
df = @deferrables.shift
|
210
|
-
df.fail("Can't ignore only watched tube")
|
211
|
-
|
212
|
-
when /^OK\s+(\d+)\r\n/ then
|
213
|
-
bytes = $1.to_i
|
214
|
-
|
215
|
-
body, @data = extract_body(bytes, @data)
|
216
|
-
break if body.nil?
|
217
|
-
|
218
|
-
df = @deferrables.shift
|
219
|
-
df.succeed(YAML.load(body))
|
220
|
-
next
|
221
|
-
|
222
|
-
when /^RESERVED\s+(\d+)\s+(\d+)\r\n/ then
|
223
|
-
id = $1.to_i
|
224
|
-
bytes = $2.to_i
|
225
|
-
|
226
|
-
body, @data = extract_body(bytes, @data)
|
227
|
-
break if body.nil?
|
228
|
-
|
229
|
-
df = @deferrables.shift
|
230
|
-
job = EMJack::Job.new(self, id, body)
|
231
|
-
df.succeed(job)
|
232
|
-
next
|
233
|
-
|
234
|
-
else
|
235
|
-
break
|
197
|
+
handled = h.handle(df, first, body)
|
198
|
+
break if handled
|
236
199
|
end
|
237
200
|
|
201
|
+
@deferrables.unshift(df) unless handled
|
202
|
+
|
203
|
+
# not handled means there wasn't enough data to process a complete response
|
204
|
+
break unless handled
|
205
|
+
next unless @data.index(/\r\n/)
|
206
|
+
|
238
207
|
@data = @data[(@data.index(/\r\n/) + 2)..-1]
|
239
208
|
@data = "" if @data.nil?
|
240
209
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Buried
|
4
|
+
RESPONSE = /^BURIED\s+(\d+)\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.fail(:buried, $1.to_i)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::Buried)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Deleted
|
4
|
+
RESPONSE = /^DELETED\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.succeed
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::Deleted)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Errors
|
4
|
+
RESPONSE = /^(OUT_OF_MEMORY|INTERNAL_ERROR|DRAINING|BAD_FORMAT|UNKNOWN_COMMAND|EXPECTED_CRLF|JOB_TOO_BIG|DEADLINE_SOON|TIMED_OUT|NOT_FOUND)\r\n/i
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
deferrable.fail($1.downcase.to_sym)
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
EMJack::Connection.register_handler(EMJack::Handler::Errors)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Inserted
|
4
|
+
RESPONSE = /^INSERTED\s+(\d+)\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.succeed($1.to_i)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::Inserted)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class NotIgnored
|
4
|
+
RESPONSE = /^NOT_IGNORED\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.fail("Can't ignore only watched tube")
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::NotIgnored)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Ok
|
4
|
+
RESPONSE = /^OK\s+(\d+)\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
if response =~ RESPONSE
|
8
|
+
[true, $1.to_i]
|
9
|
+
else
|
10
|
+
false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.handle(deferrable, response, body)
|
15
|
+
return false unless response =~ RESPONSE
|
16
|
+
bytes = $1.to_i
|
17
|
+
|
18
|
+
deferrable.succeed(YAML.load(body))
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
EMJack::Connection.register_handler(EMJack::Handler::Ok)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Released
|
4
|
+
RESPONSE = /^RELEASED\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.succeed
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::Released)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Reserved
|
4
|
+
RESPONSE = /^RESERVED\s+(\d+)\s+(\d+)\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
if response =~ RESPONSE
|
8
|
+
[true, $2.to_i]
|
9
|
+
else
|
10
|
+
false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.handle(deferrable, response, body)
|
15
|
+
return false unless response =~ RESPONSE
|
16
|
+
id = $1.to_i
|
17
|
+
bytes = $2.to_i
|
18
|
+
|
19
|
+
job = EMJack::Job.new(self, id, body)
|
20
|
+
deferrable.succeed(job)
|
21
|
+
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
EMJack::Connection.register_handler(EMJack::Handler::Reserved)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Using
|
4
|
+
RESPONSE = /^USING\s+(.*)\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.succeed($1)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::Using)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EMJack
|
2
|
+
module Handler
|
3
|
+
class Watching
|
4
|
+
RESPONSE = /^WATCHING\s+(\d+)\r\n/
|
5
|
+
|
6
|
+
def self.handles?(response)
|
7
|
+
response =~ RESPONSE
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(deferrable, response, body)
|
11
|
+
return false unless response =~ RESPONSE
|
12
|
+
|
13
|
+
deferrable.succeed($1.to_i)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
EMJack::Connection.register_handler(EMJack::Handler::Watching)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-jack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- dan sinclair
|
@@ -9,19 +14,21 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-03-02 00:00:00 -05:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: eventmachine
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
25
32
|
description: An evented Beanstalk client.
|
26
33
|
email: dj2@everburning.com
|
27
34
|
executables: []
|
@@ -38,6 +45,16 @@ files:
|
|
38
45
|
- lib/em-jack/connection.rb
|
39
46
|
- lib/em-jack/errors.rb
|
40
47
|
- lib/em-jack/job.rb
|
48
|
+
- lib/em-jack/handlers/buried.rb
|
49
|
+
- lib/em-jack/handlers/inserted.rb
|
50
|
+
- lib/em-jack/handlers/not_ignored.rb
|
51
|
+
- lib/em-jack/handlers/ok.rb
|
52
|
+
- lib/em-jack/handlers/released.rb
|
53
|
+
- lib/em-jack/handlers/reserved.rb
|
54
|
+
- lib/em-jack/handlers/using.rb
|
55
|
+
- lib/em-jack/handlers/watching.rb
|
56
|
+
- lib/em-jack/handlers/deleted.rb
|
57
|
+
- lib/em-jack/handlers/errors.rb
|
41
58
|
has_rdoc: true
|
42
59
|
homepage: http://github.com/dj2/em-jack/
|
43
60
|
licenses: []
|
@@ -55,18 +72,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
55
72
|
requirements:
|
56
73
|
- - ">="
|
57
74
|
- !ruby/object:Gem::Version
|
75
|
+
segments:
|
76
|
+
- 0
|
58
77
|
version: "0"
|
59
|
-
version:
|
60
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
79
|
requirements:
|
62
80
|
- - ">="
|
63
81
|
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
64
84
|
version: "0"
|
65
|
-
version:
|
66
85
|
requirements: []
|
67
86
|
|
68
87
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.3.
|
88
|
+
rubygems_version: 1.3.6
|
70
89
|
signing_key:
|
71
90
|
specification_version: 3
|
72
91
|
summary: An evented Beanstalk client.
|