kakfa-生产者

#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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值