Class: Creeper::Worker

Inherits:
Object
  • Object
show all
Defined in:
lib/creeper/worker.rb

Defined Under Namespace

Classes: BadURL, JobTimeout, NoJobsDefined, NoSuchJob

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Worker

jobs = nil, parent_session = , session = nil)



36
37
38
# File 'lib/creeper/worker.rb', line 36

def initialize(options = {})#jobs = nil, parent_session = , session = nil)
  @options = options
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



33
34
35
# File 'lib/creeper/worker.rb', line 33

def options
  @options
end

#sessionObject (readonly)

config ###



42
43
44
# File 'lib/creeper/worker.rb', line 42

def session
  @session
end

#soft_quitObject Also known as: soft_quit?

Returns the value of attribute soft_quit.



34
35
36
# File 'lib/creeper/worker.rb', line 34

def soft_quit
  @soft_quit
end

#threadObject (readonly)

Returns the value of attribute thread.



33
34
35
# File 'lib/creeper/worker.rb', line 33

def thread
  @thread
end

#workingObject Also known as: working?

Returns the value of attribute working.



34
35
36
# File 'lib/creeper/worker.rb', line 34

def working
  @working
end

Instance Method Details

#beanstalkObject



58
59
60
# File 'lib/creeper/worker.rb', line 58

def beanstalk
  session.beanstalk
end

#clear!Object



62
63
64
65
66
# File 'lib/creeper/worker.rb', line 62

def clear!
  @soft_quit = false
  @working = false
  @session = nil
end

#error_loggerObject



19
20
21
# File 'lib/creeper/worker.rb', line 19

def error_logger
  Creeper.error_logger
end

#log(msg) ⇒ Object



23
24
25
# File 'lib/creeper/worker.rb', line 23

def log(msg)
  logger.info(msg)
end

#log_error(msg) ⇒ Object



27
28
29
# File 'lib/creeper/worker.rb', line 27

def log_error(msg)
  error_logger.error(msg)
end

#log_exception(*args) ⇒ Object



15
16
17
# File 'lib/creeper/worker.rb', line 15

def log_exception(*args)
  Creeper.log_exception(*args)
end

#loggerObject



11
12
13
# File 'lib/creeper/worker.rb', line 11

def logger
  Creeper.logger
end

#prepareObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/creeper/worker.rb', line 68

def prepare
  raise NoJobsDefined if session.handlers.empty?

  jobs = options[:jobs] || session.all_jobs

  jobs.each do |job|
    raise(NoSuchJob, job) unless session.handlers.has_key?(job)
  end

  logger.info "Working #{jobs.size} jobs: [ #{jobs.join(' ')} ]"

  jobs.each { |job| beanstalk.watch(job) }

  beanstalk.list_tubes_watched.each do |server, tubes|
    tubes.each { |tube| beanstalk.ignore(tube) unless jobs.include?(tube) }
  end
rescue Beanstalk::NotConnected => e
  failed_connection(e)
end

#startObject



129
130
131
132
133
# File 'lib/creeper/worker.rb', line 129

def start
  @thread = Thread.new do
    work
  end
end

#stopObject



135
136
137
138
139
# File 'lib/creeper/worker.rb', line 135

def stop
  logger.info "worker dying: #{Thread.current.inspect}"
  session.disconnect
  @thread.kill
end

#workObject



88
89
90
91
# File 'lib/creeper/worker.rb', line 88

def work
  prepare
  loop { work_one_job }
end

#work_one_jobObject



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/creeper/worker.rb', line 93

def work_one_job
  stop if soft_quit?

  job = beanstalk.reserve
  name, args = JSON.parse job.body
  log_job_begin(name, args)
  handler = session.handlers[name]
  raise(NoSuchJob, name) unless handler

  begin
    session.before_handlers.each do |block|
      block.call(name)
    end
    handler.call(args)
  end

  job.delete
  log_job_end(name)
rescue Beanstalk::NotConnected => e
  failed_connection(e)
rescue SystemExit
  puts "FART"
  raise
rescue => e
  log_error exception_message(e)
  job.bury rescue nil
  log_job_end(name, 'failed') if @job_begun
  if session.error_handler
    if session.error_handler.arity == 1
      session.error_handler.call(e)
    else
      session.error_handler.call(e, name, args)
    end
  end
end