Packages
honeydew
1.2.4
1.5.0
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.0
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc7
1.0.0-rc6
1.0.0-rc5
1.0.0-rc4
1.0.0-rc3
1.0.0-rc2
1.0.0-rc1
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Pluggable local/clusterable job queue focused on safety.
Current section
Files
Jump to
Current section
Files
lib/honeydew/job.ex
defmodule Honeydew.Job do
@moduledoc """
A Honeydew job.
"""
require Record
@type private :: term()
# :private needs to be first, the mnesia queue's ordering depends on it
@fields [:private, # queue's private state
:failure_private, # failure mode's private state
:task,
:from, # if the requester wants the result, here's where to send it
:result,
:by, # node last processed the job
:queue,
:job_monitor,
:enqueued_at,
:started_at,
:completed_at]
@kv Enum.map(@fields, &{&1, nil})
defstruct @kv
@doc false
Record.defrecord :job, @kv
@match_spec @fields |> Enum.map(&{&1, :_}) |> Enum.into(%{})
@type t :: %__MODULE__{
task: Honeydew.task | nil,
queue: Honeydew.queue_name,
private: private
}
@doc false
def fields, do: @fields
vars = @fields |> Enum.map(&Macro.var(&1, __MODULE__))
vars_keyword_list = Enum.zip(@fields, vars)
@doc false
def new(task, queue) do
%__MODULE__{task: task, queue: queue, enqueued_at: System.system_time(:millisecond)}
end
@doc false
def to_record(%{unquote_splicing(vars_keyword_list)}, name) do
{name, unquote_splicing(vars)}
end
@doc false
def to_record({_name, unquote_splicing(vars)}, name) do
{name, unquote_splicing(vars)}
end
@doc false
def to_record({_name, unquote_splicing(vars)}) do
{:job, unquote_splicing(vars)}
end
@doc false
def from_record({_name, unquote_splicing(vars)}) do
%__MODULE__{unquote_splicing(vars_keyword_list)}
end
@doc false
def match_spec(map, name) do
@match_spec
|> Map.merge(map)
|> Honeydew.Job.to_record(name)
end
end