resque-pertry 1.0.0 → 1.0.1

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.
@@ -62,6 +62,10 @@ module Resque
62
62
  Time.parse(@_job_properties['queue_time'])
63
63
  end
64
64
 
65
+ def model
66
+ @model ||= ResquePertryPersistence.find_by_audit_id(audit_id)
67
+ end
68
+
65
69
  end
66
70
  end
67
71
  end
@@ -38,6 +38,7 @@ module Resque
38
38
  def finnish_job(klass, args)
39
39
  with_job(klass, args) do |job|
40
40
  return unless job
41
+ return if job.finnished?
41
42
  job.update_attribute(:completed_at, Time.now)
42
43
  end
43
44
  end
@@ -45,6 +46,7 @@ module Resque
45
46
  def trying_job(klass, args)
46
47
  with_job(klass, args) do |job|
47
48
  return unless job
49
+ return if job.finnished?
48
50
  job.update_attributes( :last_tried_at => Time.now,
49
51
  :attempt => job.attempt + 1)
50
52
  end
@@ -53,6 +55,7 @@ module Resque
53
55
  def fail_job(klass, args)
54
56
  with_job(klass, args) do |job|
55
57
  return unless job
58
+ return if job.finnished?
56
59
  job.update_attribute(:failed_at, Time.now)
57
60
  end
58
61
  end
@@ -74,9 +77,21 @@ module Resque
74
77
 
75
78
  end
76
79
 
77
- def has_completed?
80
+ def completed?
78
81
  completed_at
79
82
  end
83
+
84
+ def expired?
85
+ expires_at < Time.now
86
+ end
87
+
88
+ def failed?
89
+ failed_at
90
+ end
91
+
92
+ def finnished?
93
+ completed? || failed? || expired?
94
+ end
80
95
 
81
96
  def payload
82
97
  @payload ||= Resque.decode(arguments)
@@ -102,7 +102,7 @@ module Resque
102
102
  def retry?(model, exception)
103
103
  # check the obvious
104
104
  return false unless model
105
- return false if model.has_completed?
105
+ return false if model.finnished?
106
106
 
107
107
  # job has used up all it's allowed attempts
108
108
  return false if max_attempt_reached?(model)
@@ -110,9 +110,6 @@ module Resque
110
110
  # job exception is not whitelisted for retries
111
111
  return false unless exception_whitelisted?(model, exception)
112
112
 
113
- # job has expired
114
- return false if ttl_expired?(model)
115
-
116
113
  # seems like we should be able to retry this job
117
114
  return true
118
115
  end
@@ -138,7 +135,7 @@ module Resque
138
135
  # if we didn't set a ttl, it hasn't expired
139
136
  return false unless self.class.retry_ttl
140
137
 
141
- model.expires_at < Time.now
138
+ model.expired?
142
139
  end
143
140
 
144
141
  def max_attempt_reached?(model)
@@ -6,6 +6,8 @@ module Resque
6
6
  include Resque::Pertry::Persistence
7
7
  include Resque::Pertry::Retry
8
8
 
9
+ attr_reader :exception_handled
10
+
9
11
  class << self
10
12
 
11
13
  # Enqueue a job
@@ -23,7 +25,13 @@ module Resque
23
25
  def perform(args = {})
24
26
  raise ArgumentError, "Invalid arguments, expecting a Hash but got: #{args.inspect}" unless Hash === args
25
27
 
26
- instance(args).perform
28
+ begin
29
+ job = instance(args)
30
+ job.perform
31
+ rescue => e
32
+ job.handle_exception(e)
33
+ raise unless job.exception_handled
34
+ end
27
35
  end
28
36
 
29
37
  def instance(args = {})
@@ -88,6 +96,31 @@ module Resque
88
96
  raise NoMethodError, "No method #{self.class.name}#perform defined!"
89
97
  end
90
98
 
99
+ def handle_exception(exception)
100
+ # we don't handle exceptions by default, leave it for resque
101
+ # when overridding this method, if you decide you want to completely
102
+ # handle it, and not pass it back to resque, you'll need to call
103
+ # exception_handled!
104
+ end
105
+
106
+ def exception_handled
107
+ @exception_handled ||= false
108
+ end
109
+
110
+ def exception_handled!
111
+ @exception_handled = true
112
+ end
113
+
114
+ # mark job as failed, won't be retried
115
+ def fail!
116
+ Resque::Pertry::ResquePertryPersistence.fail_job(self.class, payload)
117
+ end
118
+
119
+ # mark job as complete
120
+ def complete!
121
+ Resque::Pertry::ResquePertryPersistence.finnish_job(self.class, payload)
122
+ end
123
+
91
124
  def arguments
92
125
  @_arguments
93
126
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "resque-pertry"
3
3
  s.description = "Adds persistence to Resque jobs, and retry properties"
4
- s.version = "1.0.0"
4
+ s.version = "1.0.1"
5
5
  s.authors = [ "Anthony Powles" ]
6
6
  s.email = "rubygems+resque-pertry@idreamz.net"
7
7
  s.summary = "Allows job to be persistent, and be retried in case of failure"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-pertry
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-02 00:00:00.000000000 Z
12
+ date: 2013-08-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler