beanstalker 0.4.15 → 0.4.17
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/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
|
-
*~
|