Skip to content

Commit 4c7abbb

Browse files
authored
Merge pull request #14 from danxexe/feature/job-setup-and-teardown
Add setup and teardown callbacks
2 parents a2cd681 + 0007821 commit 4c7abbb

File tree

4 files changed

+93
-4
lines changed

4 files changed

+93
-4
lines changed

lib/que/job.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ defmodule Que.Job do
5959

6060
{:ok, pid} =
6161
Que.Helpers.do_task(fn ->
62+
job.worker.on_setup(job)
6263
job.worker.perform(job.arguments)
6364
end)
6465

@@ -78,6 +79,7 @@ defmodule Que.Job do
7879

7980
Que.Helpers.do_task(fn ->
8081
job.worker.on_success(job.arguments)
82+
job.worker.on_teardown(job)
8183
end)
8284

8385
%{ job | status: :completed, pid: nil, ref: nil }
@@ -96,6 +98,7 @@ defmodule Que.Job do
9698

9799
Que.Helpers.do_task(fn ->
98100
job.worker.on_failure(job.arguments, error)
101+
job.worker.on_teardown(job)
99102
end)
100103

101104
%{ job | status: :failed, pid: nil, ref: nil }

lib/que/worker.ex

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,15 @@ defmodule Que.Worker do
174174
end
175175

176176

177-
defoverridable [on_success: 1, on_failure: 2]
177+
def on_setup(_job) do
178+
end
179+
180+
181+
def on_teardown(_job) do
182+
end
183+
184+
185+
defoverridable [on_success: 1, on_failure: 2, on_setup: 1, on_teardown: 1]
178186

179187

180188

@@ -232,4 +240,20 @@ defmodule Que.Worker do
232240
"""
233241
@callback on_failure(arguments :: term, error :: tuple) :: term
234242

243+
244+
245+
246+
@doc """
247+
Optional callback that is executed before the job is started.
248+
"""
249+
@callback on_setup(job :: term) :: term
250+
251+
252+
253+
254+
@doc """
255+
Optional callback that is executed after the job finishes,
256+
both on success and failure.
257+
"""
258+
@callback on_teardown(job :: term) :: term
235259
end

test/que/job_test.exs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule Que.Test.Job do
66
alias Que.Test.Meta.TestWorker
77
alias Que.Test.Meta.SuccessWorker
88
alias Que.Test.Meta.FailureWorker
9+
alias Que.Test.Meta.SetupAndTeardownWorker
910

1011

1112
test "#new builds a new Job struct with defaults" do
@@ -56,14 +57,56 @@ defmodule Que.Test.Job do
5657
refute job.pid == nil
5758
refute job.ref == nil
5859

59-
Helpers.wait
60+
Helpers.wait_for_children
6061
end)
6162

6263
assert capture =~ ~r/Starting/
6364
assert capture =~ ~r/perform: nil/
6465
end
6566

6667

68+
test "#perform triggers the worker's on_setup and on_teardown callbacks on success" do
69+
capture = Helpers.capture_log(fn ->
70+
job =
71+
SetupAndTeardownWorker
72+
|> Job.new
73+
|> Job.perform
74+
|> Job.handle_success
75+
76+
assert job.status == :completed
77+
assert job.pid == nil
78+
assert job.ref == nil
79+
80+
Helpers.wait_for_children
81+
end)
82+
83+
assert capture =~ ~r/Completed/
84+
assert capture =~ ~r/on_setup: %Que.Job/
85+
assert capture =~ ~r/on_teardown: %Que.Job/
86+
end
87+
88+
89+
test "#perform triggers the worker's on_setup and on_teardown callbacks on failure" do
90+
capture = Helpers.capture_log(fn ->
91+
job =
92+
SetupAndTeardownWorker
93+
|> Job.new
94+
|> Job.perform
95+
|> Job.handle_failure("some error")
96+
97+
assert job.status == :failed
98+
assert job.pid == nil
99+
assert job.ref == nil
100+
101+
Helpers.wait_for_children
102+
end)
103+
104+
assert capture =~ ~r/Failed/
105+
assert capture =~ ~r/on_setup: %Que.Job/
106+
assert capture =~ ~r/on_teardown: %Que.Job/
107+
end
108+
109+
67110
test "#handle_success works as expected" do
68111
capture = Helpers.capture_log(fn ->
69112
job =
@@ -75,7 +118,7 @@ defmodule Que.Test.Job do
75118
assert job.pid == nil
76119
assert job.ref == nil
77120

78-
Helpers.wait
121+
Helpers.wait_for_children
79122
end)
80123

81124
assert capture =~ ~r/Completed/
@@ -94,7 +137,7 @@ defmodule Que.Test.Job do
94137
assert job.pid == nil
95138
assert job.ref == nil
96139

97-
Helpers.wait
140+
Helpers.wait_for_children
98141
end)
99142

100143
assert capture =~ ~r/Failed/

test/support.ex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ defmodule Que.Test.Meta do
5656
end
5757

5858

59+
defmodule SetupAndTeardownWorker do
60+
use Que.Worker
61+
62+
def perform(args), do: Logger.debug("#{__MODULE__} - perform: #{inspect(args)}")
63+
def on_setup(job), do: Logger.debug("#{__MODULE__} - on_setup: #{inspect(job)}")
64+
def on_teardown(job), do: Logger.debug("#{__MODULE__} - on_teardown: #{inspect(job)}")
65+
end
66+
67+
5968

6069

6170
# Helper Module for Tests
@@ -68,6 +77,16 @@ defmodule Que.Test.Meta do
6877
:timer.sleep(ms)
6978
end
7079

80+
def wait_for_children do
81+
Task.Supervisor.children(Que.TaskSupervisor)
82+
|> Enum.map(&Process.monitor/1)
83+
|> Enum.each(fn ref ->
84+
receive do
85+
{:DOWN, ^ref, _, _, _} -> nil
86+
end
87+
end)
88+
end
89+
7190
# Captures IO output
7291
def capture_io(fun) do
7392
ExUnit.CaptureIO.capture_io(fun)

0 commit comments

Comments
 (0)