Class: Backnob::Worker

Inherits:
Object
  • Object
show all
Includes:
DRb::DRbObservable
Defined in:
lib/backnob/worker.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key, options = {}) ⇒ Worker

Returns a new instance of Worker.



36
37
38
39
40
41
# File 'lib/backnob/worker.rb', line 36

def initialize(key, options = {})
  @key = key
  @options = options
  @results = {}
  @results.extend(MonitorMixin)
end

Class Method Details

.define_attr_method(name, value) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/backnob/worker.rb', line 19

def self.define_attr_method(name, value)
  class_eval do
    define_method(name) do
      value
    end
  end
end

.define_class_attr(name, default) ⇒ Object



27
28
29
30
31
32
# File 'lib/backnob/worker.rb', line 27

def self.define_class_attr(name, default)
  define_attr_method name, default
  self.singleton_class.send :define_method, name do |value|
    define_attr_method name, value
  end
end

Instance Method Details

#loggerObject



43
44
45
# File 'lib/backnob/worker.rb', line 43

def logger
  @logger ||= Logger.new($stdout)
end

#results(key = nil, value = nil) ⇒ Object

Get or set results. Workers should access results through this method as it is synchronized



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/backnob/worker.rb', line 78

def results(key = nil,value = nil)
  res = nil

  @results.synchronize do
    if key.nil?
      res = @results.dup
    elsif value.nil?      
      res = @results[key]
    else
      if value != @results[key]
        @results[key] = value
        changed(true) # I've changed

        # Marshal results into string
        # for some reason marshal doesn't like hash, so
        # convert to array and convert back on server side
        obo = ::Marshal.dump([@key, key, value])     
        notify_observers(obo)
      end
    end
  end

  res
end

#startObject

Start this worker. Starts a new thread and calls execute for work to be performed.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/backnob/worker.rb', line 49

def start
  @thread = Thread.new do
    Thread.pass
    
    logger.debug "Starting #{self.class.name} with key #{@key}"
              
    results(:running, true)
            
    if rails
      require 'config/environment'
      ActiveRecord::Base.logger = logger
    end

    # require File.dirname(__FILE__) + "/../../config/environment"
    # ActiveRecord::Base.logger = logger
    
    begin
      execute
    rescue Exception => e
      results(:error, e)
    ensure
      results(:running, false)
      logger.debug "Finished #{self.class.name} with key #{@key}"
    end
  end
end