Packages

Allows you to run some code and handle any timeouts or errors, with custom retry logic, while limiting the total number of concurrent things being run via worker pools.

Current section

Files

Jump to
retryable lib work_manager.ex
Raw

lib/work_manager.ex

defmodule Retryable.WorkManager do
use GenServer
require Logger
def start_link(name) do
GenServer.start_link(__MODULE__, name, name: Module.concat(__MODULE__, name))
end
def init(name) do
{:ok, {name, :queue.new}}
end
def handle_cast({:enqueue, work}, {name, queue}) do
Logger.debug "[Retryable][#{work.id}] Work enqueued in #{inspect name}."
work = Retryable.Work.enqueued(work)
{:noreply, {name, :queue.in(work, queue)}}
end
def handle_call(:retrieve_work, _from, {name, queue}) do
case :queue.out(queue) do
{{:value, work}, queue} -> {:reply, {:job, work}, {name, queue}}
{:empty, queue} -> {:reply, :nothing, {name, queue}}
end
end
end