Kafka使用案例

1、Kafka 生产者(Producer)示例

#include <iostream>
#include <string>
#include <librdkafka/rdkafkacpp.h>

class ExampleDeliveryReportCb : public RdKafka::DeliveryReportCb {
public:
    void dr_cb (RdKafka::Message &message) {
        std::cout << "Message delivery for (" << message.len() << " bytes): " <<
            message.errstr() << std::endl;
    }
};

int main() {
    std::string brokers = "localhost:9092"; // Kafka brokers
    std::string errstr;

    RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
    RdKafka::Conf *tconf = RdKafka::Conf::create(RdKafka::Conf::CONF_TOPIC);

    conf->set("bootstrap.servers", brokers, errstr);

    ExampleDeliveryReportCb ex_dr_cb;
    conf->set("dr_cb", &ex_dr_cb, errstr);

    RdKafka::Producer *producer = RdKafka::Producer::create(conf, errstr);
    if (!producer) {
        std::cerr << "Failed to create producer: " << errstr << std::endl;
        delete tconf;
        delete conf;
        return 1;
    }

    std::string topic_str = "test_topic";
    RdKafka::Topic *topic = RdKafka::Topic::create(producer, topic_str,
                                                   tconf, errstr);
    if (!topic) {
        std::cerr << "Failed to create topic: " << errstr << std::endl;
        delete producer;
        delete tconf;
        delete conf;
        return 1;
    }

    std::string key;
    std::string payload = "Hello, Kafka!";

    RdKafka::ErrorCode resp = producer->produce(topic, RdKafka::Topic::PARTITION_UA,
                                                RdKafka::Producer::RK_MSG_COPY /* Copy payload */,
                                                const_cast<char *>(payload.c_str()), payload.size(),
                                                &key, NULL);
    if (resp != RdKafka::ERR_NO_ERROR) {
        std::cerr << "Failed to produce message: " <<
            RdKafka::err2str(resp) << std::endl;
    } else {
        std::cout << "Produced message (" << payload.size() << " bytes)" <<
            std::endl;
        producer->poll(0); // Non-blocking poll
    }

    producer->flush(10000); // Wait for up to 10 seconds to flush messages

    delete topic;
    delete producer;
    delete tconf;
    delete conf;

    return 0;
}

2、 Kafka 消费者(Consumer)示例

#include <iostream>
#include <string>
#include <librdkafka/rdkafkacpp.h>

class ExampleConsumeCb : public RdKafka::ConsumeCb {
public:
    void consume_cb (RdKafka::Message &message, void *opaque) {
        if (message.err() == RdKafka::ERR_NO_ERROR) {
            std::cout << "Message received (" << message.len() << " bytes)" << std::endl;
            if (message.key()) {
                std::cout << "Key: " << *message.key() << std::endl;
            }
            std::cout << "Payload: " << std::string(static_cast<char *>(message.payload()), message.len()) << std::endl;
        } else {
            std::cerr << "Error while consuming message: " << message.errstr() << std::endl;
        }
    }
};

int main() {
    std::string brokers = "localhost:9092"; // Kafka brokers
    std::string errstr;

    RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
    conf->set("bootstrap.servers", brokers, errstr);

    RdKafka::Conf *tconf = RdKafka::Conf::create(RdKafka::Conf::CONF_TOPIC);

    RdKafka::Consumer *consumer = RdKafka::Consumer::create(conf, errstr);
    if (!consumer) {
        std::cerr << "Failed to create consumer: " << errstr << std::endl;
        delete tconf;
        delete conf;
        return 1;
    }

    std::string topic_str = "test_topic";
    RdKafka::Topic *topic = RdKafka::Topic::create(consumer, topic_str,
                                                   tconf, errstr);
    if (!topic) {
        std::cerr << "Failed to create topic: " << errstr << std::endl;
        delete consumer;
        delete tconf;
        delete conf;
        return 1;
    }

    ExampleConsumeCb ex_consume_cb;
    RdKafka::ErrorCode resp = consumer->start(topic, 0, RdKafka::Topic::OFFSET_BEGINNING);
    if (resp != RdKafka::ERR_NO_ERROR) {
        std::cerr << "Failed to start consumer: " <<
            RdKafka::err2str(resp) << std::endl;
        delete topic;
        delete consumer;
        delete tconf;
        delete conf;
        return 1;
    }

    while (true) {
        RdKafka::Message *msg = consumer->consume(topic, 0, 1000);
        ex_consume_cb.consume_cb(*msg, NULL);
        delete msg;
    }

    consumer->stop(topic, 0);
    consumer->poll(1000); // Final cleanup
    delete topic;
    delete consumer;
    delete tconf;
    delete conf;

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的使用 Kafka案例: 1. 首先,在你的项目中引入 Kafka 的依赖。 2. 创建一个 Kafka 生产者并连接到 Kafka 集群: ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); ``` 3. 创建一个 Kafka 消费者并连接到 Kafka 集群: ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); Consumer<String, String> consumer = new KafkaConsumer<>(props); ``` 4. 发送消息到 Kafka 集群: ```java ProducerRecord<String, String> record = new ProducerRecord<>("test-topic", "key", "value"); producer.send(record); ``` 5. 从 Kafka 集群中消费消息: ```java consumer.subscribe(Collections.singletonList("test-topic")); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1)); for (ConsumerRecord<String, String> record : records) { System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } } ``` 希望这个简单的案例能够帮助到你。如果你有任何其它问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值