use rdkafka::consumer::{Consumer as KafkaConsumer, StreamConsumer};
use rdkafka::config::ClientConfig;
use rdkafka::message::Message;
use anyhow::Result;
pub struct Consumer {
consumer: StreamConsumer,
}
impl Consumer {
pub fn new(brokers: &str, group_id: &str, topics: &[&str]) -> Self {
let consumer: StreamConsumer = ClientConfig::new()
.set("group.id", group_id)
.set("bootstrap.servers", brokers)
.set("enable.partition.eof", "false")
.set("session.timeout.ms", "6000")
.set("enable.auto.commit", "true")
.create()
.expect("Consumer creation failed");
consumer.subscribe(topics).expect("Can cant subscribe to specified topics");
Self { consumer }
}
pub async fn listen<F, Fut>(&self, callback: F) -> Result<()>
where
F: Fn(String) -> Fut,
Fut: std::future::Future<Output = ()>,
{
loop {
match self.consumer.recv().await {
Err(e) => eprintln!("Kafka error: {}", e),
Ok(m) => {
if let Some(payload) = m.payload_view::<str>() {
match payload {
Ok(s) => callback(s.to_string()).await,
Err(e) => eprintln!("Error decoding message payload: {}", e),
}
}
}
}
}
}
}