Current section

Files

Jump to
gen_queue_exq lib gen_queue adapters exq.ex
Raw

lib/gen_queue/adapters/exq.ex

defmodule GenQueue.Adapters.Exq do
@moduledoc """
An adapter for `GenQueue` to enable functionaility with `Exq`.
"""
use GenQueue.JobAdapter
alias GenQueue.Job
def start_link(gen_queue, opts \\ []) do
opts
|> Keyword.merge(name: gen_queue)
|> Exq.start_link()
end
@doc """
Push a `GenQueue.Job` for Exq to consume.
## Parameters:
* `gen_queue` - A `GenQueue` module
* `job` - A `GenQueue.Job`
## Returns:
* `{:ok, job}` if the operation was successful
* `{:error, reason}` if there was an error
"""
@spec handle_job(gen_queue :: GenQueue.t(), job :: GenQueue.Job.t()) ::
{:ok, GenQueue.Job.t()} | {:error, any}
def handle_job(gen_queue, %Job{queue: nil} = job) do
handle_job(gen_queue, %{job | queue: "default"})
end
def handle_job(gen_queue, %Job{delay: %DateTime{}} = job) do
case Exq.enqueue_at(gen_queue, job.queue, job.delay, job.module, job.args) do
{:ok, _} -> {:ok, job}
error -> error
end
end
def handle_job(gen_queue, %Job{delay: offset} = job) when is_integer(offset) do
case Exq.enqueue_in(gen_queue, job.queue, round(offset / 1000), job.module, job.args) do
{:ok, _} -> {:ok, job}
error -> error
end
end
def handle_job(gen_queue, job) do
case Exq.enqueue(gen_queue, job.queue, job.module, job.args) do
{:ok, _} -> {:ok, job}
error -> error
end
end
end