Kafka中使用Avro编码、解码消息
1.消费者代码
import com.twitter.bijection.Injection;
import com.twitter.bijection.avro.GenericAvroCodecs;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; /**
* Created by p on 2018/10/8.
*/
public class AvroKafkaProducer {
public static final String USER_SCHEMA = "{\n" +
" \"type\":\"record\",\n" +
" \"name\":\"Customer\",\n" +
" \"fields\":[\n" +
" {\"name\":\"id\",\"type\":\"int\"},\n" +
" {\"name\":\"name\",\"type\":\"string\"},\n" +
" {\"name\":\"email\",\"type\":[\"null\",\"string\"],\"default\":\"null\"}\n" +
" ]\n" +
"}"; public static void main(String[] args){ Properties kafkaProps = new Properties();
kafkaProps.put("bootstrap.servers","ip:9092");
kafkaProps.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
kafkaProps.put("value.serializer","org.apache.kafka.common.serialization.ByteArraySerializer");
kafkaProps.put("partitioner.class","MyPartitioner"); Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(USER_SCHEMA); Injection<GenericRecord,byte[]> injection = GenericAvroCodecs.toBinary(schema);
KafkaProducer producer = new KafkaProducer<String,byte[]>(kafkaProps);
for(int i = 0;i < 1000;i++){
GenericData.Record record = new GenericData.Record(schema);
record.put("id",i);
record.put("name","name-"+i);
record.put("email","email-"+i);
byte[] bytes = injection.apply(record);
ProducerRecord<String,byte[]> record1 = new ProducerRecord<String, byte[]>("Customer","customer-"+i,bytes);
producer.send(record1);
}
producer.close();
System.out.println(USER_SCHEMA);
}
}
2. 消费者代码
import com.twitter.bijection.Injection;
import com.twitter.bijection.avro.GenericAvroCodecs;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericRecord;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; import java.util.Collections;
import java.util.Properties; /**
* Created by p on 2018/10/14.
*/
public class AvroKafkaConsumer { public static final String USER_SCHEMA = "{\n" +
" \"type\":\"record\",\n" +
" \"name\":\"Customer\",\n" +
" \"fields\":[\n" +
" {\"name\":\"id\",\"type\":\"int\"},\n" +
" {\"name\":\"name\",\"type\":\"string\"},\n" +
" {\"name\":\"email\",\"type\":[\"null\",\"string\"],\"default\":\"null\"}\n" +
" ]\n" +
"}"; public static void main(String[] args){
Properties kafkaProps = new Properties();
kafkaProps.put("bootstrap.servers","ip:9092"); kafkaProps.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
kafkaProps.put("value.deserializer","org.apache.kafka.common.serialization.ByteArrayDeserializer"); kafkaProps.put("group.id","DemoAvroKafkaConsumer"); kafkaProps.put("auto.offset.reset","earliest"); KafkaConsumer<String ,byte[]> consumer = new KafkaConsumer<String, byte[]>(kafkaProps); consumer.subscribe(Collections.singletonList("Customer")); Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(USER_SCHEMA); Injection<GenericRecord,byte[]> injection = GenericAvroCodecs.toBinary(schema); try {
while (true){
ConsumerRecords<String,byte[]> records = consumer.poll(10);
for(ConsumerRecord<String,byte[]> record : records){
GenericRecord record1 = injection.invert(record.value()).get();
System.out.println(record.key() + ":" + record1.get("id") + "\t" + record1.get("name") + "\t" + record1.get("email"));
}
}
} finally {
consumer.close();
}
}
}
3. pom依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.7.6-cdh5.9.1</version>
</dependency>
<dependency>
<groupId>com.twitter</groupId>
<artifactId>bijection-avro_2.11</artifactId>
<version>0.9.6</version>
</dependency>
Kafka中使用Avro编码、解码消息的更多相关文章
- C#中Base64之编码,解码方法
原文:C#中Base64之编码,解码方法 1.base64 to string string strPath = "aHR0cDovLzIwMy44MS4yOS40Njo1NTU3L1 ...
- Delphi中处理URL编码解码
Delphi中处理URL编码解码 一.URL简单介绍 URL是网页的地址,比方 http://www.shanhaiMy.com. Web 浏览器通过 URL 从 web server请求页面 ...
- urllib库中的URL编码解码和GETPOST请求
在urllib库的使用过程中,会在请求发送之前按照发送请求的方式进行编码处理,来使得传递的参数更加的安全,也更加符合模拟浏览器发送请求的形式.这就需要用urllib中的parse模块.parse的使用 ...
- 详解JavaScript中的Url编码/解码,表单提交中网址编码
本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape ...
- ASP.NET中的URL编码解码(转)
在对URL进行编码时,该用哪一个?这两都使用上有什么区别吗?测试: string file="文件上(传)篇.doc";string Server_UrlEncode=Server ...
- JS中字符串的编码 解码
DEPTNAME 是一个字符串 编码: DEPTNAME = encodeURI(encodeURI(DEPTNAME)); 解码: DEPTNAME = decodeURI(DEPTNAME,&qu ...
- java中文乱码解决之道(六)-----javaWeb中的编码解码
在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...
- java中文乱码解决之道(六)—–javaWeb中的编码解码
在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...
- cookie的中文乱码问题【URL编码解码】
先搞明白为什么会乱码,为什么要转码: 在tomcat 8 之前,cookie中不能直接存储中文数据.需要将中文数据转码,一般采用URL编码(%E3).在tomcat 8 之后,cookie支持中文数据 ...
随机推荐
- 计算思维(美国CMU周以真教授)
博主注:GIScience会议是国际上最为著名的地理信息系统领域的国际会议,自2000年起,每两年举办一次,GIScience 2008会议邀请了美国卡内基-梅隆大学(CMU)计算机系华裔教授周以真博 ...
- "三剑客"之awk心中无剑
一.awk介绍 awk 是一种程序语言. 它具有一般程序语言常见的功能. 因awk语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分(Typeless), ...
- 「CSP-S 2019」Emiya 家今天的饭
description loj 3211 solution 看到题目中要求每种主要食材至多在一半的菜中被使用,容易想到补集转换. 即\(ans=\)总方案数-存在某一种食材在一半以上的菜中被使用的方案 ...
- 堆的数据结构java
public class MaxHeap { private int[] data; private int count; private int capacity; public MaxHeap(i ...
- php8.0正式版新特性和性能优化学习
前言 PHP团队宣布PHP8正式GA(链接).php的发展又开启了新的篇章,PHP8.0.0版本引入了一些重大变更及许多新特性和性能优化机制.火速学习下~ JIT(Just in Time Compi ...
- 2017-2018 ACM-ICPC Latin American Regional Programming Contest J - Jumping frog 题解(gcd)
题目链接 题目大意 一只青蛙在长度为N的字符串上跳跃,"R"可以跳上去,"P"不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1 ...
- Free-Form Image Inpainting with Gated Convolution
Free-Form Image Inpainting with Gated Convolution pytorch 引言 和Generative Image Inpainting with Conte ...
- [从源码学设计]蚂蚁金服SOFARegistry之消息总线
[从源码学设计]蚂蚁金服SOFARegistry之消息总线 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线 0x00 摘要 0x01 相关概念 1.1 事件驱动模型 1.1.1 概念 ...
- Leetcode 021 Merge Two Sorted Lists
摘要:Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...
- 通过sql 语句将多行数据拼接到一行中