Sha256: d61d54ca30f869a27035955c95af2ffc28568041292e6a3444ee4e66c36c55aa

Contents?: true

Size: 1.01 KB

Versions: 3

Compression:

Stored size: 1.01 KB

Contents

require 'with_advisory_lock'

class Roqua::Scheduling::Scheduler
  def ping
    with_advisory_lock do
      jobs_to_run.each do |cron_job|
        begin
          run_task cron_job
        rescue Exception => ex
          Roqua::Support::Errors.report(ex)
          raise ex if Rails.env.test?
        end
      end
    end
  end

  def jobs_to_run
    Roqua::Scheduling::CronJob.where('next_run_at <= ?', Time.now)
  end

  def tasks
    schedule.tasks
  end

  def schedule
    Roqua::Scheduling::Schedule.current_schedule
  end

  def advisory_lock_name
    "#{ActiveRecord::Base.connection_config[:database]}_cron_lock"
  end

  private

  def with_advisory_lock
    ActiveRecord::Base.with_advisory_lock(advisory_lock_name, timeout_seconds: 0) do
      yield
    end
  end

  def run_task(cron_job)
    task = schedule.tasks[cron_job.name]
    task.run

    Appsignal.increment_counter("scheduler.run_task.completed", 1, task_name: task.name)
    cron_job.update completed_at: Time.now, next_run_at: task.next_run_at
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
roqua-support-0.3.4 lib/roqua/scheduling/scheduler.rb
roqua-support-0.3.3 lib/roqua/scheduling/scheduler.rb
roqua-support-0.3.2 lib/roqua/scheduling/scheduler.rb