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
STATUS_RUNNING =
'running'
STATUS_FAILED =
'failed'
STATUS_WAITING =
'waiting'
STATUS_ABORTED =
'aborted'
STATUS_TIMEOUT =
'timeout'
STATUS_DISABLED =
'disabled'
LAST_FAIL_STATUSES =
[STATUS_FAILED, STATUS_ABORTED, 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



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

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

.timeoutObject



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

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



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

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

#cron_parserObject



51
52
53
# File 'app/models/scheduled_task.rb', line 51

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

#process_running?Boolean

Returns:

  • (Boolean)


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

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)


85
86
87
# File 'app/models/scheduled_task.rb', line 85

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

#to_sObject



55
56
57
# File 'app/models/scheduled_task.rb', line 55

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

#validate_taskObject



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

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



67
68
69
70
# File 'app/models/scheduled_task.rb', line 67

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