Loading...
Searching...
No Matches
server_direct.cpp

A variant of the server part of a request-response example that accepts incoming connections and does not need an intermediary.

A variant of the server part of a request-response example that accepts incoming connections and does not need an intermediary. Much like the original server, it receives incoming requests, converts the body to uppercase and sends the result back to the indicated reply address. Can be used in conjunction with any of the client alternatives.

/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include "options.hpp"
#include <proton/container.hpp>
#include <proton/listen_handler.hpp>
#include <proton/listener.hpp>
#include <proton/message.hpp>
#include <proton/message_id.hpp>
#include <proton/messaging_handler.hpp>
#include <proton/sender.hpp>
#include <proton/sender_options.hpp>
#include <proton/source_options.hpp>
#include <proton/tracker.hpp>
#include <iostream>
#include <map>
#include <string>
#include <sstream>
#include <cctype>
class server : public proton::messaging_handler {
private:
class listener_ready_handler : public proton::listen_handler {
void on_open(proton::listener& l) override {
std::cout << "listening on " << l.port() << std::endl;
}
};
typedef std::map<std::string, proton::sender> sender_map;
listener_ready_handler listen_handler;
std::string url;
sender_map senders;
int address_counter;
public:
server(const std::string &u) : url(u), address_counter(0) {}
void on_container_start(proton::container &c) override {
c.listen(url, listen_handler);
}
std::string to_upper(const std::string &s) {
std::string uc(s);
size_t l = uc.size();
for (size_t i=0; i<l; i++)
uc[i] = static_cast<char>(std::toupper(uc[i]));
return uc;
}
std::string generate_address() {
std::ostringstream addr;
addr << "server" << address_counter++;
return addr.str();
}
void on_sender_open(proton::sender &sender) override {
if (sender.source().dynamic()) {
std::string addr = generate_address();
sender.open(proton::sender_options().source(proton::source_options().address(addr)));
senders[addr] = sender;
}
}
void on_message(proton::delivery &, proton::message &m) override {
std::cout << "Received " << m.body() << std::endl;
std::string reply_to = m.reply_to();
sender_map::iterator it = senders.find(reply_to);
if (it == senders.end()) {
std::cout << "No link for reply_to: " << reply_to << std::endl;
} else {
proton::sender sender = it->second;
proton::message reply;
reply.to(reply_to);
reply.body(to_upper(proton::get<std::string>(m.body())));
reply.correlation_id(m.correlation_id());
sender.send(reply);
}
}
};
int main(int argc, char **argv) {
std::string address("amqp://127.0.0.1:5672/examples");
example::options opts(argc, argv);
opts.add_value(address, 'a', "address", "listen on URL", "URL");
try {
opts.parse();
server srv(address);
proton::container(srv).run();
return 0;
} catch (const example::bad_option& e) {
std::cout << opts << std::endl << e.what() << std::endl;
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 1;
}
proton::container
A top-level container of connections, sessions, and links.
Definition container.hpp:49
proton::container::run
void run()
Run the container in the current thread.
proton::container::listen
listener listen(const std::string &listen_url, listen_handler &handler)
Listen for new connections on listen_url.
proton::delivery
A received message.
Definition delivery.hpp:40
proton::listen_handler
Unsettled API - A handler for incoming connections.
Definition listen_handler.hpp:39
proton::listener
A listener for incoming connections.
Definition listener.hpp:33
proton::listener::port
int port()
Unsettedled API
proton::map
A collection of key-value pairs.
Definition map.hpp:69
proton::message
An AMQP message.
Definition message.hpp:48
proton::message::to
void to(const std::string &)
Set the destination address.
proton::message::reply_to
void reply_to(const std::string &)
Set the address for replies.
proton::message::correlation_id
void correlation_id(const message_id &)
Set the ID for matching related messages.
proton::message::body
void body(const value &x)
Set the body. Equivalent to body() = x.
proton::messaging_handler
Handler for Proton messaging events.
Definition messaging_handler.hpp:69
proton::messaging_handler::on_message
virtual void on_message(delivery &, message &)
A message is received.
proton::messaging_handler::on_container_start
virtual void on_container_start(container &)
The container event loop is starting.
proton::messaging_handler::on_sender_open
virtual void on_sender_open(sender &)
The remote peer opened the link.
proton::sender_options
Options for creating a sender.
Definition sender_options.hpp:60
proton::sender
A channel for sending messages.
Definition sender.hpp:40
proton::sender::send
tracker send(const message &m)
Send a message on the sender.
proton::sender::source
class source source() const
Get the source node.
proton::sender::open
void open()
Open the sender.
proton::source_options
Options for creating a source node for a sender or receiver.
Definition source_options.hpp:46
container.hpp
A top-level container of connections, sessions, and links.
listen_handler.hpp
Unsettled API - A handler for incoming connections.
listener.hpp
A listener for incoming connections.
message.hpp
An AMQP message.
message_id.hpp
An AMQP message ID.
messaging_handler.hpp
Handler for Proton messaging events.
sender.hpp
A channel for sending messages.
sender_options.hpp
Options for creating a sender.
source_options.hpp
Options for creating a source node for a sender or receiver.
tracker.hpp
A tracker for a sent message.