Copyright © 2011-2020 Michael Truog
Version: 2.0.1 Nov 26 2020 15:50:57 ------------------------------------------------------------------------
This module defines the cloudi_service behaviour.
Required callback functions: cloudi_service_init/4, cloudi_service_terminate/3.
Optional callback functions: cloudi_service_handle_request/11, cloudi_service_handle_info/3.
Authors: Michael Truog (mjtruog at protonmail dot com).
The user module should export: cloudi_service_init(Args, Prefix, Timeout, Dispatcher) ==> {ok, State} {stop, Reason} {stop, Reason, State} State = undefined, if not returned Reason = restart | shutdown | Term, terminate(State) is called cloudi_service_handle_request(RequestType, Name, Pattern, RequestInfo, Request, Timeout, Priority, TransId, Pid, State, Dispatcher) ==> {reply, Response, NewState} {reply, ResponseInfo, Response, NewState} {forward, NextName, NextRequestInfo, NextRequest, NewState} {forward, NextName, NextRequestInfo, NextRequest, NextTimeout, NextPriority, NewState} {noreply, NewState} {stop, Reason, NewState} Reason = restart | shutdown | Term, terminate(State) is called cloudi_service_handle_info(Request, State, Dispatcher) ==> {noreply, State} {stop, Reason, NewState} Reason = restart | shutdown | Term, terminate(State) is called cloudi_service_terminate(Reason, Timeout, State) Let the user module clean up always called when the service terminates ==> ok The work flow (of the service) can be described as follows: User module Generic ----------- ------- cloudi_service_init <----- . loop cloudi_service_handle_request <----- . -----> reply cloudi_service_handle_info <----- . cloudi_service_terminate <----- .
dispatcher() = pid()
error_reason() = timeout
key_values() = cloudi_key_value:key_values()
key_values(Key, Value) = cloudi_key_value:key_values(Key, Value)
pattern_pid() = cloudi:pattern_pid()
priority() = cloudi:priority()
priority_value() = cloudi:priority_value()
request() = cloudi:request()
request_info() = cloudi:request_info()
request_result() = {reply, ResponseInfo::response_info(), Response::response()} | {forward, NextName::service_name(), NextRequestInfo::request_info(), NextRequest::request(), NextTimeout::timeout_value_milliseconds(), NextPriority::priority_value()} | noreply
request_type() = send_async | send_sync
response() = cloudi:response()
response_info() = cloudi:response_info()
service_name() = cloudi:service_name()
service_name_pattern() = cloudi:service_name_pattern()
service_name_pattern_suffix() = cloudi:service_name_pattern_suffix()
source() = pid()
timeout_milliseconds() = cloudi:timeout_milliseconds()
timeout_value_milliseconds() = cloudi:timeout_value_milliseconds()
trans_id() = cloudi:trans_id()
version 1 UUID
context_options(Dispatcher::dispatcher()) -> cloudi:options()
demonitor(Dispatcher::dispatcher(), MonitorRef::reference()) -> true
demonitor(Dispatcher::dispatcher(), MonitorRef::reference(), Options::list()) -> true
destination_refresh_immediate(Dispatcher::dispatcher()) -> boolean()
destination_refresh_lazy(Dispatcher::dispatcher()) -> boolean()
dispatcher(Dispatcher::dispatcher()) -> NewDispatcher::pid()
duo_mode(Dispatcher::dispatcher()) -> boolean()
forward(Dispatcher::dispatcher(), RequestType::request_type(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_value_milliseconds(), Priority::priority(), TransId::trans_id(), Pid::pid()) -> no_return()
forward_async(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_value_milliseconds(), Priority::priority(), TransId::trans_id(), Pid::pid()) -> no_return()
forward_sync(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_value_milliseconds(), Priority::priority(), TransId::trans_id(), Pid::pid()) -> no_return()
get_pid(Dispatcher::dispatcher(), Name::service_name()) -> {ok, PatternPid::pattern_pid()} | {error, Reason::error_reason()}
get_pid(Dispatcher::dispatcher(), Name::service_name(), Timeout::timeout_milliseconds()) -> {ok, PatternPid::pattern_pid()} | {error, Reason::error_reason()}
get_pids(Dispatcher::dispatcher(), Name::service_name()) -> {ok, PatternPids::[pattern_pid(), ...]} | {error, Reason::error_reason()}
get_pids(Dispatcher::dispatcher(), Name::service_name(), Timeout::timeout_milliseconds()) -> {ok, PatternPids::[pattern_pid(), ...]} | {error, Reason::error_reason()}
mcast_async(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
mcast_async(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
mcast_async(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
mcast_async_active(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
mcast_async_active(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
mcast_async_active(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
mcast_async_passive(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
mcast_async_passive(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
mcast_async_passive(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, TransIdList::[trans_id()]} | {error, Reason::error_reason()}
monitor(Dispatcher::dispatcher(), Pid::pid()) -> MonitorRef::reference()
prefix(Dispatcher::dispatcher()) -> Prefix::service_name_pattern()
priority_default(Dispatcher::dispatcher()) -> PriorityDefault::cloudi_service_api:priority()
process_count(Dispatcher::dispatcher()) -> ProcessCount::pos_integer()
process_count_max(Dispatcher::dispatcher()) -> ProcessCountMax::pos_integer()
process_count_min(Dispatcher::dispatcher()) -> ProcessCountMin::pos_integer()
process_index(Dispatcher::dispatcher()) -> ProcessIndex::non_neg_integer()
recv_async(Dispatcher::dispatcher()) -> {ok, ResponseInfo::response_info(), Response::response(), TransId::trans_id()} | {error, Reason::error_reason()}
recv_async(Dispatcher::dispatcher(), TransId::timeout_milliseconds() | trans_id()) -> {ok, ResponseInfo::response_info(), Response::response(), TransId::trans_id()} | {error, Reason::error_reason()}
recv_async(Dispatcher::dispatcher(), Timeout::timeout_milliseconds() | trans_id(), TransId::trans_id() | boolean()) -> {ok, ResponseInfo::response_info(), Response::response(), TransId::trans_id()} | {error, Reason::error_reason()}
recv_async(Dispatcher::dispatcher(), Timeout::timeout_milliseconds(), TransId::trans_id(), Consume::boolean()) -> {ok, ResponseInfo::response_info(), Response::response(), TransId::trans_id()} | {error, Reason::error_reason()}
recv_asyncs(Dispatcher::dispatcher(), TransIdList::[trans_id()]) -> {ok, [{ResponseInfo::response_info(), Response::response(), TransId::trans_id()}]} | {error, Reason::error_reason()}
recv_asyncs(Dispatcher::dispatcher(), Timeout::timeout_milliseconds(), TransIdList::[trans_id()]) -> {ok, [{ResponseInfo::response_info(), Response::response(), TransId::trans_id()}]} | {error, Reason::error_reason()}
recv_asyncs(Dispatcher::dispatcher(), Timeout::timeout_milliseconds(), TransIdList::[trans_id()], Consume::boolean()) -> {ok, [{ResponseInfo::response_info(), Response::response(), TransId::trans_id()}]} | {error, Reason::error_reason()}
return(Dispatcher::dispatcher(), Response::response()) -> no_return()
return(Dispatcher::dispatcher(), ResponseInfo::response_info(), Response::response()) -> no_return()
return(Dispatcher::dispatcher(), RequestType::request_type(), Name::service_name(), Pattern::service_name_pattern(), ResponseInfo::response_info(), Response::response(), Timeout::timeout_value_milliseconds(), TransId::trans_id(), Pid::pid()) -> no_return()
return_async(Dispatcher::dispatcher(), Name::service_name(), Pattern::service_name_pattern(), ResponseInfo::response_info(), Response::response(), Timeout::timeout_value_milliseconds(), TransId::trans_id(), Pid::pid()) -> no_return()
return_nothrow(Dispatcher::dispatcher(), RequestType::request_type(), Name::service_name(), Pattern::service_name_pattern(), ResponseInfo::response_info(), Response::response(), Timeout::timeout_value_milliseconds(), TransId::trans_id(), Pid::pid()) -> ok
return_sync(Dispatcher::dispatcher(), Name::service_name(), Pattern::service_name_pattern(), ResponseInfo::response_info(), Response::response(), Timeout::timeout_value_milliseconds(), TransId::trans_id(), Pid::pid()) -> no_return()
self(Dispatcher::dispatcher()) -> Self::source()
send_async(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds(), PatternPid::pattern_pid() | undefined) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority(), PatternPid::pattern_pid() | undefined) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async_active(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
send_async_active(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
send_async_active(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds(), PatternPid::pattern_pid() | undefined) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
send_async_active(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
send_async_active(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority(), PatternPid::pattern_pid() | undefined) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
send_async_active(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority(), TransId::trans_id(), PatternPid::pattern_pid()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
{return_async_active, Name, Pattern, ResponseInfo, Response, Timeout, TransId}
(or)
{timeout_async_active, TransId}
use -include_lib("cloudi_core/include/cloudi_service.hrl").
to have:
#return_async_active{}
(or) #timeout_async_active{}
send_async_passive(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async_passive(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async_passive(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds(), PatternPid::pattern_pid() | undefined) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async_passive(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_async_passive(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority(), PatternPid::pattern_pid() | undefined) -> {ok, TransId::trans_id()} | {error, Reason::error_reason()}
send_sync(Dispatcher::dispatcher(), Name::service_name(), Request::request()) -> {ok, ResponseInfo::response_info(), Response::response()} | {ok, Response::response()} | {error, Reason::error_reason()}
send_sync(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds()) -> {ok, ResponseInfo::response_info(), Response::response()} | {ok, Response::response()} | {error, Reason::error_reason()}
send_sync(Dispatcher::dispatcher(), Name::service_name(), Request::request(), Timeout::timeout_milliseconds(), PatternPid::pattern_pid() | undefined) -> {ok, ResponseInfo::response_info(), Response::response()} | {ok, Response::response()} | {error, Reason::error_reason()}
send_sync(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority()) -> {ok, ResponseInfo::response_info(), Response::response()} | {ok, Response::response()} | {error, Reason::error_reason()}
send_sync(Dispatcher::dispatcher(), Name::service_name(), RequestInfo::request_info(), Request::request(), Timeout::timeout_milliseconds(), Priority::priority(), PatternPid::pattern_pid() | undefined) -> {ok, ResponseInfo::response_info(), Response::response()} | {ok, Response::response()} | {error, Reason::error_reason()}
source_subscriptions(Dispatcher::dispatcher(), Pid::source()) -> [service_name_pattern()]
The source pid can be found at:
cloudi_service_handle_request(_, _, _, _, _, _, _, _, Pid, _, _)
subscribe(Dispatcher::dispatcher(), Pattern::service_name_pattern_suffix()) -> ok | error
subscribe_count(Dispatcher::dispatcher(), Pattern::service_name_pattern_suffix()) -> non_neg_integer()
suffix(Dispatcher::dispatcher(), NameOrPattern::service_name() | service_name_pattern()) -> Suffix::service_name() | service_name_pattern()
timeout_async(Dispatcher::dispatcher()) -> TimeoutAsync::cloudi_service_api:timeout_send_async_value_milliseconds()
timeout_max(Dispatcher::dispatcher()) -> 4294967295
timeout_sync(Dispatcher::dispatcher()) -> TimeoutSync::cloudi_service_api:timeout_send_sync_value_milliseconds()
trans_id(Dispatcher::dispatcher()) -> trans_id()
unsubscribe(Dispatcher::dispatcher(), Pattern::service_name_pattern_suffix()) -> ok | error
Generated by EDoc