2
3
6
7
8
9
10
12#include <so_5/message_limit.hpp>
14#include <so_5/impl/message_limit_action_msg_tracer.hpp>
15#include <so_5/impl/enveloped_msg_details.hpp>
17#include <so_5/environment.hpp>
18#include <so_5/enveloped_msg.hpp>
20#include <so_5/error_logger.hpp>
21#include <so_5/ret_code.hpp>
24#include <so_5/details/abort_on_fatal_error.hpp>
53 SO_5_LOG_ERROR( ctx.m_receiver.so_environment().error_logger(), logger )
55 <<
"message limit exceeded, application will be aborted. "
56 <<
" msg_type: " << ctx.m_msg_type.name()
57 <<
", limit: " << ctx.m_limit.m_limit
58 <<
", agent: " << &(ctx.m_receiver)
76 ctx.m_receiver.so_environment().error_logger(),
78 logger <<
"maximum message redirection deep exceeded on "
79 "overlimit redirect_reaction; message will be ignored; "
80 <<
" msg_type: " << ctx.m_msg_type.name()
81 <<
", limit: " << ctx.m_limit.m_limit
82 <<
", agent: " << &(ctx.m_receiver)
83 <<
", target_mbox: " << to->query_name();
96 to->do_deliver_message(
97 message_delivery_mode_t::nonblocking,
100 ctx.m_reaction_deep + 1 );
109 const std::type_index & msg_type,
110 const message_ref_t & message )
119 ctx.m_receiver.so_environment().error_logger(),
121 logger <<
"maximum message redirection deep exceeded on "
122 "overlimit transform_reaction; message will be ignored;"
123 <<
" original_msg_type: " << ctx.m_msg_type.name()
124 <<
", limit: " << ctx.m_limit.m_limit
125 <<
", agent: " << &(ctx.m_receiver)
126 <<
", result_msg_type: " << msg_type.name()
127 <<
", target_mbox: " << to->query_name();
131 if( ctx.m_msg_tracer )
132 ctx.m_msg_tracer->reaction_transform(
142 to->do_deliver_message(
143 message_delivery_mode_t::nonblocking,
146 ctx.m_reaction_deep + 1 );
virtual void reaction_redirect_message(const agent_t *subscriber, const mbox_t &target) const noexcept=0
Message will be redirected to another mbox.
virtual void reaction_abort_app(const agent_t *subscriber) const noexcept=0
Application will be aborted as result of overlimit.
virtual void reaction_drop_message(const agent_t *subscriber) const noexcept=0
Message will be dropped as result of overlimit.
#define SO_5_LOG_ERROR(logger, var_name)
A special macro for helping error logging.
Some reusable and low-level classes/functions which can be used in public header files.
Internal implementation of message limits related stuff.
SO_5_FUNC void redirect_reaction(const overlimit_context_t &ctx, const mbox_t &to)
Actual implementation of redirect message reaction.
SO_5_FUNC void abort_app_reaction(const overlimit_context_t &ctx)
Actual implementation of abort application reaction.
SO_5_FUNC void drop_message_reaction(const overlimit_context_t &ctx)
Actual implementation of drop message reaction.
SO_5_FUNC void transform_reaction(const overlimit_context_t &ctx, const mbox_t &to, const std::type_index &msg_type, const message_ref_t &message)
Actual implementation of transform reaction.
All stuff related to message limits.
Private part of message limit implementation.
constexpr unsigned int max_redirection_deep
Maximum deep of message redirections.
Description of context for overlimit action.
const unsigned int m_reaction_deep
The current deep of overlimit reaction recursion.
const agent_t & m_receiver
Receiver of the message (or enveloped message).
const impl::action_msg_tracer_t * m_msg_tracer
An optional pointer to tracer object for message delivery tracing.