SObjectizer-5 Extra
Loading...
Searching...
No Matches
time_limited_delivery.hpp
Go to the documentation of this file.
1/*!
2 * \file
3 * \brief An implementation of time_limited_delivery envelope.
4 *
5 * \since
6 * v.1.2.0
7 */
8
9#pragma once
10
11#include <so_5_extra/enveloped_msg/just_envelope.hpp>
12
13#include <chrono>
14
15namespace so_5 {
16
17namespace extra {
18
19namespace enveloped_msg {
20
21//
22// time_limited_delivery_t
23//
24/*!
25 * \brief A special envelope to perform time-limited delivery.
26 *
27 * This envelope checks the current time before processing/transformation
28 * of the enveloped message. If the current time is equal or greater than
29 * the specified deadline then message won't be processed/transformed.
30 *
31 * Usage example:
32 * \code
33 * namespace msg_ns = so_5::extra::enveloped_msg;
34 *
35 * // Use time_limited_delivery_t with wallclock deadline.
36 * msg_ns::make<my_message>(...)
37 * .envelope<msg_ns::time_limited_delivery_t>(
38 * // Limit lifetime of the message by 5 seconds from now.
39 * std::chrono::steady_clock::now() + 5s)
40 * .send_to(destination);
41 *
42 * // The same thing but less verbose:
43 * msg_ns::make<my_message>(...)
44 * .envelope<msg_ns::time_limited_delivery_t>(
45 * // Limit lifetime of the message by 5 seconds from now.
46 * 5s)
47 * .send_to(destination);
48 * \endcode
49 *
50 * \since
51 * v.1.2.0
52 */
53class time_limited_delivery_t final : public just_envelope_t
54 {
55 //! Delivery deadline.
57
58 public :
59 //! Initializing constructor.
60 /*!
61 * Receives wallclock time as deadline.
62 */
64 //! Message to be delivered.
65 message_ref_t message,
66 //! Delivery deadline.
67 std::chrono::steady_clock::time_point deadline )
70 {}
71
72 //! Initializing constructor.
73 /*!
74 * Receives time interval. Deadline will be calculated automatically
75 * from the current time.
76 */
78 //! Message to be delivered.
79 message_ref_t message,
80 //! Time interval for calculation of deadline value.
81 std::chrono::steady_clock::duration deadline )
85 {}
86
87 // Implementation of inherited methods.
88 void
90 access_context_t /*context*/,
91 handler_invoker_t & invoker ) noexcept override
92 {
93 if( m_deadline > std::chrono::steady_clock::now() )
94 invoker.invoke( whole_payload() );
95 }
96 };
97
98} /* namespace enveloped_msg */
99
100} /* namespace extra */
101
102} /* namespace so_5 */
A very simple implementation of envelope which do nothing except holding a payload.
void access_hook(access_context_t, handler_invoker_t &invoker) noexcept override
const std::chrono::steady_clock::time_point m_deadline
Delivery deadline.
time_limited_delivery_t(message_ref_t message, std::chrono::steady_clock::time_point deadline)
Initializing constructor.
Ranges for error codes of each submodules.
Definition details.hpp:13