que-scheduler 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.
- checksums.yaml +4 -4
- data/lib/que/scheduler/defined_job.rb +61 -2
- data/lib/que/scheduler/engine.rb +1 -1
- data/lib/que/scheduler/enqueueing_calculator.rb +5 -44
- data/lib/que/scheduler/scheduler_job.rb +4 -4
- data/lib/que/scheduler/scheduler_job_args.rb +1 -1
- data/lib/que/scheduler/version.rb +1 -1
- metadata +2 -3
- data/lib/que/scheduler/schedule_parser.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50f99770c888127c3d20b6d5a9072fd529c3a6be
|
4
|
+
data.tar.gz: 3fedea8f36b9a322b4cc1b09b05eb1fab35789e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c406a1a4d22830795836f2bde623ed6b438f0c9e09fdc5bfaf15d5df3bd1385e924e208058241df8a06dc614ea10746d85e13e8d1d9c80022e972fade58c4be
|
7
|
+
data.tar.gz: '08cae05d301b647f98b85ffbf1512709b0c134d5432c73c02a3620e5f3914ecc56ce32ae8fb7b71c2cf6d6bca3d6a6873f8ed310aee7bbd0b8dcbfac6a441583'
|
@@ -1,10 +1,14 @@
|
|
1
1
|
require 'hashie'
|
2
2
|
require 'fugit'
|
3
|
+
require 'backports/2.4.0/hash/compact'
|
3
4
|
|
4
5
|
# This is the definition of one scheduleable job in the que-scheduler config yml file.
|
5
6
|
module Que
|
6
7
|
module Scheduler
|
7
8
|
class DefinedJob < Hashie::Dash
|
9
|
+
QUE_SCHEDULER_CONFIG_LOCATION =
|
10
|
+
ENV.fetch('QUE_SCHEDULER_CONFIG_LOCATION', 'config/que_schedule.yml')
|
11
|
+
|
8
12
|
include Hashie::Extensions::Dash::PropertyTranslation
|
9
13
|
|
10
14
|
SCHEDULE_TYPES = [
|
@@ -13,8 +17,7 @@ module Que
|
|
13
17
|
].freeze
|
14
18
|
|
15
19
|
def self.err_field(f, v)
|
16
|
-
suffix =
|
17
|
-
"#{Que::Scheduler::ScheduleParser::QUE_SCHEDULER_CONFIG_LOCATION}"
|
20
|
+
suffix = "in que-scheduler config #{QUE_SCHEDULER_CONFIG_LOCATION}"
|
18
21
|
raise "Invalid #{f} '#{v}' #{suffix}"
|
19
22
|
end
|
20
23
|
|
@@ -38,6 +41,62 @@ module Que
|
|
38
41
|
next_run = next_time.to_local_time.in_time_zone(next_time.zone)
|
39
42
|
next_run <= to ? next_run : nil
|
40
43
|
end
|
44
|
+
|
45
|
+
# Given the last scheduler run time, and this run time, return all
|
46
|
+
# the instances that should be enqueued for the job class.
|
47
|
+
def calculate_missed_runs(last_run_time, as_time)
|
48
|
+
missed_times = []
|
49
|
+
last_time = last_run_time
|
50
|
+
while (next_run = next_run_time(last_time, as_time))
|
51
|
+
missed_times << next_run
|
52
|
+
last_time = next_run
|
53
|
+
end
|
54
|
+
|
55
|
+
generate_required_jobs_list(missed_times)
|
56
|
+
end
|
57
|
+
|
58
|
+
class << self
|
59
|
+
def defined_jobs
|
60
|
+
@defined_jobs ||= YAML.load_file(QUE_SCHEDULER_CONFIG_LOCATION).map do |k, v|
|
61
|
+
Que::Scheduler::DefinedJob.new(
|
62
|
+
{
|
63
|
+
name: k,
|
64
|
+
job_class: v['class'] || k,
|
65
|
+
queue: v['queue'],
|
66
|
+
args: v['args'],
|
67
|
+
priority: v['priority'],
|
68
|
+
cron: v['cron'],
|
69
|
+
schedule_type: v['schedule_type'] || DefinedJob::SCHEDULE_TYPE_DEFAULT
|
70
|
+
}.compact
|
71
|
+
)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
# Given the timestamps of the missed events, generate a list of jobs
|
79
|
+
# that can be enqueued as an array of arrays of args.
|
80
|
+
def generate_required_jobs_list(missed_times)
|
81
|
+
jobs_for_class = []
|
82
|
+
|
83
|
+
unless missed_times.empty?
|
84
|
+
options = {
|
85
|
+
args: args,
|
86
|
+
queue: queue,
|
87
|
+
priority: priority
|
88
|
+
}.compact
|
89
|
+
|
90
|
+
if schedule_type == DefinedJob::SCHEDULE_TYPE_EVERY_EVENT
|
91
|
+
missed_times.each do |time_missed|
|
92
|
+
jobs_for_class << options.merge(args: [time_missed] + (args || []))
|
93
|
+
end
|
94
|
+
else
|
95
|
+
jobs_for_class << options
|
96
|
+
end
|
97
|
+
end
|
98
|
+
jobs_for_class
|
99
|
+
end
|
41
100
|
end
|
42
101
|
end
|
43
102
|
end
|
data/lib/que/scheduler/engine.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'fugit'
|
2
|
-
require 'backports/2.4.0/hash/compact'
|
3
2
|
|
4
3
|
module Que
|
5
4
|
module Scheduler
|
6
|
-
EnqueueingCalculatorResult = Struct.new(:missed_jobs, :schedule_dictionary)
|
7
|
-
|
8
5
|
class EnqueueingCalculator
|
6
|
+
Result = Struct.new(:missed_jobs, :schedule_dictionary)
|
7
|
+
|
9
8
|
class << self
|
10
9
|
def parse(scheduler_config, scheduler_job_args)
|
11
10
|
missed_jobs = {}
|
@@ -24,51 +23,13 @@ module Que
|
|
24
23
|
next unless scheduler_job_args.job_dictionary.include?(job_name)
|
25
24
|
|
26
25
|
# This has been seen before. We should check if we have missed any executions.
|
27
|
-
missed = calculate_missed_runs(
|
28
|
-
|
26
|
+
missed = desc.calculate_missed_runs(
|
27
|
+
scheduler_job_args.last_run_time, scheduler_job_args.as_time
|
29
28
|
)
|
30
29
|
missed_jobs[desc.job_class] = missed unless missed.empty?
|
31
30
|
end
|
32
31
|
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
# Given a job description, the last scheduler run time, and this run time, return all
|
39
|
-
# the instances that should be enqueued for that job class.
|
40
|
-
def calculate_missed_runs(desc, last_run_time, as_time)
|
41
|
-
missed_times = []
|
42
|
-
last_time = last_run_time
|
43
|
-
while (next_run = desc.next_run_time(last_time, as_time))
|
44
|
-
missed_times << next_run
|
45
|
-
last_time = next_run
|
46
|
-
end
|
47
|
-
|
48
|
-
generate_required_jobs_list(desc, missed_times)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Given a job description, and the timestamps of the missed events, generate a list of jobs
|
52
|
-
# that can be enqueued as an array of arrays of args.
|
53
|
-
def generate_required_jobs_list(desc, missed_times)
|
54
|
-
jobs_for_class = []
|
55
|
-
|
56
|
-
unless missed_times.empty?
|
57
|
-
options = {
|
58
|
-
args: desc.args,
|
59
|
-
queue: desc.queue,
|
60
|
-
priority: desc.priority
|
61
|
-
}.compact
|
62
|
-
|
63
|
-
if desc.schedule_type == DefinedJob::SCHEDULE_TYPE_EVERY_EVENT
|
64
|
-
missed_times.each do |time_missed|
|
65
|
-
jobs_for_class << options.merge(args: [time_missed] + (desc.args || []))
|
66
|
-
end
|
67
|
-
else
|
68
|
-
jobs_for_class << options
|
69
|
-
end
|
70
|
-
end
|
71
|
-
jobs_for_class
|
32
|
+
Result.new(missed_jobs, schedule_dictionary)
|
72
33
|
end
|
73
34
|
end
|
74
35
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'que'
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'defined_job'
|
4
4
|
require_relative 'enqueueing_calculator'
|
5
5
|
require_relative 'scheduler_job_args'
|
6
6
|
|
@@ -10,13 +10,13 @@ module Que
|
|
10
10
|
SCHEDULER_COUNT_SQL = "SELECT COUNT(*) FROM que_jobs WHERE job_class = '#{name}'".freeze
|
11
11
|
SCHEDULER_FREQUENCY = 60
|
12
12
|
|
13
|
-
#
|
13
|
+
# Always highest possible priority.
|
14
14
|
@priority = 0
|
15
15
|
|
16
16
|
def run(options = nil)
|
17
17
|
::ActiveRecord::Base.transaction do
|
18
18
|
assert_one_scheduler_job
|
19
|
-
scheduler_job_args = SchedulerJobArgs.
|
19
|
+
scheduler_job_args = SchedulerJobArgs.build(options)
|
20
20
|
logs = ["que-scheduler last ran at #{scheduler_job_args.last_run_time}."]
|
21
21
|
|
22
22
|
# It's possible one worker node has severe clock skew, and reports a time earlier than
|
@@ -54,7 +54,7 @@ module Que
|
|
54
54
|
def enqueue_required_jobs(scheduler_job_args, logs)
|
55
55
|
# Obtain the hash of missed jobs. Keys are the job classes, and the values are arrays
|
56
56
|
# each containing more arrays for the arguments of that instance.
|
57
|
-
result = EnqueueingCalculator.parse(
|
57
|
+
result = EnqueueingCalculator.parse(DefinedJob.defined_jobs, scheduler_job_args)
|
58
58
|
result.missed_jobs.each do |job_class, args_arrays|
|
59
59
|
args_arrays.each do |args|
|
60
60
|
logs << "que-scheduler enqueueing #{job_class} with args: #{args}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: que-scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Harry Lascelles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -92,7 +92,6 @@ files:
|
|
92
92
|
- lib/que/scheduler/defined_job.rb
|
93
93
|
- lib/que/scheduler/engine.rb
|
94
94
|
- lib/que/scheduler/enqueueing_calculator.rb
|
95
|
-
- lib/que/scheduler/schedule_parser.rb
|
96
95
|
- lib/que/scheduler/scheduler_job.rb
|
97
96
|
- lib/que/scheduler/scheduler_job_args.rb
|
98
97
|
- lib/que/scheduler/version.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'backports/2.4.0/hash/compact'
|
3
|
-
|
4
|
-
require_relative 'defined_job'
|
5
|
-
|
6
|
-
module Que
|
7
|
-
module Scheduler
|
8
|
-
module ScheduleParser
|
9
|
-
QUE_SCHEDULER_CONFIG_LOCATION =
|
10
|
-
ENV.fetch('QUE_SCHEDULER_CONFIG_LOCATION', 'config/que_schedule.yml')
|
11
|
-
|
12
|
-
class << self
|
13
|
-
def defined_jobs
|
14
|
-
@defined_jobs ||= YAML.load_file(QUE_SCHEDULER_CONFIG_LOCATION).map do |k, v|
|
15
|
-
Que::Scheduler::DefinedJob.new(
|
16
|
-
{
|
17
|
-
name: k,
|
18
|
-
job_class: v['class'] || k,
|
19
|
-
queue: v['queue'],
|
20
|
-
args: v['args'],
|
21
|
-
priority: v['priority'],
|
22
|
-
cron: v['cron'],
|
23
|
-
schedule_type: v['schedule_type'] || DefinedJob::SCHEDULE_TYPE_DEFAULT
|
24
|
-
}.compact
|
25
|
-
)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|