Packages
verk
0.12.0
1.7.3
1.7.2
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.0
1.4.1
1.4.0
1.3.0
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.2
1.0.1
1.0.0
0.14.1
0.14.0
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
Verk is a job processing system backed by Redis.
Current section
Files
Jump to
Current section
Files
lib/verk/worker.ex
defmodule Verk.Worker do
@moduledoc """
Worker executes the job, messages the manager when it's done and shutdowns
"""
use GenServer
require Logger
@process_dict_key :verk_current_job
@doc """
Get the current job that the worker is running
"""
@spec current_job :: %Verk.Job{}
def current_job, do: :erlang.get(@process_dict_key)
@doc false
def start_link(args \\ []) do
GenServer.start_link(__MODULE__, args)
end
@doc """
Ask the worker to perform the job
"""
@spec perform_async(pid, pid, %Verk.Job{}) :: :ok
def perform_async(worker, manager, job) do
GenServer.cast(worker, {:perform, job, manager})
end
@doc false
def init(_args \\ []), do: {:ok, nil}
@doc false
def handle_cast({:perform, job, manager}, state) do
try do
:erlang.put(@process_dict_key, job)
apply(String.to_atom("Elixir.#{job.class}"), :perform, job.args)
GenServer.cast(manager, {:done, self, job.jid})
{:stop, :normal, state}
rescue
exception -> GenServer.cast(manager, {:failed, self, job.jid, exception, System.stacktrace})
{:stop, :failed, state}
end
end
end