Chapter 9. Message delivery
9.1. Sending messages
To send a message, override the on_sendable
event handler and call the sender::send()
method. The sendable
event fires when the proton::sender
has enough credit to send at least one message.
Example: Sending messages
struct example_handler : public proton::messaging_handler { void on_container_start(proton::container& cont) override { proton::connection conn = cont.connect("amqp://example.com"); conn.open_sender("jobs"); } void on_sendable(proton::sender& snd) override { proton::message msg {"job-1"}; snd.send(msg); } };
9.2. Tracking sent messages
When a message is sent, the sender can keep a reference to the tracker
object representing the transfer. The receiver accepts or rejects each message that is delivered. The sender is notified of the outcome for each tracked delivery.
To monitor the outcome of a sent message, override the on_tracker_accept
and on_tracker_reject
event handlers and map the delivery state update to the tracker returned from send()
.
Example: Tracking sent messages
void on_sendable(proton::sender& snd) override { proton::message msg {"job-1"}; proton::tracker trk = snd.send(msg); } void on_tracker_accept(proton::tracker& trk) override { std::cout << "Delivery for " << trk << " is accepted\n"; } void on_tracker_reject(proton::tracker& trk) override { std::cout << "Delivery for " << trk << " is rejected\n"; }
9.3. Receiving messages
To receive messages, create a receiver and override the on_message
event handler.
Example: Receiving messages
struct example_handler : public proton::messaging_handler { void on_container_start(proton::container& cont) override { proton::connection conn = cont.connect("amqp://example.com"); conn.open_receiver("jobs"); } void on_message(proton::delivery& dlv, proton::message& msg) override { std::cout << "Received message '" << msg.body() << "'\n"; } };
9.4. Acknowledging received messages
To explicitly accept or reject a delivery, use the delivery::accept()
or delivery::reject()
methods in the on_message
event handler.
Example: Acknowledging received messages
void on_message(proton::delivery& dlv, proton::message& msg) override { try { process_message(msg); dlv.accept(); } catch (std::exception& e) { dlv.reject(); } }
By default, if you do not explicity acknowledge a delivery, then the library accepts it after on_message
returns. To disable this behavior, set the auto_accept
receiver option to false.