Packages
commanded
1.4.7
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.0
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.1
1.0.0-rc.0
0.19.1
0.19.0
0.18.1
0.18.0
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.16.0-rc.1
0.16.0-rc.0
0.15.1
0.15.0
0.14.0
0.14.0-rc.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.5
0.8.4
0.8.3
0.8.1
0.8.0
0.7.1
0.6.2
0.6.1
0.6.0
0.4.0
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
Use Commanded to build your own Elixir applications following the CQRS/ES pattern.
Current section
Files
Jump to
Current section
Files
lib/commanded/middleware/consistency_guarantee.ex
defmodule Commanded.Middleware.ConsistencyGuarantee do
@moduledoc """
An internal `Commanded.Middleware` that blocks after successful command
dispatch until the requested dispatch consistency has been met.
Only applies when the requested consistency is `:strong`. Has no effect for
`:eventual` consistency.
"""
@behaviour Commanded.Middleware
require Logger
alias Commanded.Middleware.Pipeline
alias Commanded.Subscriptions
import Pipeline
def before_dispatch(%Pipeline{} = pipeline) do
Pipeline.assign(pipeline, :dispatcher_pid, self())
end
def after_dispatch(%Pipeline{consistency: :eventual} = pipeline),
do: pipeline
def after_dispatch(%Pipeline{assigns: %{events: []}} = pipeline),
do: pipeline
def after_dispatch(%Pipeline{} = pipeline) do
%Pipeline{
application: application,
consistency: consistency,
assigns: %{
aggregate_uuid: aggregate_uuid,
aggregate_version: aggregate_version,
dispatcher_pid: dispatcher_pid
}
} = pipeline
opts = [consistency: consistency, exclude: dispatcher_pid]
case Subscriptions.wait_for(application, aggregate_uuid, aggregate_version, opts) do
:ok ->
pipeline
{:error, :timeout} ->
Logger.warning(fn ->
"Consistency timeout waiting for aggregate #{inspect(aggregate_uuid)} at version #{inspect(aggregate_version)}"
end)
respond(pipeline, {:error, :consistency_timeout})
end
end
def after_failure(%Pipeline{} = pipeline), do: pipeline
end