This is an adapter for GenQueue to enable functionaility with Verk.
The package can be installed by adding gen_queue_verk to your list of dependencies in mix.exs:
def deps do
[
{:gen_queue_verk, "~> 0.1.1"}
]
endSee HexDocs for additional documentation.
Before starting, please refer to the Verk documentation
for details on configuration. This adapter handles zero Verk related config.
We can start off by creating a new GenQueue module, which we will use to push jobs to
Exq.
defmodule Enqueuer do
use GenQueue, otp_app: :my_app
endOnce we have our module setup, ensure we have our config pointing to the GenQueue.Adapters.Verk
adapter.
config :my_app, Enqueuer, [
adapter: GenQueue.Adapters.Verk
]By default, gen_queue_verk does not start Verk on application start. So we must add
our new Enqueuer module to our supervision tree.
children = [
supervisor(Enqueuer, []),
]Jobs are simply modules with a perform method.
defmodule MyJob do
def perform(arg1) do
IO.inspect(arg1)
end
endWe can now easily enqueue jobs to Verk. The adapter will handle a variety of argument formats.
# Push MyJob to "default" queue
{:ok, job} = Enqueuer.push(MyJob)
# Push MyJob to "default" queue
{:ok, job} = Enqueuer.push({MyJob})
# Push MyJob to "default" queue with "arg1"
{:ok, job} = Enqueuer.push({MyJob, "arg1"})
# Push MyJob to "default" queue with no args
{:ok, job} = Enqueuer.push({MyJob, []})
# Push MyJob to "default" queue with "arg1" and "arg2"
{:ok, job} = Enqueuer.push({MyJob, ["arg1", "arg2"]})
# Push MyJob to "foo" queue with "arg1"
{:ok, job} = Enqueuer.push({MyJob, "arg1"}, [queue: "foo"])
# Schedule MyJob to "default" queue with "arg1" in 10 seconds
{:ok, job} = Enqueuer.push({MyJob, "arg1"}, [delay: 10_000])
# Schedule MyJob to "default" queue with "arg1" at a specific time
date = DateTime.utc_now()
{:ok, job} = Enqueuer.push({MyJob, "arg1"}, [delay: date])Optionally, we can also have our tests use the GenQueue.Adapters.MockJob adapter.
config :my_app, Enqueuer, [
adapter: GenQueue.Adapters.MockJob
]This mock adapter uses the standard GenQueue.Test helpers to send the job payload
back to the current processes mailbox (or another named process) instead of actually
enqueuing the job to redis.
defmodule MyJobTest do
use ExUnit.Case, async: true
import GenQueue.Test
setup do
setup_test_queue(Enqueuer)
end
test "my enqueuer works" do
{:ok, _} = Enqueuer.push(Job)
assert_receive(%GenQueue.Job{module: Job, args: []})
end
endIf your jobs are being enqueued outside of the current process, we can use named processes to recieve the job. This wont be async safe.
import GenQueue.Test
setup do
setup_global_test_queue(Enqueuer, :my_process_name)
end