Request / Response applications use the reply-to property, described in Table 2.8, “Mapping to AMQP 0-10 Message Properties”, to allow a server to respond to the client that sent a message. A server sets up a service queue, with a name known to clients. A client creates a private queue for the server's response, creates a message for a request, sets the request's reply-to property to the address of the client's response queue, and sends the request to the service queue. The server sends the response to the address specified in the request's reply-to property.
Example 2.13. Request / Response Applications in C++
This example shows the C++ code for a client and server that use the request / response pattern.
The server creates a service queue and waits for a message to arrive. If it receives a message, it sends a message back to the sender.
Receiver receiver = session.createReceiver("service_queue; {create: always}"); Message request = receiver.fetch(); const Address& address = request.getReplyTo(); // Get "reply-to" from request ... if (address) { Sender sender = session.createSender(address); // ... send response to "reply-to" Message response("pong!"); sender.send(response); session.acknowledge(); }
The client creates a sender for the service queue, and
also creates a response queue that is deleted when the
client closes the receiver for the response queue. In the C++
client, if the address starts with the character
#
, it is given a unique name.
Sender sender = session.createSender("service_queue"); Address responseQueue("#response-queue; {create:always, delete:always}"); Receiver receiver = session.createReceiver(responseQueue); Message request; request.setReplyTo(responseQueue); request.setContent("ping"); sender.send(request); Message response = receiver.fetch(); std::cout << request.getContent() << " -> " << response.getContent() << std::endl;
The client sends the string ping
to
the server. The server sends the response
pong
back to the same client, using the
replyTo
property.