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 CHANGED
@@ -1 +1 @@
1
- 0.4.15
1
+ 0.4.17
@@ -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 the gemspec command
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.15"
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{2010-12-27}
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
- ".gitignore",
20
- "COPYING",
21
- "README",
22
- "Rakefile",
23
- "VERSION",
24
- "beanstalker.gemspec",
25
- "init.rb",
26
- "lib/beanstalker/daemonizer_handler.rb",
27
- "lib/beanstalker/extend.rb",
28
- "lib/beanstalker/queue.rb",
29
- "lib/beanstalker/worker.rb"
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.3.7}
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
@@ -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
- return run_ao_job(job) if beanstalker_job?(job)
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
- runner = lambda {
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 beanstalker_job?(job)
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: 17
5
- prerelease: false
4
+ hash: 45
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 15
10
- version: 0.4.15
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: 2010-12-27 00:00:00 +03:00
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
- - --charset=UTF-8
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.3.7
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
- *~