kafka拦截器

1. 简单介绍

  kafka拦截器用于生产者和消费者对统一对消息做处理。且可以设置多个拦截器,用于链式调用。

  生产者拦截器可以用于生产消息前做处理,消费者可以用于消费消息前做处理。

2. 简单使用

1. 生产者

复制代码
package cn.qz.cloud.kafka.interceptor;

import org.apache.kafka.clients.producer.ProducerInterceptor;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;

import java.util.Map;

public class CounterInterceptor implements ProducerInterceptor<String, String>  {

    private int errorCounter = 0;

    private int successCounter = 0;


    /**
     *  发送消息回调
     * @return
     */
    @Override
    public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
        return record;
    }

    /**
     *  发送完成回调
     */
    @Override
    public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {
        // 统计成功和失败的次数
        if (e == null) {
            successCounter++;
        } else {
            errorCounter++;
        }
    }

    /**
     * 关闭方法
     */
    @Override
    public void close() {
        // 保存结果
        System.out.println("Successful sent: " + successCounter);
        System.out.println("Failed sent: " + errorCounter);
    }

    /**
     * 配置完成方法
     */
    @Override
    public void configure(Map<String, ?> map) {
        System.out.println("111222");
    }
}

===
package cn.qz.cloud.kafka.interceptor;

import org.apache.kafka.clients.producer.ProducerInterceptor;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;

import java.util.Map;

public class TimeInterceptor implements ProducerInterceptor<String, String> {
    @Override
    public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
        return new ProducerRecord(record.topic(), record.partition(), record.timestamp(), record.key(),
                System.currentTimeMillis() + "," + record.value().toString());
    }

    @Override
    public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {

    }

    @Override
    public void close() {

    }

    @Override
    public void configure(Map<String, ?> map) {

    }
}
复制代码

对生产者设置拦截器

        // 2. 构建拦截链
        List<String> interceptors = new ArrayList<>();
        interceptors.add("cn.qz.cloud.kafka.interceptor.TimeInterceptor");
        interceptors.add("cn.qz.cloud.kafka.interceptor.CounterInterceptor");
        properties.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, interceptors);

2. 消费者

消费者实现另一个接口,设置方法同上:

复制代码
package cn.qz.cloud.kafka.interceptor;

import org.apache.kafka.clients.consumer.ConsumerInterceptor;
import org.apache.kafka.clients.consumer.ConsumerRecords;

import java.util.Map;

public class MyConsumerInterceptor implements ConsumerInterceptor {
    @Override
    public ConsumerRecords onConsume(ConsumerRecords records) {
        System.out.println("MyConsumerInterceptor===1===" + records.count());
        return records;
    }

    @Override
    public void close() {
//        System.out.println("MyConsumerInterceptor===2");
    }

    @Override
    public void onCommit(Map offsets) {
//        System.out.println("MyConsumerInterceptor===3");
    }

    @Override
    public void configure(Map<String, ?> configs) {
//        System.out.println("MyConsumerInterceptor===4");
    }
}
复制代码

设置拦截器

        // 2. 构建拦截链
        List<String> interceptors = new ArrayList<>();
        interceptors.add("cn.qz.cloud.kafka.interceptor.MyConsumerInterceptor");
        properties.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, interceptors)

 

posted @   QiaoZhi  阅读(274)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-01-31 k8s高可用集群
点击右上角即可分享
微信分享提示