sregulator
.
Behaviours: sbroker_handlers.
This module defines the sregulator_valve behaviour.
Required callback functions: init/3, handle_ask/4, handle_done/3, handle_continue/3, handle_update/3, handle_info/3, handle_timeout/2, code_change/4, config_change/3, size/1, open_time/1, terminate/2.
Behaviour for implementing values for sregulator
.
sregulator_valve
behaviour. The first
callback is init/3
, which starts the valve:
-callback init(InternalMap :: internal_map(), Time :: integer(), Args :: any()) -> {Status :: open | closed, State :: any(), TimeoutTime :: integer() | infinity}.
InternalMap
is the internal map of running processes, it is a map()
with
monitor reference()
keys and pid()
value where the monitor is that of the
process.
Time
is the time, in native
time units, of the valve at creation. Some
other callbacks will receive the current time of the valve as the second last
argument. It is monotically increasing, so subsequent calls will have the
same or a greater time.
Args
is the arguments for the valve. It can be any term.
Status
is whether the valve accepts new requests or not. The
handle_ask/4
callback to handle a request will only be called when the
previous callback returns open
.
State
is the state of the queue and used in the next call.
TimeoutTime
represents the next time a valve wishes to call
handle_timeout/2
to change status. If a message is not received the timeout
should occur at or after TimeoutTime
. The time must be greater than or
equal to Time
. If a valve does not require a timeout then TimeoutTime
should be infinity
.
handle_ask/4
:
-callback handle_ask(Ref :: reference(), Pid :: pid(), Time :: integer(), State :: any()) -> {go, Open, Status :: open | closed, NState :: any(), TimeoutTime :: integer() | infinity}.
Ref
is a monitor reference of the sender, Pid
, as in the InternalMap
in init/3
.
Open
is the time the valve opened to allow this request.
The other variables are equivalent to those in init/3
, with NState
being
the new state.
handle_done/3
:
-callback handle_done(Ref :: reference(), Time :: integer(), State :: any()) -> {Result :: done | error, Status :: open | closed, NState :: any(), TimeoutTime :: integer() | infinity}.
Result
is done
when the Ref
is known by the valve and is removed, if
Ref
is not found in the valve it is error
.
The other variables are equivalent to those in handle_ask/4
.
When a request is asking to continue, handle_continue/3
:
-callback handle_continue(Ref :: reference(), Time :: integer(),
State :: any()) ->
{Result :: go, Open :: integer(), , Status :: open | closed,
NState :: any(), TimeoutTime :: integer() | infinity} |
{Result :: done | error, Status :: open | closed, NState :: any(),
TimeoutTime :: integer() | infinity}.
'''
Result
is go
if Ref
is known by the valve and is allowed to
continue, if Ref
is removed from the valve it is done
and if Ref
is not
found in the valve it is error
.
The other variables are equivalent to those in handle_ask/3
.
handle_info/3
:
-callback handle_info(Msg :: any(), Time :: integer(), State :: any()) -> {Status :: open | closed, NState :: any(), TimeoutTime :: integer() | infinity}.
Msg
is the message, and may be intended for another callback.
The other variables are equivalent to those in init/3
, with NState
being
the new state.
handle_timeout/2
:
-callback handle_timeout(Time :: integer(), State :: any()) -> {Status :: open | closed, NState :: any(), TimeoutTime :: integer() | infinity}.
The variables are equivalent to those in init/3
, with NState
being the
new state.
code_change/4
:
-callback code_change(OldVsn :: any(), Time :: integer(), State :: any(), Extra :: any()) -> {NState :: any(), TimeoutTime :: integer() | infinity}.
On an upgrade OldVsn
is version the state was created with and on an
downgrade is the same form except {down, OldVsn}
. OldVsn
is defined by
the vsn attribute(s) of the old version of the callback module. If no such
attribute is defined, the version is the checksum of the BEAM file. Extra
is from {advanced, Extra}
in the update instructions.
The other variables are equivalent to those in init/3
, with NState
being
the new state.
config_change/4
:
-callback config_change(Args :: any(), Time :: integer(), State :: any()) -> {Status :: open | closed, NState :: any(), TimeoutTime :: integer() | infinity}.
The variables are equivalent to those in init/3
, with NState
being the
new state.
size/1
:
-callback size(State :: any()) -> Size :: non_neg_integer().
State
is the current state of the valve and Size
is the number of tasks
being monitorred. This callback must be idempotent and not change the status
of the valve.
open_time/1
:
-callback open_time(State :: any()) -> OpenTime :: integer() | closed.
State
is the current state of the valve and OpenTime
is the open time of
the valve, if closed and will not open without a side effect then closed
.
terminate/2
:
-callback terminate(Reason :: sbroker_handlers:reason(), State :: any()) -> InternalMap :: internal_map().
Reason
is stop
if the valve is being shutdown, change
if the valve is
being replaced by another valve, {bad_return_value, Return}
if a previous
callback returned an invalid term or {Class, Reason, Stack}
if a previous
callback raised an exception.
State
is the current state of the valve.
InternalMap
is the same as init/3
and is passed to the next valve if
Reason
is change
.
terminate/2
should do any clean up required.
internal_map() = #{reference() => pid()}
Generated by EDoc, Sep 29 2016, 17:17:28.