beanstalker 0.4.15 → 0.4.17
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/beanstalker.gemspec +15 -17
- data/lib/beanstalker/mapper.rb +23 -0
- data/lib/beanstalker/worker.rb +44 -13
- metadata +9 -9
- data/.gitignore +0 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.17
|
data/beanstalker.gemspec
CHANGED
@@ -1,41 +1,39 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{beanstalker}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.17"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gleb Pomykalov"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-02-09}
|
13
13
|
s.description = %q{Beanstalker is a tool for executing long tasks in background in our rails application.}
|
14
14
|
s.email = %q{glebpom@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
|
-
"
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
19
|
+
"COPYING",
|
20
|
+
"README",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"beanstalker.gemspec",
|
24
|
+
"init.rb",
|
25
|
+
"lib/beanstalker/daemonizer_handler.rb",
|
26
|
+
"lib/beanstalker/extend.rb",
|
27
|
+
"lib/beanstalker/mapper.rb",
|
28
|
+
"lib/beanstalker/queue.rb",
|
29
|
+
"lib/beanstalker/worker.rb"
|
30
30
|
]
|
31
31
|
s.homepage = %q{http://github.com/glebpom/beanstalker}
|
32
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
33
32
|
s.require_paths = ["lib"]
|
34
|
-
s.rubygems_version = %q{1.
|
33
|
+
s.rubygems_version = %q{1.5.0}
|
35
34
|
s.summary = %q{Beanstalker provides deep integration with Beanstalk. Fork from http://github.com/kristjan/async_observer}
|
36
35
|
|
37
36
|
if s.respond_to? :specification_version then
|
38
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
39
37
|
s.specification_version = 3
|
40
38
|
|
41
39
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Beanstalker
|
2
|
+
class Mapper
|
3
|
+
def initialize(*args)
|
4
|
+
@mapping = {}
|
5
|
+
args.each do |filename|
|
6
|
+
include_from_file(filename)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def include_from_file(filename)
|
11
|
+
puts "Loading #{filename}"
|
12
|
+
instance_eval(File.read(filename), filename)
|
13
|
+
end
|
14
|
+
|
15
|
+
def on(name, &block)
|
16
|
+
@mapping[name.to_sym] = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_for(name)
|
20
|
+
@mapping[name.to_sym]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/beanstalker/worker.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
require 'beanstalker/queue'
|
19
|
+
require 'beanstalker/mapper'
|
19
20
|
|
20
21
|
module Beanstalker; end
|
21
22
|
|
@@ -51,6 +52,8 @@ class Beanstalker::Worker
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def initialize(top_binding, options = {})
|
55
|
+
mapper_file = "#{RAILS_ROOT}/config/beanstalker_mapper.rb"
|
56
|
+
@mapper = Beanstalker::Mapper.new(mapper_file) if File.exist?(mapper_file)
|
54
57
|
@top_binding = top_binding
|
55
58
|
@stop = false
|
56
59
|
@options = options
|
@@ -144,7 +147,11 @@ class Beanstalker::Worker
|
|
144
147
|
|
145
148
|
def dispatch(job)
|
146
149
|
ActiveRecord::Base.verify_active_connections!
|
147
|
-
|
150
|
+
if rails_job?(job)
|
151
|
+
run_ao_job(job)
|
152
|
+
elsif mapped_job?(job)
|
153
|
+
run_mapped_job(job)
|
154
|
+
end
|
148
155
|
end
|
149
156
|
|
150
157
|
def safe_dispatch(job)
|
@@ -231,8 +238,34 @@ class Beanstalker::Worker
|
|
231
238
|
Daemonizer.logger.info "Unexpected Beanstalkd error: #{job.server}/#{job.id}. #{e.inspect}"
|
232
239
|
end
|
233
240
|
|
241
|
+
def run_with_ruby_timeout_if_set(job_desc, job, &block)
|
242
|
+
if @options[:ruby_timeout]
|
243
|
+
timeout = (job.stats['ttr'].to_f * 0.8)
|
244
|
+
logger.info "TO=#{timeout} sec. Job id=#{job.stats['id']}. Running '#{job_desc}'. Age #{job.stats['age']}, Releases #{job.stats['releases']}, TTR #{job.stats['ttr']}"
|
245
|
+
Timeout.timeout(timeout) do
|
246
|
+
block.call
|
247
|
+
end
|
248
|
+
else
|
249
|
+
logger.info "Job id=#{job.stats['id']}. Running '#{job_desc}'. Age #{job.stats['age']}, Releases #{job.stats['releases']}, TTR #{job.stats['ttr']}"
|
250
|
+
block.call
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def run_mapped_job(job)
|
255
|
+
run_with_ruby_timeout_if_set(job[:name], job) do
|
256
|
+
t1 = Time.now
|
257
|
+
if @map_job = map_job(job[:name])
|
258
|
+
@map_job.call(job[:params] || {})
|
259
|
+
logger.info "Finished. Job id=#{job.stats['id']}. Mapped from '#{job[:name]}'. Time taken: #{(Time.now - t1).to_f} sec"
|
260
|
+
else
|
261
|
+
logger.error "Job id=#{job.stats['id']}. Mapping not found: '#{job[:name]}'. Releases #{job.stats['releases']}. Deleting"
|
262
|
+
end
|
263
|
+
job.delete
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
234
267
|
def run_ao_job(job)
|
235
|
-
|
268
|
+
run_with_ruby_timeout_if_set(job[:code], job) do
|
236
269
|
t1 = Time.now
|
237
270
|
f = self.class.before_filter
|
238
271
|
statistics = job.stats.dup
|
@@ -245,16 +278,6 @@ class Beanstalker::Worker
|
|
245
278
|
else
|
246
279
|
logger.info "Not runnind due to :before_filter restriction. Job id=#{statistics['id']}. Code '#{code}'."
|
247
280
|
end
|
248
|
-
}
|
249
|
-
if @options[:ruby_timeout]
|
250
|
-
timeout = (job.stats['ttr'].to_f * 0.8)
|
251
|
-
logger.info "TO=#{timeout} sec. Job id=#{job.stats['id']}. Running '#{job[:code]}'. Age #{job.stats['age']}, Releases #{job.stats['releases']}, TTR #{job.stats['ttr']}"
|
252
|
-
Timeout.timeout(timeout) do
|
253
|
-
runner.call
|
254
|
-
end
|
255
|
-
else
|
256
|
-
logger.info "Job id=#{job.stats['id']}. Running '#{job[:code]}'. Age #{job.stats['age']}, Releases #{job.stats['releases']}, TTR #{job.stats['ttr']}"
|
257
|
-
runner.call
|
258
281
|
end
|
259
282
|
end
|
260
283
|
|
@@ -262,10 +285,18 @@ class Beanstalker::Worker
|
|
262
285
|
eval(job.ybody[:code], @top_binding, "(beanstalk job #{job.id})", 1)
|
263
286
|
end
|
264
287
|
|
265
|
-
def
|
288
|
+
def rails_job?(job)
|
266
289
|
begin job.ybody[:type] == :rails rescue false end
|
267
290
|
end
|
268
291
|
|
292
|
+
def mapped_job?(job)
|
293
|
+
begin job.ybody[:type] == :mapped rescue false end
|
294
|
+
end
|
295
|
+
|
296
|
+
def map_job(job)
|
297
|
+
@mapper && @mapper.method_for(job)
|
298
|
+
end
|
299
|
+
|
269
300
|
def do_all_work
|
270
301
|
logger.info 'finishing all running jobs'
|
271
302
|
f = self.class.finish
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beanstalker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 45
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 17
|
10
|
+
version: 0.4.17
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gleb Pomykalov
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-09 00:00:00 +03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -73,7 +73,6 @@ extensions: []
|
|
73
73
|
extra_rdoc_files:
|
74
74
|
- README
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
76
|
- COPYING
|
78
77
|
- README
|
79
78
|
- Rakefile
|
@@ -82,6 +81,7 @@ files:
|
|
82
81
|
- init.rb
|
83
82
|
- lib/beanstalker/daemonizer_handler.rb
|
84
83
|
- lib/beanstalker/extend.rb
|
84
|
+
- lib/beanstalker/mapper.rb
|
85
85
|
- lib/beanstalker/queue.rb
|
86
86
|
- lib/beanstalker/worker.rb
|
87
87
|
has_rdoc: true
|
@@ -89,8 +89,8 @@ homepage: http://github.com/glebpom/beanstalker
|
|
89
89
|
licenses: []
|
90
90
|
|
91
91
|
post_install_message:
|
92
|
-
rdoc_options:
|
93
|
-
|
92
|
+
rdoc_options: []
|
93
|
+
|
94
94
|
require_paths:
|
95
95
|
- lib
|
96
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements: []
|
115
115
|
|
116
116
|
rubyforge_project:
|
117
|
-
rubygems_version: 1.
|
117
|
+
rubygems_version: 1.5.0
|
118
118
|
signing_key:
|
119
119
|
specification_version: 3
|
120
120
|
summary: Beanstalker provides deep integration with Beanstalk. Fork from http://github.com/kristjan/async_observer
|
data/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
*~
|