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'.freeze
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]
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



13
14
15
16
17
18
# File 'app/models/scheduled_task.rb', line 13

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

.timeoutObject



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

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

Instance Method Details

#calculate_next_run(time = nil) ⇒ Object



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

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

#cron_parserObject



47
48
49
# File 'app/models/scheduled_task.rb', line 47

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

#process_running?Boolean

Returns:

  • (Boolean)


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

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

#to_sObject



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

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

#write_attribute(name, value) ⇒ Object



63
64
65
66
# File 'app/models/scheduled_task.rb', line 63

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