mirror of https://github.com/apache/kafka.git
101 lines
2.2 KiB
C++
101 lines
2.2 KiB
C++
/*
|
|
* producer.cpp
|
|
*
|
|
* Created on: 21 Jun 2011
|
|
* Author: Ben Gray (@benjamg)
|
|
*/
|
|
|
|
#include <boost/lexical_cast.hpp>
|
|
|
|
#include "producer.hpp"
|
|
|
|
namespace kafkaconnect {
|
|
|
|
producer::producer(boost::asio::io_service& io_service, const error_handler_function& error_handler)
|
|
: _connected(false)
|
|
, _resolver(io_service)
|
|
, _socket(io_service)
|
|
, _error_handler(error_handler)
|
|
{
|
|
}
|
|
|
|
producer::~producer()
|
|
{
|
|
close();
|
|
}
|
|
|
|
void producer::connect(const std::string& hostname, const uint16_t port)
|
|
{
|
|
connect(hostname, boost::lexical_cast<std::string>(port));
|
|
}
|
|
|
|
void producer::connect(const std::string& hostname, const std::string& servicename)
|
|
{
|
|
boost::asio::ip::tcp::resolver::query query(hostname, servicename);
|
|
_resolver.async_resolve(
|
|
query,
|
|
boost::bind(
|
|
&producer::handle_resolve, this,
|
|
boost::asio::placeholders::error, boost::asio::placeholders::iterator
|
|
)
|
|
);
|
|
}
|
|
|
|
void producer::close()
|
|
{
|
|
_connected = false;
|
|
_socket.close();
|
|
}
|
|
|
|
bool producer::is_connected() const
|
|
{
|
|
return _connected;
|
|
}
|
|
|
|
|
|
void producer::handle_resolve(const boost::system::error_code& error_code, boost::asio::ip::tcp::resolver::iterator endpoints)
|
|
{
|
|
if (!error_code)
|
|
{
|
|
boost::asio::ip::tcp::endpoint endpoint = *endpoints;
|
|
_socket.async_connect(
|
|
endpoint,
|
|
boost::bind(
|
|
&producer::handle_connect, this,
|
|
boost::asio::placeholders::error, ++endpoints
|
|
)
|
|
);
|
|
}
|
|
else { fail_fast_error_handler(error_code); }
|
|
}
|
|
|
|
void producer::handle_connect(const boost::system::error_code& error_code, boost::asio::ip::tcp::resolver::iterator endpoints)
|
|
{
|
|
if (!error_code)
|
|
{
|
|
// The connection was successful. Send the request.
|
|
_connected = true;
|
|
}
|
|
else if (endpoints != boost::asio::ip::tcp::resolver::iterator())
|
|
{
|
|
// TODO: handle connection error (we might not need this as we have others though?)
|
|
|
|
// The connection failed, but we have more potential endpoints so throw it back to handle resolve
|
|
_socket.close();
|
|
handle_resolve(boost::system::error_code(), endpoints);
|
|
}
|
|
else { fail_fast_error_handler(error_code); }
|
|
}
|
|
|
|
void producer::handle_write_request(const boost::system::error_code& error_code, boost::asio::streambuf* buffer)
|
|
{
|
|
if (error_code)
|
|
{
|
|
fail_fast_error_handler(error_code);
|
|
}
|
|
|
|
delete buffer;
|
|
}
|
|
|
|
}
|