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 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
- *~