rufus-scheduler 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +9 -0
- data/CREDITS.txt +1 -0
- data/README.rdoc +1 -5
- data/TODO.txt +3 -0
- data/lib/rufus/sc/jobqueues.rb +35 -32
- data/lib/rufus/sc/jobs.rb +11 -8
- data/lib/rufus/sc/scheduler.rb +45 -25
- data/lib/rufus/scheduler.rb +1 -1
- metadata +3 -3
data/CHANGELOG.txt
CHANGED
@@ -2,6 +2,15 @@
|
|
2
2
|
= rufus-scheduler CHANGELOG.txt
|
3
3
|
|
4
4
|
|
5
|
+
== rufus-scheduler - 2.0.2 not yet released
|
6
|
+
|
7
|
+
- unified JobQueue and CronJobQueue, and handed @last_second management to the
|
8
|
+
latter
|
9
|
+
- #trigger_block method for easier override
|
10
|
+
- passing :job => job among Schedulable trigger parameters
|
11
|
+
|
12
|
+
|
13
|
+
== rufus-scheduler - 2.0.1 released 2009/05/07
|
5
14
|
== rufus-scheduler - 2.0.0 released 2009/05/07
|
6
15
|
|
7
16
|
- initial release
|
data/CREDITS.txt
CHANGED
data/README.rdoc
CHANGED
@@ -42,7 +42,7 @@ The usage is similar to the one of the old rufus-scheduler. There are a few diff
|
|
42
42
|
end
|
43
43
|
|
44
44
|
scheduler.cron '0 22 * * 1-5' do
|
45
|
-
# every day of the week at 00
|
45
|
+
# every day of the week at 22:00 (10pm)
|
46
46
|
puts 'activate security system'
|
47
47
|
end
|
48
48
|
|
@@ -50,10 +50,6 @@ The usage is similar to the one of the old rufus-scheduler. There are a few diff
|
|
50
50
|
puts 'check blood pressure'
|
51
51
|
end
|
52
52
|
|
53
|
-
# ...
|
54
|
-
|
55
|
-
scheduler.stop
|
56
|
-
|
57
53
|
|
58
54
|
This code summons a plain version of the scheduler, this can be made more explicit via :
|
59
55
|
|
data/TODO.txt
CHANGED
data/lib/rufus/sc/jobqueues.rb
CHANGED
@@ -50,16 +50,14 @@ module Scheduler
|
|
50
50
|
@jobs = []
|
51
51
|
end
|
52
52
|
|
53
|
-
#
|
53
|
+
# Triggers all the jobs that are scheduled for 'now'.
|
54
54
|
#
|
55
|
-
def
|
55
|
+
def trigger_matching_jobs
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
nil
|
62
|
-
end
|
57
|
+
now = Time.now
|
58
|
+
|
59
|
+
while job = job_to_trigger(now)
|
60
|
+
job.trigger
|
63
61
|
end
|
64
62
|
end
|
65
63
|
|
@@ -104,51 +102,56 @@ module Scheduler
|
|
104
102
|
protected
|
105
103
|
|
106
104
|
def delete (job_id)
|
105
|
+
|
107
106
|
j = @jobs.find { |j| j.job_id == job_id }
|
108
107
|
@jobs.delete(j) if j
|
109
|
-
|
108
|
+
end
|
109
|
+
|
110
|
+
# Returns the next job to trigger. Returns nil if none eligible.
|
111
|
+
#
|
112
|
+
def job_to_trigger (now)
|
113
|
+
|
114
|
+
@mutex.synchronize do
|
115
|
+
if @jobs.size > 0 && now.to_f >= @jobs.first.at
|
116
|
+
@jobs.shift
|
117
|
+
else
|
118
|
+
nil
|
119
|
+
end
|
120
|
+
end
|
110
121
|
end
|
111
122
|
end
|
112
123
|
|
113
124
|
#
|
114
125
|
# Tracking cron jobs.
|
115
126
|
#
|
116
|
-
|
117
|
-
#
|
118
|
-
class CronJobQueue
|
127
|
+
class CronJobQueue < JobQueue
|
119
128
|
|
120
129
|
def initialize
|
121
130
|
|
122
|
-
|
123
|
-
@
|
131
|
+
super
|
132
|
+
@last_cron_second = nil
|
124
133
|
end
|
125
134
|
|
126
|
-
def
|
135
|
+
def trigger_matching_jobs
|
127
136
|
|
128
|
-
|
129
|
-
end
|
137
|
+
now = Time.now
|
130
138
|
|
131
|
-
|
139
|
+
return if now.sec == @last_cron_second
|
140
|
+
@last_cron_second = now.sec
|
141
|
+
#
|
142
|
+
# ensuring the crons are checked within 1 second (not 1.2 second)
|
132
143
|
|
133
|
-
|
134
|
-
# maybe this sync is a bit paranoid
|
144
|
+
jobs = @mutex.synchronize { @jobs.dup }
|
135
145
|
|
136
|
-
|
146
|
+
jobs.each { |job| job.trigger_if_matches(now) }
|
137
147
|
end
|
138
148
|
|
139
149
|
def << (job)
|
140
150
|
|
141
|
-
@mutex.synchronize
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
@jobs.size
|
147
|
-
end
|
148
|
-
|
149
|
-
def to_h
|
150
|
-
|
151
|
-
@jobs.dup
|
151
|
+
@mutex.synchronize do
|
152
|
+
delete(job.job_id)
|
153
|
+
@jobs << job
|
154
|
+
end
|
152
155
|
end
|
153
156
|
end
|
154
157
|
|
data/lib/rufus/sc/jobs.rb
CHANGED
@@ -33,7 +33,7 @@ module Scheduler
|
|
33
33
|
|
34
34
|
# A reference to the scheduler owning this job
|
35
35
|
#
|
36
|
-
|
36
|
+
attr_accessor :scheduler
|
37
37
|
|
38
38
|
# The initial, raw, scheduling info (at / in / every / cron)
|
39
39
|
#
|
@@ -127,13 +127,7 @@ module Scheduler
|
|
127
127
|
|
128
128
|
begin
|
129
129
|
|
130
|
-
|
131
|
-
#@block.call(*args)
|
132
|
-
|
133
|
-
#@block.call(self)
|
134
|
-
|
135
|
-
@block.respond_to?(:call) ?
|
136
|
-
@block.call(self) : @block.trigger(@params)
|
130
|
+
trigger_block
|
137
131
|
|
138
132
|
@job_thread = nil
|
139
133
|
|
@@ -158,6 +152,15 @@ module Scheduler
|
|
158
152
|
end
|
159
153
|
end
|
160
154
|
|
155
|
+
# Simply encapsulating the block#call/trigger operation, for easy
|
156
|
+
# override.
|
157
|
+
#
|
158
|
+
def trigger_block
|
159
|
+
|
160
|
+
@block.respond_to?(:call) ?
|
161
|
+
@block.call(self) : @block.trigger(@params.merge(:job => self))
|
162
|
+
end
|
163
|
+
|
161
164
|
# Unschedules this job.
|
162
165
|
#
|
163
166
|
def unschedule
|
data/lib/rufus/sc/scheduler.rb
CHANGED
@@ -33,7 +33,7 @@ module Rufus::Scheduler
|
|
33
33
|
|
34
34
|
# This gem's version
|
35
35
|
#
|
36
|
-
VERSION = '2.0.
|
36
|
+
VERSION = '2.0.2'
|
37
37
|
|
38
38
|
#
|
39
39
|
# It's OK to pass an object responding to :trigger when scheduling a job
|
@@ -104,8 +104,8 @@ module Rufus::Scheduler
|
|
104
104
|
|
105
105
|
@options = opts
|
106
106
|
|
107
|
-
@jobs =
|
108
|
-
@cron_jobs =
|
107
|
+
@jobs = get_queue(:at, opts)
|
108
|
+
@cron_jobs = get_queue(:cron, opts)
|
109
109
|
|
110
110
|
@frequency = @options[:frequency] || 0.330
|
111
111
|
end
|
@@ -207,6 +207,7 @@ module Rufus::Scheduler
|
|
207
207
|
puts '=' * 80
|
208
208
|
puts "scheduler caught exception :"
|
209
209
|
puts exception
|
210
|
+
exception.backtrace.each { |l| puts l }
|
210
211
|
puts '=' * 80
|
211
212
|
end
|
212
213
|
end
|
@@ -245,6 +246,23 @@ module Rufus::Scheduler
|
|
245
246
|
|
246
247
|
protected
|
247
248
|
|
249
|
+
# Returns a job queue instance.
|
250
|
+
#
|
251
|
+
# (made it into a method for easy override)
|
252
|
+
#
|
253
|
+
def get_queue (type, opts)
|
254
|
+
|
255
|
+
q = if type == :cron
|
256
|
+
opts[:cron_job_queue] || Rufus::Scheduler::CronJobQueue.new
|
257
|
+
else
|
258
|
+
opts[:job_queue] || Rufus::Scheduler::JobQueue.new
|
259
|
+
end
|
260
|
+
|
261
|
+
q.scheduler = self if q.respond_to?(:scheduler=)
|
262
|
+
|
263
|
+
q
|
264
|
+
end
|
265
|
+
|
248
266
|
def combine_opts (schedulable, opts)
|
249
267
|
|
250
268
|
if schedulable.respond_to?(:trigger)
|
@@ -263,28 +281,9 @@ module Rufus::Scheduler
|
|
263
281
|
# triggered.
|
264
282
|
#
|
265
283
|
def step
|
266
|
-
cron_step
|
267
|
-
at_step
|
268
|
-
end
|
269
|
-
|
270
|
-
# calls every second
|
271
|
-
#
|
272
|
-
def cron_step
|
273
284
|
|
274
|
-
|
275
|
-
|
276
|
-
@last_cron_second = now.sec
|
277
|
-
#
|
278
|
-
# ensuring the crons are checked within 1 second (not 1.2 second)
|
279
|
-
|
280
|
-
@cron_jobs.trigger_matching_jobs(now)
|
281
|
-
end
|
282
|
-
|
283
|
-
def at_step
|
284
|
-
|
285
|
-
while job = @jobs.job_to_trigger
|
286
|
-
job.trigger
|
287
|
-
end
|
285
|
+
@cron_jobs.trigger_matching_jobs
|
286
|
+
@jobs.trigger_matching_jobs
|
288
287
|
end
|
289
288
|
|
290
289
|
def add_job (job)
|
@@ -374,6 +373,27 @@ module Rufus::Scheduler
|
|
374
373
|
# # use a Queue and a worker thread for the 'blocking' jobs
|
375
374
|
#end
|
376
375
|
|
376
|
+
#
|
377
|
+
# A rufus-scheduler that steps only when the ruby process receives the
|
378
|
+
# 10 / USR1 signal.
|
379
|
+
#
|
380
|
+
class SignalScheduler < SchedulerCore
|
381
|
+
|
382
|
+
def initialize (opts={})
|
383
|
+
|
384
|
+
super(opts)
|
385
|
+
|
386
|
+
trap(@options[:signal] || 10) do
|
387
|
+
step
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
def stop
|
392
|
+
|
393
|
+
trap(@options[:signal] || 10)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
377
397
|
#
|
378
398
|
# A rufus-scheduler that uses an EventMachine periodic timer instead of a
|
379
399
|
# loop.
|
@@ -386,7 +406,7 @@ module Rufus::Scheduler
|
|
386
406
|
'EventMachine missing, "require \'eventmachine\'" might help'
|
387
407
|
) unless defined?(EM)
|
388
408
|
|
389
|
-
super
|
409
|
+
super(opts)
|
390
410
|
end
|
391
411
|
|
392
412
|
def start
|
data/lib/rufus/scheduler.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufus-scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Mettraux
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-10-28 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
62
|
requirements: []
|
63
63
|
|
64
64
|
rubyforge_project: rufus
|
65
|
-
rubygems_version: 1.3.
|
65
|
+
rubygems_version: 1.3.5
|
66
66
|
signing_key:
|
67
67
|
specification_version: 3
|
68
68
|
summary: job scheduler for Ruby (at, cron, in and every jobs)
|