em-jack 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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.4'
14
+ STRING = '0.0.5'
11
15
  end
12
16
  end
@@ -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
- @conn.send(:release, job.jobid, 0, 0)
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
- # XXX I think I need to run out the deferrables as failed here
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
- handled = false
170
- %w(OUT_OF_MEMORY INTERNAL_ERROR DRAINING BAD_FORMAT
171
- UNKNOWN_COMMAND EXPECTED_CRLF JOB_TOO_BIG DEADLINE_SOON
172
- TIMED_OUT NOT_FOUND).each do |cmd|
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
- when /^INSERTED\s+(\d+)\r\n/ then
189
- df = @deferrables.shift
190
- df.succeed($1.to_i)
188
+ next unless handles
189
+ bytes = bytes.to_i
191
190
 
192
- when /^RELEASED\r\n/ then
193
- df = @deferrables.shift
194
- df.succeed
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
- when /^BURIED\s+(\d+)\r\n/ then
197
- df = @deferrables.shift
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
- version: 0.0.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: 2009-11-17 00:00:00 -05:00
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
- type: :runtime
18
- version_requirement:
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
- version:
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.5
88
+ rubygems_version: 1.3.6
70
89
  signing_key:
71
90
  specification_version: 3
72
91
  summary: An evented Beanstalk client.