Current section
Files
Jump to
Current section
Files
lib/kitto/job.ex
defmodule Kitto.Job do
@moduledoc """
Contains functions to run jobs based on their specified options.
"""
alias Kitto.Runner
@doc """
Starts a job process
"""
def start_link(job) do
pid = spawn_link(Kitto.Job, :new, [job])
pid |> Process.register(job.name)
{:ok, pid}
end
@doc """
Registers a job to be started as a process by the runner supervisor
"""
def register(server, name, options, definition, job) do
import Kitto.Time
opts = [interval: options[:every] |> mseconds,
first_at: options[:first_at] |> mseconds]
Runner.register server, %{name: name, job: job, options: opts, definition: definition}
end
@doc """
Runs the job based on the given options
"""
def new(job) do
case job.options[:interval] do
nil -> once(job)
_ -> with_interval(job)
end
end
defp with_interval(job) do
first_at(job[:options][:first_at], job)
receive do
after
job.options[:interval] ->
run job
with_interval(put_in(job.options[:first_at], false))
end
end
defp run(job), do: Kitto.StatsServer.measure(job)
defp once(job) do
run job
receive do
end
end
defp first_at(false, _job), do: nil
defp first_at(t, job) do
if t, do: :timer.sleep(t)
run job
end
end