#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <csignal>
#include <cstring>
#include <thread>
#if _AIX
#include <unistd.h>
#endif
#include <librdkafka/rdkafkacpp.h>
static volatile sig_atomic_t run = 1;
static void sigterm (int sig)
{
run = 0;
}
class ExampleDeliveryReportCb : public RdKafka::DeliveryReportCb
{
public:
void dr_cb (RdKafka::Message &message)
{
if (message.err())
std::cerr << "% Message delivery failed: " << message.errstr() << std::endl;
else
std::cerr << "% Message delivered to topic " << message.topic_name() <<"[" << message.partition() << "] at offset " <<
message.offset() << std::endl;
}
};
RdKafka::Producer *producer= nullptr;
std::string topic;
void test_produce()
{
for (std::string line; run && std::getline(std::cin, line);)
{
if (line.empty())
{
producer->poll(0);
continue;
}
retry:
RdKafka::ErrorCode err =
producer->produce(topic,RdKafka::Topic::PARTITION_UA,RdKafka::Producer::RK_MSG_COPY ,const_cast<char *>(line.c_str()), line.size(),NULL, 0,0,NULL,NULL);
if (err != RdKafka::ERR_NO_ERROR)
{
std::cerr << "% Failed to produce to topic " << topic << ": " << RdKafka::err2str(err) << std::endl;
if (err == RdKafka::ERR__QUEUE_FULL)
{
producer->poll(1000/*block for max 1000ms*/);
goto retry;
}
}
else
{
std::cerr << "% Enqueued message (" << line.size() << " bytes) " << "for topic " << topic << std::endl;
}
producer->poll(0);
}
}
int main (int argc, char **argv)
{
if (argc != 3)
{
std::cerr << "Usage: " << argv[0] << " <brokers> <topic>\n";
exit(1);
}
std::string brokers = argv[1];
topic = argv[2];
RdKafka::Conf *conf_p = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
std::string errstr;
if (conf_p->set("bootstrap.servers", brokers, errstr) !=RdKafka::Conf::CONF_OK)
{
std::cerr << errstr << std::endl;
exit(1);
}
signal(SIGINT, sigterm);
signal(SIGTERM, sigterm);
ExampleDeliveryReportCb ex_dr_cb;
if (conf_p->set("dr_cb", &ex_dr_cb, errstr) != RdKafka::Conf::CONF_OK)
{
std::cerr << errstr << std::endl;
exit(1);
}
producer = RdKafka::Producer::create(conf_p, errstr);
if (!producer)
{
std::cerr << "Failed to create producer: " << errstr << std::endl;
exit(1);
}
delete conf_p;
std::cout << "Type message value and hit enter to produce message." << std::endl;
std::thread t (test_produce);
t.join();
std::cerr << "% Flushing final messages..." << std::endl;
producer->flush(10*1000 /* wait for max 10 seconds */);
if (producer->outq_len() > 0)
std::cerr << "% " << producer->outq_len() <<" message(s) were not delivered" << std::endl;
delete producer;
return 0;
}
g++ -o producer producer.cpp -lrdkafka++ -lrdkafka -lz -lpthread -lrt -L /usr/local/lib -std=c++11