delayed_job 2.1.4 → 3.0.0.pre
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/README.textile +4 -1
- data/lib/delayed/backend/base.rb +32 -14
- data/lib/delayed/backend/shared_spec.rb +98 -17
- data/lib/delayed/command.rb +17 -27
- data/lib/delayed/lifecycle.rb +84 -0
- data/lib/delayed/performable_method.rb +3 -1
- data/lib/delayed/plugin.rb +13 -0
- data/lib/delayed/plugins/clear_locks.rb +15 -0
- data/lib/delayed/psych_ext.rb +65 -0
- data/lib/delayed/railtie.rb +0 -2
- data/lib/delayed/serialization/active_record.rb +5 -1
- data/lib/delayed/syck_ext.rb +34 -0
- data/lib/delayed/tasks.rb +1 -1
- data/lib/delayed/worker.rb +68 -27
- data/lib/delayed/yaml_ext.rb +5 -36
- data/lib/delayed_job.rb +10 -1
- data/lib/generators/delayed_job/delayed_job_generator.rb +1 -24
- data/spec/autoloaded/instance_clazz.rb +6 -0
- data/spec/autoloaded/instance_struct.rb +6 -0
- data/spec/delayed/backend/test.rb +112 -0
- data/spec/delayed/serialization/test.rb +0 -0
- data/spec/lifecycle_spec.rb +107 -0
- data/spec/message_sending_spec.rb +2 -2
- data/spec/performable_method_spec.rb +26 -1
- data/spec/sample_jobs.rb +6 -0
- data/spec/spec_helper.rb +17 -28
- data/spec/test_backend_spec.rb +13 -0
- data/spec/worker_spec.rb +2 -20
- data/spec/yaml_ext_spec.rb +19 -19
- metadata +107 -133
- data/lib/delayed/backend/active_record.rb +0 -82
- data/lib/generators/delayed_job/templates/migration.rb +0 -21
- data/spec/active_record_job_spec.rb +0 -36
- data/spec/database.yml +0 -4
data/spec/worker_spec.rb
CHANGED
@@ -12,26 +12,8 @@ describe Delayed::Worker do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should set backend with a symbol" do
|
15
|
-
Delayed::Worker.backend = :
|
16
|
-
Delayed::Worker.backend.should == Delayed::Backend::
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "guess_backend" do
|
21
|
-
after do
|
22
|
-
Delayed::Worker.backend = :active_record
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should set to active_record if nil" do
|
26
|
-
Delayed::Worker.backend = nil
|
27
|
-
lambda {
|
28
|
-
Delayed::Worker.guess_backend
|
29
|
-
}.should change { Delayed::Worker.backend }.to(Delayed::Backend::ActiveRecord::Job)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should not override the existing backend" do
|
33
|
-
Delayed::Worker.backend = Class.new
|
34
|
-
lambda { Delayed::Worker.guess_backend }.should_not change { Delayed::Worker.backend }
|
15
|
+
Delayed::Worker.backend = :test
|
16
|
+
Delayed::Worker.backend.should == Delayed::Backend::Test::Job
|
35
17
|
end
|
36
18
|
end
|
37
19
|
end
|
data/spec/yaml_ext_spec.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe YAML do
|
4
|
-
it "should autoload classes
|
3
|
+
describe "YAML" do
|
4
|
+
it "should autoload classes" do
|
5
5
|
lambda {
|
6
|
-
|
7
|
-
|
6
|
+
yaml = "--- !ruby/class:Autoloaded::Clazz {}\n"
|
7
|
+
YAML.load(yaml).should == Autoloaded::Clazz
|
8
8
|
}.should_not raise_error
|
9
9
|
end
|
10
10
|
|
11
|
-
it "should autoload
|
11
|
+
it "should autoload the class of a struct" do
|
12
12
|
lambda {
|
13
|
-
|
14
|
-
|
13
|
+
yaml = "--- !ruby/class:Autoloaded::Struct {}\n"
|
14
|
+
YAML.load(yaml).should == Autoloaded::Struct
|
15
15
|
}.should_not raise_error
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
18
|
+
it "should autoload the class for the instance of a struct" do
|
19
|
+
lambda {
|
20
|
+
yaml = "--- !ruby/struct:Autoloaded::InstanceStruct {}"
|
21
|
+
YAML.load(yaml).class.should == Autoloaded::InstanceStruct
|
22
|
+
}.should_not raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should autoload the class for the instance" do
|
26
|
+
lambda {
|
27
|
+
yaml = "--- !ruby/object:Autoloaded::InstanceClazz {}\n"
|
28
|
+
YAML.load(yaml).class.should == Autoloaded::InstanceClazz
|
29
|
+
}.should_not raise_error
|
29
30
|
end
|
30
|
-
|
31
31
|
end
|
metadata
CHANGED
@@ -1,220 +1,194 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 2
|
8
|
-
- 1
|
9
|
-
- 4
|
10
|
-
version: 2.1.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.0.pre
|
5
|
+
prerelease: 6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Chris Gaffney
|
14
9
|
- Brandon Keepers
|
15
|
-
-
|
10
|
+
- Tobias Lütke
|
16
11
|
autorequire:
|
17
12
|
bindir: bin
|
18
13
|
cert_chain: []
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
dependencies:
|
23
|
-
- !ruby/object:Gem::Dependency
|
24
|
-
prerelease: false
|
25
|
-
type: :runtime
|
14
|
+
date: 2011-09-28 00:00:00.000000000Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
26
17
|
name: daemons
|
27
|
-
|
18
|
+
requirement: &70127307821420 !ruby/object:Gem::Requirement
|
28
19
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
33
|
-
segments:
|
34
|
-
- 0
|
35
|
-
version: "0"
|
36
|
-
requirement: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
prerelease: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
39
24
|
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *70127307821420
|
27
|
+
- !ruby/object:Gem::Dependency
|
40
28
|
name: activesupport
|
41
|
-
|
29
|
+
requirement: &70127307819760 !ruby/object:Gem::Requirement
|
42
30
|
none: false
|
43
|
-
requirements:
|
31
|
+
requirements:
|
44
32
|
- - ~>
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
47
|
-
|
48
|
-
- 3
|
49
|
-
- 0
|
50
|
-
version: "3.0"
|
51
|
-
requirement: *id002
|
52
|
-
- !ruby/object:Gem::Dependency
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '3.0'
|
35
|
+
type: :runtime
|
53
36
|
prerelease: false
|
37
|
+
version_requirements: *70127307819760
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: activerecord
|
40
|
+
requirement: &70127307818840 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.0'
|
54
46
|
type: :development
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *70127307818840
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: sqlite3
|
51
|
+
requirement: &70127307818160 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *70127307818160
|
60
|
+
- !ruby/object:Gem::Dependency
|
55
61
|
name: rails
|
56
|
-
|
62
|
+
requirement: &70127307817220 !ruby/object:Gem::Requirement
|
57
63
|
none: false
|
58
|
-
requirements:
|
64
|
+
requirements:
|
59
65
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
segments:
|
63
|
-
- 3
|
64
|
-
- 0
|
65
|
-
version: "3.0"
|
66
|
-
requirement: *id003
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
prerelease: false
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '3.0'
|
69
68
|
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: *70127307817220
|
71
|
+
- !ruby/object:Gem::Dependency
|
70
72
|
name: rspec
|
71
|
-
|
73
|
+
requirement: &70127307816440 !ruby/object:Gem::Requirement
|
72
74
|
none: false
|
73
|
-
requirements:
|
75
|
+
requirements:
|
74
76
|
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
segments:
|
78
|
-
- 2
|
79
|
-
- 0
|
80
|
-
version: "2.0"
|
81
|
-
requirement: *id004
|
82
|
-
- !ruby/object:Gem::Dependency
|
83
|
-
prerelease: false
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '2.0'
|
84
79
|
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: *70127307816440
|
82
|
+
- !ruby/object:Gem::Dependency
|
85
83
|
name: rake
|
86
|
-
|
84
|
+
requirement: &70127307815820 !ruby/object:Gem::Requirement
|
87
85
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
92
|
-
segments:
|
93
|
-
- 0
|
94
|
-
version: "0"
|
95
|
-
requirement: *id005
|
96
|
-
- !ruby/object:Gem::Dependency
|
97
|
-
prerelease: false
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
98
90
|
type: :development
|
99
|
-
name: sqlite3
|
100
|
-
version_requirements: &id006 !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
|
-
requirements:
|
103
|
-
- - ">="
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
hash: 3
|
106
|
-
segments:
|
107
|
-
- 0
|
108
|
-
version: "0"
|
109
|
-
requirement: *id006
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
91
|
prerelease: false
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
segments:
|
121
|
-
- 0
|
122
|
-
version: "0"
|
123
|
-
requirement: *id007
|
124
|
-
description: |-
|
125
|
-
Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks.
|
126
|
-
|
127
|
-
This gem is collectiveidea's fork (http://github.com/collectiveidea/delayed_job).
|
128
|
-
email:
|
92
|
+
version_requirements: *70127307815820
|
93
|
+
description: ! 'Delayed_job (or DJ) encapsulates the common pattern of asynchronously
|
94
|
+
executing longer tasks in the background. It is a direct extraction from Shopify
|
95
|
+
where the job table is responsible for a multitude of core tasks.
|
96
|
+
|
97
|
+
|
98
|
+
This gem is collectiveidea''s fork (http://github.com/collectiveidea/delayed_job).'
|
99
|
+
email:
|
129
100
|
- chris@collectiveidea.com
|
130
101
|
- brandon@opensoul.org
|
131
102
|
executables: []
|
132
|
-
|
133
103
|
extensions: []
|
134
|
-
|
135
|
-
extra_rdoc_files:
|
104
|
+
extra_rdoc_files:
|
136
105
|
- README.textile
|
137
|
-
files:
|
106
|
+
files:
|
138
107
|
- contrib/delayed_job.monitrc
|
139
108
|
- contrib/delayed_job_multiple.monitrc
|
140
|
-
- lib/delayed/backend/active_record.rb
|
141
109
|
- lib/delayed/backend/base.rb
|
142
110
|
- lib/delayed/backend/shared_spec.rb
|
143
111
|
- lib/delayed/command.rb
|
144
112
|
- lib/delayed/deserialization_error.rb
|
113
|
+
- lib/delayed/lifecycle.rb
|
145
114
|
- lib/delayed/message_sending.rb
|
146
115
|
- lib/delayed/performable_mailer.rb
|
147
116
|
- lib/delayed/performable_method.rb
|
117
|
+
- lib/delayed/plugin.rb
|
118
|
+
- lib/delayed/plugins/clear_locks.rb
|
119
|
+
- lib/delayed/psych_ext.rb
|
148
120
|
- lib/delayed/railtie.rb
|
149
121
|
- lib/delayed/recipes.rb
|
150
122
|
- lib/delayed/serialization/active_record.rb
|
123
|
+
- lib/delayed/syck_ext.rb
|
151
124
|
- lib/delayed/tasks.rb
|
152
125
|
- lib/delayed/worker.rb
|
153
126
|
- lib/delayed/yaml_ext.rb
|
154
127
|
- lib/delayed_job.rb
|
155
128
|
- lib/generators/delayed_job/delayed_job_generator.rb
|
156
|
-
- lib/generators/delayed_job/templates/migration.rb
|
157
129
|
- lib/generators/delayed_job/templates/script
|
158
130
|
- recipes/delayed_job.rb
|
159
|
-
- spec/active_record_job_spec.rb
|
160
131
|
- spec/autoloaded/clazz.rb
|
132
|
+
- spec/autoloaded/instance_clazz.rb
|
133
|
+
- spec/autoloaded/instance_struct.rb
|
161
134
|
- spec/autoloaded/struct.rb
|
162
|
-
- spec/
|
135
|
+
- spec/delayed/backend/test.rb
|
136
|
+
- spec/delayed/serialization/test.rb
|
137
|
+
- spec/lifecycle_spec.rb
|
163
138
|
- spec/message_sending_spec.rb
|
164
139
|
- spec/performable_mailer_spec.rb
|
165
140
|
- spec/performable_method_spec.rb
|
166
141
|
- spec/sample_jobs.rb
|
167
142
|
- spec/spec_helper.rb
|
143
|
+
- spec/test_backend_spec.rb
|
168
144
|
- spec/worker_spec.rb
|
169
145
|
- spec/yaml_ext_spec.rb
|
170
146
|
- MIT-LICENSE
|
171
147
|
- README.textile
|
172
|
-
has_rdoc: true
|
173
148
|
homepage: http://github.com/collectiveidea/delayed_job
|
174
149
|
licenses: []
|
175
|
-
|
176
150
|
post_install_message:
|
177
|
-
rdoc_options:
|
151
|
+
rdoc_options:
|
178
152
|
- --main
|
179
153
|
- README.textile
|
180
154
|
- --inline-source
|
181
155
|
- --line-numbers
|
182
|
-
require_paths:
|
156
|
+
require_paths:
|
183
157
|
- lib
|
184
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
185
159
|
none: false
|
186
|
-
requirements:
|
187
|
-
- -
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
|
190
|
-
segments:
|
160
|
+
requirements:
|
161
|
+
- - ! '>='
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
segments:
|
191
165
|
- 0
|
192
|
-
|
193
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
|
+
hash: -811957530217889269
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
168
|
none: false
|
195
|
-
requirements:
|
196
|
-
- -
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
|
199
|
-
segments:
|
200
|
-
- 0
|
201
|
-
version: "0"
|
169
|
+
requirements:
|
170
|
+
- - ! '>'
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 1.3.1
|
202
173
|
requirements: []
|
203
|
-
|
204
174
|
rubyforge_project:
|
205
|
-
rubygems_version: 1.
|
175
|
+
rubygems_version: 1.8.6
|
206
176
|
signing_key:
|
207
177
|
specification_version: 3
|
208
178
|
summary: Database-backed asynchronous priority queue system -- Extracted from Shopify
|
209
|
-
test_files:
|
210
|
-
- spec/active_record_job_spec.rb
|
179
|
+
test_files:
|
211
180
|
- spec/autoloaded/clazz.rb
|
181
|
+
- spec/autoloaded/instance_clazz.rb
|
182
|
+
- spec/autoloaded/instance_struct.rb
|
212
183
|
- spec/autoloaded/struct.rb
|
213
|
-
- spec/
|
184
|
+
- spec/delayed/backend/test.rb
|
185
|
+
- spec/delayed/serialization/test.rb
|
186
|
+
- spec/lifecycle_spec.rb
|
214
187
|
- spec/message_sending_spec.rb
|
215
188
|
- spec/performable_mailer_spec.rb
|
216
189
|
- spec/performable_method_spec.rb
|
217
190
|
- spec/sample_jobs.rb
|
218
191
|
- spec/spec_helper.rb
|
192
|
+
- spec/test_backend_spec.rb
|
219
193
|
- spec/worker_spec.rb
|
220
194
|
- spec/yaml_ext_spec.rb
|
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
|
3
|
-
module Delayed
|
4
|
-
module Backend
|
5
|
-
module ActiveRecord
|
6
|
-
# A job object that is persisted to the database.
|
7
|
-
# Contains the work object as a YAML field.
|
8
|
-
class Job < ::ActiveRecord::Base
|
9
|
-
include Delayed::Backend::Base
|
10
|
-
set_table_name :delayed_jobs
|
11
|
-
|
12
|
-
before_save :set_default_run_at
|
13
|
-
|
14
|
-
scope :ready_to_run, lambda {|worker_name, max_run_time|
|
15
|
-
where(['(run_at <= ? AND (locked_at IS NULL OR locked_at < ?) OR locked_by = ?) AND failed_at IS NULL', db_time_now, db_time_now - max_run_time, worker_name])
|
16
|
-
}
|
17
|
-
scope :by_priority, order('priority ASC, run_at ASC')
|
18
|
-
|
19
|
-
def self.before_fork
|
20
|
-
::ActiveRecord::Base.clear_all_connections!
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.after_fork
|
24
|
-
::ActiveRecord::Base.establish_connection
|
25
|
-
end
|
26
|
-
|
27
|
-
# When a worker is exiting, make sure we don't have any locked jobs.
|
28
|
-
def self.clear_locks!(worker_name)
|
29
|
-
update_all("locked_by = null, locked_at = null", ["locked_by = ?", worker_name])
|
30
|
-
end
|
31
|
-
|
32
|
-
# Find a few candidate jobs to run (in case some immediately get locked by others).
|
33
|
-
def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time)
|
34
|
-
scope = self.ready_to_run(worker_name, max_run_time)
|
35
|
-
scope = scope.scoped(:conditions => ['priority >= ?', Worker.min_priority]) if Worker.min_priority
|
36
|
-
scope = scope.scoped(:conditions => ['priority <= ?', Worker.max_priority]) if Worker.max_priority
|
37
|
-
|
38
|
-
::ActiveRecord::Base.silence do
|
39
|
-
scope.by_priority.all(:limit => limit)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# Lock this job for this worker.
|
44
|
-
# Returns true if we have the lock, false otherwise.
|
45
|
-
def lock_exclusively!(max_run_time, worker)
|
46
|
-
now = self.class.db_time_now
|
47
|
-
affected_rows = if locked_by != worker
|
48
|
-
# We don't own this job so we will update the locked_by name and the locked_at
|
49
|
-
self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?) and (run_at <= ?)", id, (now - max_run_time.to_i), now])
|
50
|
-
else
|
51
|
-
# We already own this job, this may happen if the job queue crashes.
|
52
|
-
# Simply resume and update the locked_at
|
53
|
-
self.class.update_all(["locked_at = ?", now], ["id = ? and locked_by = ?", id, worker])
|
54
|
-
end
|
55
|
-
if affected_rows == 1
|
56
|
-
self.locked_at = now
|
57
|
-
self.locked_by = worker
|
58
|
-
self.locked_at_will_change!
|
59
|
-
self.locked_by_will_change!
|
60
|
-
return true
|
61
|
-
else
|
62
|
-
return false
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Get the current time (GMT or local depending on DB)
|
67
|
-
# Note: This does not ping the DB to get the time, so all your clients
|
68
|
-
# must have syncronized clocks.
|
69
|
-
def self.db_time_now
|
70
|
-
if Time.zone
|
71
|
-
Time.zone.now
|
72
|
-
elsif ::ActiveRecord::Base.default_timezone == :utc
|
73
|
-
Time.now.utc
|
74
|
-
else
|
75
|
-
Time.now
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class CreateDelayedJobs < ActiveRecord::Migration
|
2
|
-
def self.up
|
3
|
-
create_table :delayed_jobs, :force => true do |table|
|
4
|
-
table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue
|
5
|
-
table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually.
|
6
|
-
table.text :handler # YAML-encoded string of the object that will do work
|
7
|
-
table.text :last_error # reason for last failure (See Note below)
|
8
|
-
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
9
|
-
table.datetime :locked_at # Set when a client is working on this object
|
10
|
-
table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
|
11
|
-
table.string :locked_by # Who is working on this object (if locked)
|
12
|
-
table.timestamps
|
13
|
-
end
|
14
|
-
|
15
|
-
add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority'
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.down
|
19
|
-
drop_table :delayed_jobs
|
20
|
-
end
|
21
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'delayed/backend/active_record'
|
3
|
-
|
4
|
-
describe Delayed::Backend::ActiveRecord::Job do
|
5
|
-
after do
|
6
|
-
Time.zone = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
it_should_behave_like 'a delayed_job backend'
|
10
|
-
|
11
|
-
context "db_time_now" do
|
12
|
-
it "should return time in current time zone if set" do
|
13
|
-
Time.zone = 'Eastern Time (US & Canada)'
|
14
|
-
%w(EST EDT).should include(Delayed::Job.db_time_now.zone)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should return UTC time if that is the AR default" do
|
18
|
-
Time.zone = nil
|
19
|
-
ActiveRecord::Base.default_timezone = :utc
|
20
|
-
Delayed::Backend::ActiveRecord::Job.db_time_now.zone.should == 'UTC'
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should return local time if that is the AR default" do
|
24
|
-
Time.zone = 'Central Time (US & Canada)'
|
25
|
-
ActiveRecord::Base.default_timezone = :local
|
26
|
-
%w(CST CDT).should include(Delayed::Backend::ActiveRecord::Job.db_time_now.zone)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "after_fork" do
|
31
|
-
it "should call reconnect on the connection" do
|
32
|
-
ActiveRecord::Base.should_receive(:establish_connection)
|
33
|
-
Delayed::Backend::ActiveRecord::Job.after_fork
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/spec/database.yml
DELETED