Kafka的接口回调 +自定义分区、拦截器
一、接口回调+自定义分区
1.接口回调:在使用消费者的send方法时添加Callback回调
producer.send(new ProducerRecord<String, String>("xinnian", "20" + i + "年新年好!"), new Callback() {
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (recordMetadata!=null){
System.out.println(recordMetadata.topic()+"-----"+recordMetadata.offset()+"-----"+recordMetadata.partition());
}
}
2.自定义分区:定义类实现Patitioner接口,实现接口的方法:
设置configure、分区逻辑partition(return 1;)、释放资源close、在生产者的配置过程中添加入分区属性。
在定义生产者属性时添加分区的属性即可
/**
* @author: PrincessHug
* @date: 2019/2/28, 16:24
* @Blog: https://www.cnblogs.com/HelloBigTable/
*/
public class PartitionDemo implements Partitioner {
public int partition(String s, Object o, byte[] bytes, Object o1, byte[] bytes1, Cluster cluster) {
return 1;
} public void close() { } public void configure(Map<String, ?> map) { }
} public class ProducerDemo {
public static void main(String[] args) {
Properties prop = new Properties(); //参数配置
//kafka节点的地址
prop.put("bootstrap.servers", "192.168.126.128:9092");
//发送消息是否等待应答
prop.put("acks", "all");
//配置发送消息失败重试
prop.put("retries", "0");
//配置批量处理消息大小
prop.put("batch.size", "10241");
//配置批量处理数据延迟
prop.put("linger.ms","5");
//配置内存缓冲大小
prop.put("buffer.memory", "12341235");
//消息在发送前必须序列化
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("partitioner.class", "PartitionDemo"); KafkaProducer<String, String> producer = new KafkaProducer<String, String>(prop); for (int i=10;i<100;i++){
producer.send(new ProducerRecord<String, String>("xinnian", "20" + i + "年新年好!"), new Callback() {
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (recordMetadata!=null){
System.out.println(recordMetadata.topic()+"-----"+recordMetadata.offset()+"-----"+recordMetadata.partition());
}
}
});
}
producer.close();
}
}
注意:在自定义分区后,你的消费者会收不到消息,因为消费者默认接收的分区为0。
二、拦截器
1)创建生产者类;
2)创建自定义拦截器类实现ProducerInterceptor接口,重写抽象方法;
3)在业务逻辑方法ProducerRecord方法中,修改返回值,
return new ProducerRecord<String,String>(
record.topic(),
record.partiiton(),
record.key(),
System.currentTimeMillis() + "-" + record.value() + "-" + record.topic());
4)在生产者类中将自定义拦截器生效
prop.put(ProducerConfig.INTERCEPTOR_CLASSEA_CONFIG,"com.wyh.com.wyh.kafka.interceptor.TimeInterceptor");
5)运行生产者main方法,或者在linux端用shell测试。
/**
* @author: PrincessHug
* @date: 2019/2/28, 20:59
* @Blog: https://www.cnblogs.com/HelloBigTable/
*/
public class TimeInterceptor implements ProducerInterceptor<String, String> { //业务逻辑
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> producerRecord) {
return new ProducerRecord<String,String>(
producerRecord.topic(),
producerRecord.partition(),
producerRecord.key(),
System.currentTimeMillis()+"--"+producerRecord.value()
);
} //发送失败调用
public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) { } //释放资源
public void close() { } //获取配置信息
public void configure(Map<String, ?> map) { }
} public class ItctorProducer {
public static void main(String[] args) {
//配置生产者属性
Properties prop = new Properties();
//kafka节点的地址
prop.put("bootstrap.servers", "192.168.126.128:9092");
//发送消息是否等待应答
prop.put("acks", "all");
//配置发送消息失败重试
prop.put("retries", "0");
//配置批量处理消息大小
prop.put("batch.size", "1024");
//配置批量处理数据延迟
prop.put("linger.ms","5");
//配置内存缓冲大小
prop.put("buffer.memory", "12341235");
//消息在发送前必须序列化
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); //添加拦截器
ArrayList<String> inList = new ArrayList<String>();
inList.add("interceptor.TimeInterceptor");
prop.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,inList); //实例化producer
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(prop); //发送消息
for (int i=0;i<99;i++){
producer.send(new ProducerRecord<String, String>("xinnian","You are genius!"+i));
} //释放资源
producer.close(); }
}
Kafka的接口回调 +自定义分区、拦截器的更多相关文章
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- Dubbo自定义日志拦截器
前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...
- springmvc自定义的拦截器以及拦截器的配置
一.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口. 二.HandlerIn ...
- SpringMVC 自定义一个拦截器
自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...
- spring自定义注解拦截器的配置
1.创建注解文件 (文件格式为注解) 这里面什么都不需要写 文件名就是注解名称 如下 是@anno package com.ABC123.anno; import java.lang.annotati ...
- struts2自定义Interceptor拦截器
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- mybatis自定义分页拦截器
最近看了一下项目中代码,发现系统中使用的mybatis分页使用的是mybatis自带的分页,即使用RowBounds来进行分页,而这种分页是基于内存分页,即一次查出所有的数据,然后再返回分页需要的数据 ...
- struts2自定义登录拦截器
版权声明:本文为博主原创文章,未经博主允许不得转载. (1)配置web.xml,让xml加载struts2框架 <?xml version="1.0" encoding=&q ...
随机推荐
- CDH 元数据库升级
元数据库设计到的服务:scm库:server hive库:hive amon库:cloudera management服务 元数据库要从5.7.24升级到5.7.25,为了避免升级失败导致 集群不 ...
- CDH运维
1.单个节点宕机后,想可能存在的问题: 时间同步是否正常运行 hbase对时间是否同步很敏感 2.zookeeper报警 ZooKeeper 服务 canary 因未知原因失败. 该警报是在重启CM的 ...
- css一些基础效果
1.旋转 .center>.bj>.div1>ul>li>.img1:hover {transform: rotate(-360deg);transition: 1s}/ ...
- Windows7上完全卸载Oracle 12c操作步骤
注:本文来源于:< Windows7上完全卸载Oracle 12c操作步骤 > 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的 ...
- Python全栈习题一
1.执行 Python 脚本的两种方式 a../run.py 直接在命令行调用python脚本: b.python run.py 调用python解释器来调用Python脚本. 2.简述位.字节的关 ...
- bzoj 2761
神题... 其实这题巨水,用各种诡异的方法都能A,包括STL等等 我之所以写题解,是因为我发现了一个bug:bz和luogu时限有问题! 这题我用了两种做法: ①:直接使用STL-map(不能直接用数 ...
- AI-跨域、垃圾回收、content_type组见、接口处理
AI-跨域.垃圾回收.content_type组见.接口处理 跨域 为什么有跨域?什么时候遇见的?答:由于浏览器的同源策略 阻止ajax请求 不阻止src请求:在测试时,项目上线后不会遇见跨域.源:协 ...
- 配置webpack loader vue 报错:Module build failed: TypeError: this._init is not a function
单文件组件 引入时报错 配置webpage.config.js中的vue 需要如下写法 { test: /\.vue/, loader: "vue-loader", } 之前写的l ...
- html5页面调用手机打电话功能
<head>里面加上:<meta name="format-detection" content="telephone=yes"/> 需 ...
- tensorflow:验证码的识别(上)
验证码的识别 主要分成四个部分:验证码的生成.将生成的图片制作成tfrecord文件.训练识别模型.测试模型 使用pyCharm作为编译器.本文先介绍前两个部分 验证码的识别有两种方法: 验证码识别方 ...