Class: ScheduledTask

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Checker, Log, Runner, Status
Defined in:
app/models/scheduled_task.rb,
app/models/scheduled_task/log.rb,
app/models/scheduled_task/runner.rb,
app/models/scheduled_task/status.rb,
app/models/scheduled_task/checker.rb

Defined Under Namespace

Modules: Checker, Log, Runner, Status

Constant Summary collapse

DEFAULT_TIMEOUT_ENVVAR_NAME =
'TASKS_SCHEDULER_TIMEOUT'
DEFAULT_TIMEOUT =
12.hours
LAST_FAIL_STATUSES =
[STATUS_FAILED, STATUS_ABORTED, STATUS_TASK_NOT_FOUND, STATUS_TIMEOUT].freeze
LOG_RUNNING =
'running'
LOG_SUCCESSFUL =
'successful'
LOG_UNSUCCESSFUL =
'unsuccessful'

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Status

#failed?, #running?, #status, #waiting?

Methods included from Runner

#run

Methods included from Log

#log_file

Methods included from Checker

#check

Class Method Details

.rake_tasksObject



16
17
18
19
20
21
# File 'app/models/scheduled_task.rb', line 16

def rake_tasks
  @rake_tasks ||= begin
    Rails.application.load_tasks
    Rake.application.tasks.map(&:name)
  end
end

.timeoutObject



23
24
25
26
27
28
29
30
# File 'app/models/scheduled_task.rb', line 23

def timeout
  @timeout ||= begin
    r = Integer(ENV[DEFAULT_TIMEOUT_ENVVAR_NAME])
    r.positive? ? r.seconds : DEFAULT_TIMEOUT
               rescue ArgumentError, TypeError
                 DEFAULT_TIMEOUT
  end
end

Instance Method Details

#calculate_next_run(time = nil) ⇒ Object



57
58
59
60
61
62
63
# File 'app/models/scheduled_task.rb', line 57

def calculate_next_run(time = nil)
  if time.present?
    cron_parser.next(time.utc)
  else
    cron_parser.next
  end
end

#cron_parserObject



49
50
51
# File 'app/models/scheduled_task.rb', line 49

def cron_parser
  @cron_parser ||= ::CronParser.new(scheduling)
end

#process_running?Boolean

Returns:

  • (Boolean)


70
71
72
73
74
75
76
77
78
79
80
81
# File 'app/models/scheduled_task.rb', line 70

def process_running?
  return false if pid.nil?

  Process.kill(0, pid)
  true
rescue Errno::EPERM
  raise "No permission to query #{pid}!"
rescue Errno::ESRCH
  false
rescue StandardError
  raise "Unable to determine status for #{pid}"
end

#task_exist?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'app/models/scheduled_task.rb', line 83

def task_exist?
  self.class.rake_tasks.include?(task)
end

#to_sObject



53
54
55
# File 'app/models/scheduled_task.rb', line 53

def to_s
  "S: #{scheduling}, T: #{task}, NR: #{next_run.present? ? next_run.in_time_zone : '-'}"
end

#validate_taskObject



87
88
89
90
91
92
93
# File 'app/models/scheduled_task.rb', line 87

def validate_task
  return if task.blank?
  return unless task_changed?
  return if self.class.rake_tasks.include?(task)

  errors.add(:task, "Task \"#{task}\" not found")
end

#write_attribute(name, value) ⇒ Object



65
66
67
68
# File 'app/models/scheduled_task.rb', line 65

def write_attribute(name, value)
  @cron_parser = nil if name == 'scheduling'
  super
end