evoq_error_handler behaviour (evoq v1.8.1)
View SourceError handler behavior for evoq.
Defines how to handle errors during event processing. Supports multiple strategies: retry, skip, stop, dead_letter.
Error Actions
- retry: Retry immediately - {retry, DelayMs}: Retry after delay - skip: Skip this event and continue - stop: Stop the handler - {dead_letter, Reason}: Send to dead letter queue
Default Behavior
Without implementing on_error/4, handlers use exponential backoff with max 5 retries, then dead letter.
Summary
Functions
Get the default error action based on retry count.
Handle an error using the handler's error strategy.
Check if we should retry based on the failure context.
Types
-type error_action() :: retry | {retry, DelayMs :: pos_integer()} | skip | stop | {dead_letter, Reason :: term()}.
Callbacks
-callback backoff_ms(AttemptNumber :: pos_integer()) -> pos_integer().
-callback max_retries() -> pos_integer().
-callback on_error(Error :: term(), Event :: map(), FailureContext :: #evoq_failure_context{handler_module :: atom(), event :: map(), error :: term(), attempt_number :: pos_integer(), first_failure_at :: integer(), last_failure_at :: integer(), stacktrace :: list()}, State :: term()) -> error_action().
Functions
-spec default_action(atom(), #evoq_failure_context{handler_module :: atom(), event :: map(), error :: term(), attempt_number :: pos_integer(), first_failure_at :: integer(), last_failure_at :: integer(), stacktrace :: list()}) -> {dead_letter, max_retries_exceeded} | {retry, pos_integer()}.
Get the default error action based on retry count.
-spec handle_error(atom(), term(), map(), #evoq_failure_context{handler_module :: atom(), event :: map(), error :: term(), attempt_number :: pos_integer(), first_failure_at :: integer(), last_failure_at :: integer(), stacktrace :: list()}, term()) -> error_action().
Handle an error using the handler's error strategy.
-spec should_retry(atom(), #evoq_failure_context{handler_module :: atom(), event :: map(), error :: term(), attempt_number :: pos_integer(), first_failure_at :: integer(), last_failure_at :: integer(), stacktrace :: list()}) -> boolean().
Check if we should retry based on the failure context.