Class: Resque::Job

Inherits:
Object
  • Object
show all
Extended by:
Helpers
Includes:
Helpers
Defined in:
lib/resque/job.rb

Overview

A Resque::Job represents a unit of work. Each job lives on a single queue and has an associated payload object. The payload is a hash with two attributes: ‘class` and `args`. The `class` is the name of the Ruby class which should be used to run the job. The `args` are an array of arguments which should be passed to the Ruby class’s ‘perform` class-level method.

You can manually run a job using this code:

job = Resque::Job.reserve(:high)
klass = Resque::Job.constantize(job.payload['class'])
klass.perform(*job.payload['args'])

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers

classify, constantize, decode, encode, redis

Constructor Details

#initialize(queue, payload) ⇒ Job

Returns a new instance of Job.



28
29
30
31
# File 'lib/resque/job.rb', line 28

def initialize(queue, payload)
  @queue = queue
  @payload = payload
end

Instance Attribute Details

#payloadObject (readonly)

This job’s associated payload object.



26
27
28
# File 'lib/resque/job.rb', line 26

def payload
  @payload
end

#queueObject (readonly)

The name of the queue from which this job was pulled (or is to be placed)



23
24
25
# File 'lib/resque/job.rb', line 23

def queue
  @queue
end

#workerObject

The worker object which is currently processing this job.



19
20
21
# File 'lib/resque/job.rb', line 19

def worker
  @worker
end

Class Method Details

.create(queue, klass, *args) ⇒ Object

Creates a job by placing it on a queue. Expects a string queue name, a string class name, and an optional array of arguments to pass to the class’ ‘perform` method.

Raises an exception if no queue or class is given.



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/resque/job.rb', line 38

def self.create(queue, klass, *args)
  if !queue
    raise NoQueueError.new("Jobs must be placed onto a queue.")
  end

  if klass.to_s.empty?
    raise NoClassError.new("Jobs must be given a class.")
  end

  Resque.push(queue, :class => klass.to_s, :args => args)
end

.create_unique(queue, klass, *args) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/resque/job.rb', line 50

def self.create_unique(queue, klass, *args)
  if !queue
    raise NoQueueError.new("Jobs must be placed onto a queue.")
  end

  if klass.to_s.empty?
    raise NoClassError.new("Jobs must be given a class.")
  end

  Resque.push(queue, :class => klass.to_s, :args => args, :unique => true)
end

.destroy(queue, klass, *args) ⇒ Object

Removes a job from a queue. Expects a string queue name, a string class name, and, optionally, args.

Returns the number of jobs destroyed.

If no args are provided, it will remove all jobs of the class provided.

That is, for these two jobs:

{ ‘class’ => ‘UpdateGraph’, ‘args’ => [‘defunkt’] } { ‘class’ => ‘UpdateGraph’, ‘args’ => [‘mojombo’] }

The following call will remove both:

Resque::Job.destroy(queue, 'UpdateGraph')

Whereas specifying args will only remove the 2nd job:

Resque::Job.destroy(queue, 'UpdateGraph', 'mojombo')

This method can be potentially very slow and memory intensive, depending on the size of your queue, as it loads all jobs into a Ruby array before processing.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/resque/job.rb', line 86

def self.destroy(queue, klass, *args)
  klass = klass.to_s
  queue = "queue:#{queue}"
  destroyed = 0

  redis.lrange(queue, 0, -1).each do |string|
    json   = decode(string)

    match  = json['class'] == klass
    match &= json['args'] == args unless args.empty?

    if match
      destroyed += redis.lrem(queue, 0, string).to_i
    end
  end

  destroyed
end

.reserve(queue) ⇒ Object

Given a string queue name, returns an instance of Resque::Job if any jobs are available. If not, returns nil.



107
108
109
110
# File 'lib/resque/job.rb', line 107

def self.reserve(queue)
  return unless payload = Resque.pop(queue)
  new(queue, payload)
end

Instance Method Details

#==(other) ⇒ Object

Equality



152
153
154
155
156
# File 'lib/resque/job.rb', line 152

def ==(other)
  queue == other.queue &&
    payload_class == other.payload_class &&
    args == other.args
end

#argsObject

Returns an array of args represented in this job’s payload.



125
126
127
# File 'lib/resque/job.rb', line 125

def args
  @payload['args']
end

#fail(exception) ⇒ Object

Given an exception object, hands off the needed parameters to the Failure module.



131
132
133
134
135
136
137
# File 'lib/resque/job.rb', line 131

def fail(exception)
  Failure.create \
    :payload   => payload,
    :exception => exception,
    :worker    => worker,
    :queue     => queue
end

#inspectObject

String representation



146
147
148
149
# File 'lib/resque/job.rb', line 146

def inspect
  obj = @payload
  "(Job{%s} | %s | %s)" % [ @queue, obj['class'], obj['args'].inspect ]
end

#payload_classObject

Returns the actual class constant represented in this job’s payload.



120
121
122
# File 'lib/resque/job.rb', line 120

def payload_class
  @payload_class ||= constantize(@payload['class'])
end

#performObject

Attempts to perform the work represented by this job instance. Calls #perform on the class given in the payload with the arguments given in the payload.



115
116
117
# File 'lib/resque/job.rb', line 115

def perform
  args ? payload_class.perform(*args) : payload_class.perform
end

#recreateObject

Creates an identical job, essentially placing this job back on the queue.



141
142
143
# File 'lib/resque/job.rb', line 141

def recreate
  self.class.create(queue, payload_class, *args)
end