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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a243842a2035934a0aa1ee9d28f7620a376491b5
4
- data.tar.gz: 43cc12d4246e4f74d32f17497fbe43957bc7a7af
3
+ metadata.gz: 50f99770c888127c3d20b6d5a9072fd529c3a6be
4
+ data.tar.gz: 3fedea8f36b9a322b4cc1b09b05eb1fab35789e8
5
5
  SHA512:
6
- metadata.gz: 8f8398000dcd8cf65c1dff98928752fb58e9b548f05b6ea66eb3f2714fe7d58706b57d489a6719b944e1ec48b722c6fed73678e46e957c212ebef5b49b2e7a4c
7
- data.tar.gz: baff4c34fce9a3bd4649e32490bc47a7b409d22871f8e0f57fe02432657fad0861e89650cc153deae3d1b39304d6bc66cae1e645618db170e2903595de214a38
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 = 'in que-scheduler config ' \
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
@@ -7,7 +7,7 @@ module Que
7
7
  class Engine < ::Rails::Engine
8
8
  config.after_initialize do
9
9
  # Trigger a load of the schedule to ensure fast fail if it is invalid.
10
- ScheduleParser.defined_jobs
10
+ ::Que::Scheduler::DefinedJob.defined_jobs
11
11
  end
12
12
  end
13
13
  end
@@ -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
- desc, scheduler_job_args.last_run_time, scheduler_job_args.as_time
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
- EnqueueingCalculatorResult.new(missed_jobs, schedule_dictionary)
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 'schedule_parser'
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
- # Highest possible priority.
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.prepare_scheduler_job_args(options)
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(ScheduleParser.defined_jobs, scheduler_job_args)
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}"
@@ -8,7 +8,7 @@ module Que
8
8
  property :job_dictionary, required: true
9
9
  property :as_time, required: true
10
10
 
11
- def self.prepare_scheduler_job_args(options)
11
+ def self.build(options)
12
12
  parsed =
13
13
  if options.nil?
14
14
  # First ever run
@@ -1,5 +1,5 @@
1
1
  module Que
2
2
  module Scheduler
3
- VERSION = '1.0.0'.freeze
3
+ VERSION = '1.0.1'.freeze
4
4
  end
5
5
  end
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.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: 2017-12-19 00:00:00.000000000 Z
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