resque-scheduler 1.9.3 → 1.9.4
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/HISTORY.md +5 -0
- data/README.markdown +31 -0
- data/lib/resque_scheduler.rb +42 -5
- data/lib/resque_scheduler/server.rb +1 -1
- data/lib/resque_scheduler/version.rb +1 -1
- data/resque-scheduler.gemspec +2 -2
- data/test/delayed_queue_test.rb +47 -0
- metadata +4 -4
data/HISTORY.md
CHANGED
data/README.markdown
CHANGED
|
@@ -86,6 +86,15 @@ since the jobs are stored in a redis sorted set (zset). I can't imagine this
|
|
|
86
86
|
being an issue for someone since redis is stupidly fast even at log(n), but full
|
|
87
87
|
disclosure is always best.
|
|
88
88
|
|
|
89
|
+
*Removing Delayed jobs*
|
|
90
|
+
|
|
91
|
+
If you have the need to cancel a delayed job, you can do so thusly:
|
|
92
|
+
|
|
93
|
+
# after you've enqueued a job like:
|
|
94
|
+
Resque.enqueue_at(5.days.from_now, SendFollowUpEmail, :user_id => current_user.id)
|
|
95
|
+
# remove the job with exactly the same parameters:
|
|
96
|
+
Resque.remove_delayed(SendFollowUpEmail, :user_id => current_user.id)
|
|
97
|
+
|
|
89
98
|
### Schedule jobs per environment
|
|
90
99
|
|
|
91
100
|
Resque-Scheduler allows to create schedule jobs for specific envs. The arg
|
|
@@ -138,6 +147,28 @@ The Delayed tab:
|
|
|
138
147
|
|
|
139
148
|

|
|
140
149
|
|
|
150
|
+
Get get these to show up you need to pass a file to `resque-web` to tell it to
|
|
151
|
+
include the `resque-scheduler` plugin. You probably already have a file somewhere
|
|
152
|
+
where you configure `resque`. It probably looks something like this:
|
|
153
|
+
|
|
154
|
+
require 'resque' # include resque so we can configure it
|
|
155
|
+
Resque.redis = "redis_server:6379" # tell Resque where redis lives
|
|
156
|
+
|
|
157
|
+
Now, you want to add the following:
|
|
158
|
+
|
|
159
|
+
require 'resque_scheduler' # include the resque_scheduler (this makes the tabs show up)
|
|
160
|
+
|
|
161
|
+
And if you have a schedule you want to set, add this:
|
|
162
|
+
|
|
163
|
+
Resque.schedule = YAML.load_file(File.join(RAILS_ROOT, 'config/resque_schedule.yml')) # load the schedule
|
|
164
|
+
|
|
165
|
+
Now make sure you're passing that file to resque-web like so:
|
|
166
|
+
|
|
167
|
+
resque-web ~/yourapp/config/resque_config.rb
|
|
168
|
+
|
|
169
|
+
That should make the scheduler tabs show up in `resque-web`.
|
|
170
|
+
|
|
171
|
+
|
|
141
172
|
|
|
142
173
|
Installation and the Scheduler process
|
|
143
174
|
--------------------------------------
|
data/lib/resque_scheduler.rb
CHANGED
|
@@ -39,7 +39,7 @@ module ResqueScheduler
|
|
|
39
39
|
# for queueing. Until timestamp is in the past, the job will
|
|
40
40
|
# sit in the schedule list.
|
|
41
41
|
def enqueue_at(timestamp, klass, *args)
|
|
42
|
-
delayed_push(timestamp,
|
|
42
|
+
delayed_push(timestamp, job_to_hash(klass, args))
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
# Identical to enqueue_at but takes number_of_seconds_from_now
|
|
@@ -104,13 +104,50 @@ module ResqueScheduler
|
|
|
104
104
|
item = decode redis.lpop(key)
|
|
105
105
|
|
|
106
106
|
# If the list is empty, remove it.
|
|
107
|
-
|
|
108
|
-
redis.del key
|
|
109
|
-
redis.zrem :delayed_queue_schedule, timestamp.to_i
|
|
110
|
-
end
|
|
107
|
+
clean_up_timestamp(key, timestamp)
|
|
111
108
|
item
|
|
112
109
|
end
|
|
113
110
|
|
|
111
|
+
# Clears all jobs created with enqueue_at or enqueue_in
|
|
112
|
+
def reset_delayed_queue
|
|
113
|
+
Array(redis.zrange(:delayed_queue_schedule, 0, -1)).each do |item|
|
|
114
|
+
redis.del "delayed:#{item}"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
redis.del :delayed_queue_schedule
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# given an encoded item, remove it from the delayed_queue
|
|
121
|
+
def remove_delayed(klass, *args)
|
|
122
|
+
destroyed = 0
|
|
123
|
+
search = encode(job_to_hash(klass, args))
|
|
124
|
+
Array(redis.keys("delayed:*")).each do |key|
|
|
125
|
+
destroyed += redis.lrem key, 0, search
|
|
126
|
+
end
|
|
127
|
+
destroyed
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def count_all_scheduled_jobs
|
|
131
|
+
total_jobs = 0
|
|
132
|
+
Array(redis.zrange(:delayed_queue_schedule, 0, -1)).each do |timestamp|
|
|
133
|
+
total_jobs += redis.llen("delayed:#{timestamp}").to_i
|
|
134
|
+
end
|
|
135
|
+
total_jobs
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
private
|
|
139
|
+
def job_to_hash(klass, args)
|
|
140
|
+
{:class => klass.to_s, :args => args, :queue => queue_from_class(klass)}
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def clean_up_timestamp(key, timestamp)
|
|
144
|
+
# If the list is empty, remove it.
|
|
145
|
+
if 0 == redis.llen(key).to_i
|
|
146
|
+
redis.del key
|
|
147
|
+
redis.zrem :delayed_queue_schedule, timestamp.to_i
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
114
151
|
end
|
|
115
152
|
|
|
116
153
|
Resque.extend ResqueScheduler
|
|
@@ -41,7 +41,7 @@ module ResqueScheduler
|
|
|
41
41
|
|
|
42
42
|
post "/delayed/queue_now" do
|
|
43
43
|
timestamp = params['timestamp']
|
|
44
|
-
Resque::Scheduler.enqueue_delayed_items_for_timestamp(timestamp.to_i) if timestamp.
|
|
44
|
+
Resque::Scheduler.enqueue_delayed_items_for_timestamp(timestamp.to_i) if timestamp.to_i > 0
|
|
45
45
|
redirect url("/overview")
|
|
46
46
|
end
|
|
47
47
|
|
data/resque-scheduler.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{resque-scheduler}
|
|
8
|
-
s.version = "1.9.
|
|
8
|
+
s.version = "1.9.4"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Ben VandenBos"]
|
|
12
|
-
s.date = %q{2010-07-
|
|
12
|
+
s.date = %q{2010-07-29}
|
|
13
13
|
s.description = %q{Light weight job scheduling on top of Resque.
|
|
14
14
|
Adds methods enqueue_at/enqueue_in to schedule jobs in the future.
|
|
15
15
|
Also supports queueing jobs on a fixed, cron-like schedule.}
|
data/test/delayed_queue_test.rb
CHANGED
|
@@ -148,5 +148,52 @@ class Resque::DelayedQueueTest < Test::Unit::TestCase
|
|
|
148
148
|
|
|
149
149
|
Resque::Scheduler.handle_delayed_items
|
|
150
150
|
end
|
|
151
|
+
|
|
152
|
+
def test_clearing_delayed_queue
|
|
153
|
+
t = Time.now + 120
|
|
154
|
+
4.times { Resque.enqueue_at(t, SomeIvarJob) }
|
|
155
|
+
4.times { Resque.enqueue_at(Time.now + rand(100), SomeIvarJob) }
|
|
156
|
+
|
|
157
|
+
Resque.reset_delayed_queue
|
|
158
|
+
assert_equal(0, Resque.delayed_queue_schedule_size)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def test_remove_specific_item
|
|
162
|
+
t = Time.now + 120
|
|
163
|
+
Resque.enqueue_at(t, SomeIvarJob)
|
|
164
|
+
|
|
165
|
+
assert_equal(1, Resque.remove_delayed(SomeIvarJob))
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_remove_bogus_item_leaves_the_rest_alone
|
|
169
|
+
t = Time.now + 120
|
|
170
|
+
Resque.enqueue_at(t, SomeIvarJob, "foo")
|
|
171
|
+
Resque.enqueue_at(t, SomeIvarJob, "bar")
|
|
172
|
+
Resque.enqueue_at(t, SomeIvarJob, "bar")
|
|
173
|
+
Resque.enqueue_at(t, SomeIvarJob, "baz")
|
|
174
|
+
|
|
175
|
+
assert_equal(0, Resque.remove_delayed(SomeIvarJob))
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def test_remove_specific_item_in_group_of_other_items_at_same_timestamp
|
|
179
|
+
t = Time.now + 120
|
|
180
|
+
Resque.enqueue_at(t, SomeIvarJob, "foo")
|
|
181
|
+
Resque.enqueue_at(t, SomeIvarJob, "bar")
|
|
182
|
+
Resque.enqueue_at(t, SomeIvarJob, "bar")
|
|
183
|
+
Resque.enqueue_at(t, SomeIvarJob, "baz")
|
|
184
|
+
|
|
185
|
+
assert_equal(2, Resque.remove_delayed(SomeIvarJob, "bar"))
|
|
186
|
+
assert_equal(1, Resque.delayed_queue_schedule_size)
|
|
187
|
+
end
|
|
151
188
|
|
|
189
|
+
def test_remove_specific_item_in_group_of_other_items_at_different_timestamps
|
|
190
|
+
t = Time.now + 120
|
|
191
|
+
Resque.enqueue_at(t, SomeIvarJob, "foo")
|
|
192
|
+
Resque.enqueue_at(t + 1, SomeIvarJob, "bar")
|
|
193
|
+
Resque.enqueue_at(t + 2, SomeIvarJob, "bar")
|
|
194
|
+
Resque.enqueue_at(t + 3, SomeIvarJob, "baz")
|
|
195
|
+
|
|
196
|
+
assert_equal(2, Resque.remove_delayed(SomeIvarJob, "bar"))
|
|
197
|
+
assert_equal(2, Resque.count_all_scheduled_jobs)
|
|
198
|
+
end
|
|
152
199
|
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: resque-scheduler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 59
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 1
|
|
8
8
|
- 9
|
|
9
|
-
-
|
|
10
|
-
version: 1.9.
|
|
9
|
+
- 4
|
|
10
|
+
version: 1.9.4
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Ben VandenBos
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2010-07-
|
|
18
|
+
date: 2010-07-29 00:00:00 -07:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|