openwferu-scheduler 0.9.15.1172 → 0.9.16
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/openwfe/util/scheduler.rb +152 -35
- metadata +2 -2
@@ -298,16 +298,6 @@ module OpenWFE
|
|
298
298
|
# Schedules a job in a loop. After an execution, it will not execute
|
299
299
|
# before the time specified in 'freq'.
|
300
300
|
#
|
301
|
-
# Note that if your job takes 2s to execute and the freq is set to
|
302
|
-
# 10s, it will in fact execute every 12s.
|
303
|
-
# You can however wrap the code within its own thread :
|
304
|
-
#
|
305
|
-
# scheduler.schedule_every("12s") do
|
306
|
-
# Thread.new do
|
307
|
-
# do_the_job()
|
308
|
-
# end
|
309
|
-
# end
|
310
|
-
#
|
311
301
|
# This method returns a job identifier which can be used to unschedule()
|
312
302
|
# the job.
|
313
303
|
#
|
@@ -317,20 +307,30 @@ module OpenWFE
|
|
317
307
|
|
318
308
|
params = prepare_params params
|
319
309
|
schedulable = params[:schedulable]
|
320
|
-
params[:every] =
|
310
|
+
params[:every] = freq
|
321
311
|
|
322
|
-
|
312
|
+
last_at = params[:last_at]
|
313
|
+
next_at = if last_at
|
314
|
+
last_at + f
|
315
|
+
else
|
316
|
+
Time.now.to_f + f
|
317
|
+
end
|
323
318
|
|
324
|
-
|
319
|
+
sschedule_at next_at, params do |job_id, at|
|
325
320
|
|
326
321
|
if schedulable
|
327
322
|
schedulable.trigger(params)
|
328
323
|
else
|
329
324
|
block.call job_id, at
|
330
325
|
end
|
326
|
+
|
327
|
+
params[:job_id] = job_id
|
328
|
+
params[:last_at] = at
|
331
329
|
|
332
|
-
schedule_every(
|
330
|
+
schedule_every(freq, params, &block) \
|
333
331
|
unless @dont_reschedule_every
|
332
|
+
#
|
333
|
+
# yes, this is a kind of recursion
|
334
334
|
|
335
335
|
job_id
|
336
336
|
end
|
@@ -405,13 +405,11 @@ module OpenWFE
|
|
405
405
|
|
406
406
|
unschedule(cron_id) if cron_id
|
407
407
|
|
408
|
-
tags = params[:tags]
|
409
|
-
|
410
408
|
#
|
411
409
|
# schedule
|
412
410
|
|
413
411
|
b = to_block(params, &block)
|
414
|
-
job = CronJob.new(self, cron_id, cron_line,
|
412
|
+
job = CronJob.new(self, cron_id, cron_line, params, &b)
|
415
413
|
@cron_jobs[job.job_id] = job
|
416
414
|
|
417
415
|
job.job_id
|
@@ -427,8 +425,10 @@ module OpenWFE
|
|
427
425
|
job = @cron_jobs[job_id]
|
428
426
|
return job if job
|
429
427
|
|
430
|
-
|
431
|
-
|
428
|
+
synchronize do
|
429
|
+
@pending_jobs.find do |job|
|
430
|
+
job.job_id == job_id
|
431
|
+
end
|
432
432
|
end
|
433
433
|
end
|
434
434
|
|
@@ -456,8 +456,10 @@ module OpenWFE
|
|
456
456
|
job.has_tag?(tag)
|
457
457
|
end
|
458
458
|
|
459
|
-
|
460
|
-
job
|
459
|
+
synchronize do
|
460
|
+
result + @pending_jobs.find_all do |job|
|
461
|
+
job.has_tag?(tag)
|
462
|
+
end
|
461
463
|
end
|
462
464
|
end
|
463
465
|
|
@@ -554,10 +556,10 @@ module OpenWFE
|
|
554
556
|
end
|
555
557
|
|
556
558
|
job_id = params[:job_id]
|
557
|
-
tags = params[:tags]
|
558
559
|
|
559
560
|
b = to_block(params, &block)
|
560
|
-
|
561
|
+
|
562
|
+
job = jobClass.new(self, at, job_id, params, &b)
|
561
563
|
|
562
564
|
unschedule(job_id) if job_id
|
563
565
|
|
@@ -670,6 +672,8 @@ module OpenWFE
|
|
670
672
|
|
671
673
|
# TODO : eventually consider running cron / pending
|
672
674
|
# job triggering in two different threads
|
675
|
+
#
|
676
|
+
# but well... there's the synchronization issue...
|
673
677
|
|
674
678
|
#
|
675
679
|
# cron jobs
|
@@ -710,13 +714,21 @@ module OpenWFE
|
|
710
714
|
#
|
711
715
|
# obviously
|
712
716
|
|
713
|
-
trigger
|
717
|
+
trigger job
|
714
718
|
|
715
719
|
@pending_jobs.delete_at(0)
|
716
720
|
end
|
717
721
|
end
|
718
722
|
end
|
719
723
|
|
724
|
+
#
|
725
|
+
# Triggers the job (in a dedicated thread).
|
726
|
+
#
|
727
|
+
# If an error occurs in the job, it well get caught and an error
|
728
|
+
# message will be displayed to STDOUT.
|
729
|
+
# If this scheduler provides a lwarn(message) method, it will
|
730
|
+
# be used insted.
|
731
|
+
#
|
720
732
|
def trigger (job)
|
721
733
|
|
722
734
|
Thread.new do
|
@@ -758,6 +770,9 @@ module OpenWFE
|
|
758
770
|
# would it be better to use a Mutex instead of a full-blown
|
759
771
|
# Monitor ?
|
760
772
|
|
773
|
+
#
|
774
|
+
# The parent class for scheduled jobs.
|
775
|
+
#
|
761
776
|
class Job
|
762
777
|
|
763
778
|
@@last_given_id = 0
|
@@ -765,10 +780,33 @@ module OpenWFE
|
|
765
780
|
# as a scheduler is fully transient, no need to
|
766
781
|
# have persistent ids, a simple counter is sufficient
|
767
782
|
|
768
|
-
|
783
|
+
#
|
784
|
+
# The identifier for the job
|
785
|
+
#
|
786
|
+
attr_accessor :job_id
|
787
|
+
|
788
|
+
#
|
789
|
+
# An array of tags
|
790
|
+
#
|
791
|
+
attr_accessor :tags
|
792
|
+
|
793
|
+
#
|
794
|
+
# The block to execute at trigger time
|
795
|
+
#
|
796
|
+
attr_accessor :block
|
797
|
+
|
798
|
+
#
|
799
|
+
# A reference to the scheduler
|
800
|
+
#
|
769
801
|
attr_reader :scheduler
|
802
|
+
|
803
|
+
#
|
804
|
+
# Keeping a copy of the initialization params of the job.
|
805
|
+
#
|
806
|
+
attr_reader :params
|
770
807
|
|
771
|
-
|
808
|
+
|
809
|
+
def initialize (scheduler, job_id, params, &block)
|
772
810
|
|
773
811
|
@scheduler = scheduler
|
774
812
|
@block = block
|
@@ -782,10 +820,12 @@ module OpenWFE
|
|
782
820
|
end
|
783
821
|
end
|
784
822
|
|
823
|
+
@params = params
|
824
|
+
|
785
825
|
#@tags = Array(tags).collect { |tag| tag.to_s }
|
786
826
|
# making sure we have an array of String tags
|
787
827
|
|
788
|
-
@tags = Array(tags)
|
828
|
+
@tags = Array(params[:tags])
|
789
829
|
# any tag is OK
|
790
830
|
end
|
791
831
|
|
@@ -793,6 +833,7 @@ module OpenWFE
|
|
793
833
|
# Returns true if this job sports the given tag
|
794
834
|
#
|
795
835
|
def has_tag? (tag)
|
836
|
+
|
796
837
|
@tags.include?(tag)
|
797
838
|
end
|
798
839
|
|
@@ -800,53 +841,118 @@ module OpenWFE
|
|
800
841
|
# Removes (cancels) this job from its scheduler.
|
801
842
|
#
|
802
843
|
def unschedule
|
844
|
+
|
803
845
|
@scheduler.unschedule(@job_id)
|
804
846
|
end
|
805
847
|
end
|
806
848
|
|
849
|
+
#
|
850
|
+
# An 'at' job.
|
807
851
|
class AtJob < Job
|
808
852
|
|
853
|
+
#
|
854
|
+
# The float representation (Time.to_f) of the time at which
|
855
|
+
# the job should be triggered.
|
856
|
+
#
|
809
857
|
attr_accessor :at
|
810
858
|
|
811
|
-
|
812
|
-
|
859
|
+
#
|
860
|
+
# The constructor.
|
861
|
+
#
|
862
|
+
def initialize (scheduler, at, at_id, params, &block)
|
863
|
+
|
864
|
+
super(scheduler, at_id, params, &block)
|
813
865
|
@at = at
|
814
866
|
end
|
815
867
|
|
868
|
+
#
|
869
|
+
# Triggers the job (calls the block)
|
870
|
+
#
|
816
871
|
def trigger
|
872
|
+
|
817
873
|
@block.call @job_id, @at
|
818
874
|
end
|
875
|
+
|
876
|
+
#
|
877
|
+
# Returns the Time instance at which this job is scheduled.
|
878
|
+
#
|
879
|
+
def schedule_info
|
880
|
+
|
881
|
+
Time.at(@at)
|
882
|
+
end
|
819
883
|
end
|
820
884
|
|
885
|
+
#
|
886
|
+
# An 'every' job is simply an extension of an 'at' job.
|
887
|
+
#
|
821
888
|
class EveryJob < AtJob
|
889
|
+
|
890
|
+
#
|
891
|
+
# Returns the frequency string used to schedule this EveryJob,
|
892
|
+
# like for example "3d" or "1M10d3h".
|
893
|
+
#
|
894
|
+
def schedule_info
|
895
|
+
|
896
|
+
@params[:every]
|
897
|
+
end
|
822
898
|
end
|
823
899
|
|
900
|
+
#
|
901
|
+
# A cron job.
|
902
|
+
#
|
824
903
|
class CronJob < Job
|
825
904
|
|
905
|
+
#
|
906
|
+
# The CronLine instance representing the times at which
|
907
|
+
# the cron job has to be triggered.
|
908
|
+
#
|
826
909
|
attr_accessor :cron_line
|
827
910
|
|
828
|
-
def initialize (scheduler, cron_id, line,
|
911
|
+
def initialize (scheduler, cron_id, line, params, &block)
|
829
912
|
|
830
|
-
super(scheduler, cron_id,
|
913
|
+
super(scheduler, cron_id, params, &block)
|
914
|
+
|
915
|
+
if line.is_a?(String)
|
831
916
|
|
832
|
-
if line.kind_of?(String)
|
833
917
|
@cron_line = CronLine.new(line)
|
834
|
-
|
918
|
+
|
919
|
+
elsif line.is_a?(CronLine)
|
920
|
+
|
835
921
|
@cron_line = line
|
922
|
+
|
836
923
|
else
|
924
|
+
|
837
925
|
raise \
|
838
926
|
"Cannot initialize a CronJob " +
|
839
927
|
"with a param of class #{line.class}"
|
840
928
|
end
|
841
929
|
end
|
842
930
|
|
931
|
+
#
|
932
|
+
# This is the method called by the scheduler to determine if it
|
933
|
+
# has to fire this CronJob instance.
|
934
|
+
#
|
843
935
|
def matches? (time)
|
936
|
+
|
844
937
|
@cron_line.matches? time
|
845
938
|
end
|
846
939
|
|
940
|
+
#
|
941
|
+
# As the name implies.
|
942
|
+
#
|
847
943
|
def trigger
|
944
|
+
|
848
945
|
@block.call @job_id, @cron_line
|
849
946
|
end
|
947
|
+
|
948
|
+
#
|
949
|
+
# Returns the original cron tab string used to schedule this
|
950
|
+
# Job. Like for example "60/3 * * * Sun".
|
951
|
+
#
|
952
|
+
def schedule_info
|
953
|
+
|
954
|
+
@cron_line.original
|
955
|
+
end
|
850
956
|
end
|
851
957
|
|
852
958
|
#
|
@@ -855,6 +961,11 @@ module OpenWFE
|
|
855
961
|
#
|
856
962
|
class CronLine
|
857
963
|
|
964
|
+
#
|
965
|
+
# The string used for creating this cronline instance.
|
966
|
+
#
|
967
|
+
attr_reader :original
|
968
|
+
|
858
969
|
attr_reader \
|
859
970
|
:seconds,
|
860
971
|
:minutes,
|
@@ -867,6 +978,8 @@ module OpenWFE
|
|
867
978
|
|
868
979
|
super()
|
869
980
|
|
981
|
+
@original = line
|
982
|
+
|
870
983
|
items = line.split
|
871
984
|
|
872
985
|
unless [ 5, 6 ].include?(items.length)
|
@@ -891,6 +1004,9 @@ module OpenWFE
|
|
891
1004
|
#adjust_arrays()
|
892
1005
|
end
|
893
1006
|
|
1007
|
+
#
|
1008
|
+
# Returns true if the given time matches this cron line.
|
1009
|
+
#
|
894
1010
|
def matches? (time)
|
895
1011
|
|
896
1012
|
if time.kind_of?(Float) or time.kind_of?(Integer)
|
@@ -918,7 +1034,7 @@ module OpenWFE
|
|
918
1034
|
|
919
1035
|
private
|
920
1036
|
|
921
|
-
|
1037
|
+
#--
|
922
1038
|
# adjust values to Ruby
|
923
1039
|
#
|
924
1040
|
#def adjust_arrays()
|
@@ -934,7 +1050,8 @@ module OpenWFE
|
|
934
1050
|
# } if @weekdays
|
935
1051
|
#end
|
936
1052
|
#
|
937
|
-
# dead code
|
1053
|
+
# dead code, keeping as a reminder
|
1054
|
+
#++
|
938
1055
|
|
939
1056
|
WDS = [ "mon", "tue", "wed", "thu", "fri", "sat", "sun" ]
|
940
1057
|
#
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: openwferu-scheduler
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.9.16
|
7
|
+
date: 2007-11-19 00:00:00 +09:00
|
8
8
|
summary: OpenWFEru scheduler for Ruby (at, cron and every)
|
9
9
|
require_paths:
|
10
10
|
- lib
|