kafka producer interceptor拦截器(五)
producer在发送数据时,会经过拦截器和序列化,最后到达相应的分区。在经过拦截器时,我们可以对发送的数据做进步的处理。
要正确的使用拦截器需要以下步骤:
1.实现拦截器ProducerInterceptor的方法
2.在producer的prop中配置
prop.put("interceptor.classes", "com.xxx.interceptor.xxxInterceptor")
如果是拦截器链的话,在后面追加即可
prop.put("interceptor.classes", ""com.xxx.interceptor.xxxInterceptor1,com.xxx.interceptor.xxxInterceptor2");
生产者的拦截器需要实现ProducerInterceptor接口中的方法来实现
@Override
public void configure(Map<String, ?> arg0) {} #获取broker的配置信息
@Override
public void close() {} #在producer关闭时调用此方法
@Override
public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {} #数据在写到broker时,无论是否成功的回调 @Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> producerRecord) {} #拦截的信息
生产者:
public class ProducerDemo {
private static final Logger LOG = LoggerFactory.getLogger(ProducerDemo.class);
public static void main(String[] args) throws InterruptedException, ExecutionException {
//1.加载配置信息
Properties prop = loadProperties();
//2.创建生产者
KafkaProducer<String,String> producer = new KafkaProducer<>(prop);
//3.发送内容
String sendContent = "hello_kafka";
IntStream.range(0, 10).forEach(i ->{
try {
ProducerRecord<String,String> record = new ProducerRecord<>("test1",sendContent+"_"+i);
Future<RecordMetadata> future = producer.send(record);
RecordMetadata recordMetadata = future.get();
LOG.info("发送的数据是 :{},offset:是{},partition是:{}",sendContent,recordMetadata.offset(),recordMetadata.partition());
} catch (Exception e) {
e.printStackTrace();
}
});
producer.close(); //回调拦截器中的close方法
}
//配置文件的设置
public static Properties loadProperties() {
Properties prop = new Properties();
prop.put("bootstrap.servers", "192.168.100.144:9092,192.168.100.145:9092,192.168.100.146:9092");
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("interceptor.classes", "com.zpb.interceptor.ProducerInterceptorDemo,com.zpb.interceptor.ProducerInterceptorDemo2");
prop.put("acks", "all"); //发送到所有的ISR队列中
return prop;
}
}
拦截器一:
public class ProducerInterceptorDemo implements ProducerInterceptor<String, String>{
private static final Logger LOG = LoggerFactory.getLogger(ProducerInterceptorDemo.class);
private volatile long succNum = 0;
private volatile long failNum = 0;
@Override
public void configure(Map<String, ?> arg0) {
LOG.info("configure ==>"+arg0);
}
@Override
public void close() {
double succRatio = succNum/succNum+failNum;
LOG.info("成功率是:"+succRatio*100);
}
@Override
public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {
if(null == e){
succNum++;
}else{
failNum++;
}
}
@Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> producerRecord) {
String prefixValue = producerRecord.value()+"prefix_1";
return new ProducerRecord<String, String>(producerRecord.topic(),prefixValue);
}
}
拦截器二:
public class ProducerInterceptorDemo2 implements ProducerInterceptor<String, String>{
@Override
public void configure(Map<String, ?> configs) {
}
@Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
String prefixValue = record.value()+"prefix_2";
return new ProducerRecord<String, String>(record.topic(), prefixValue);
}
@Override
public void onAcknowledgement(RecordMetadata metadata, Exception exception) {
}
@Override
public void close() {
}
}
kafka producer interceptor拦截器(五)的更多相关文章
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- Spring MVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMvc中Interceptor拦截器用法
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...
- SpringMVC 中的Interceptor 拦截器
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...
- SpringBoot-SpringMvc的Interceptor拦截器配置
Interceptor拦截器实现对每一个用户请求处理前后的业务处理,比如我们需要对用户请求进行响应时间的记录,需要记录请求从开始到结束所耗的时间,这时我们就需要用到拦截器了 下面我们以记录请求处理时间 ...
- SpringMVC中使用Interceptor拦截器顺序
一.简介 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验 证,或者是来判断用户是否登陆,或者是像1 ...
- 【tmos】如何在Interceptor拦截器中注入其他数据
光是这样是获取不到weixinConfig内容的 public class WebLoginInterceptor implements HandlerInterceptor { @Autowired ...
- SpringMVC中的Interceptor拦截器及与Filter区别
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- [转]SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
随机推荐
- sizeof +数组名
链接:https://www.nowcoder.com/questionTerminal/daa5422cb468473c9e6e75cc98b771de 来源:牛客网 sizeof一个数组名称的时候 ...
- 使用python开发ansible自定义模块的简单案例
安装的版本ansible版本<=2.7,<=2.8是不行的哦 安装模块 pip install ansible==2.7 先导出环境变量 我们自定义模块的目录. 我存放的目录 export ...
- nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍
浏览器给服务器传递参数,最常用的是地址栏传参(get),以及表单提交(post) 先说get传参,就是在url后跟上?key=value&key2=value2...... 但是按照前几篇的h ...
- c++ 容器切片反转次序(不拷贝到新容器)
// rotate algorithm example #include <iostream> // cout #include <algorithm> // rotate # ...
- Apache Web服务器 安装步骤 和遇到的坑
Apache Web服务器是开发放源码的网页服务器,我们看到的网页都是上传到服务器然后呈现给用户的. 在开发中,在自己的电脑上安装Apache Web服务器,你的电脑也会成为服务器,配置文件,访问你的 ...
- POJ 1051 Jury Compromise ——(暴力DP)
题目不难,暴力地dp一下就好,但是不知道我WA在哪里了,对拍了好多的数据都没找出错误= =.估计又是哪里小细节写错了QAQ..思路是用dp[i][j]表示已经选了i个,差值为j的最大和.转移的话暴力枚 ...
- docker数据持久化
转载/参考: https://www.jianshu.com/p/ef0f24fd0674 Docker的数据持久化主要有两种方式: bind mount docker managed volume ...
- oracle insert into 多条数据
mysql : insert into tablename (column1,column2) values ('aa','bb'), ('dd','cc'), ('ee','ff'); oracle ...
- ubuntu 无法访问windows使用的磁盘
安装双系统的电脑,正常情况下Ubuntu是可以访问windows下使用的磁盘的, 当出现如下图所示问题时: Windows没有正常关闭. 解决方法: sudo apt-get install ntfs ...
- linux系统安装Memcache
Linux系统安装memcached 首先要先安装libevent库. centos 下执行 yum install libevent libevent-devel 查看memcached 是否已经 ...