【传输对象】kafka传递实体类消息
工具类
负责对象字节数组的相互转换,传输数据用
package com.yq.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class BeanUtil { /** * @Description 对象转字节数组 * @param obj Object对象 * @return byte[] 字节数组 * @author SUNBIN * @date 2017年9月8日 */ public static byte[] ObjectToBytes(Object obj){ byte[] bytes = null; ByteArrayOutputStream bo = null; ObjectOutputStream oo = null; try { bo = new ByteArrayOutputStream(); oo = new ObjectOutputStream(bo); oo.writeObject(obj); bytes = bo.toByteArray(); } catch (IOException e) { e.printStackTrace(); }finally { try { if(bo!=null){ bo.close(); } if(oo!=null){ oo.close(); } } catch (IOException e) { e.printStackTrace(); } } return bytes; } /** * @Description 字节数组转对象 * @param bytes 字节数组 * @return Object Object对象 * @author SUNBIN * @date 2017年9月8日 */ public static Object BytesToObject(byte[] bytes){ Object obj = null; ByteArrayInputStream bi = null; ObjectInputStream oi = null; try { bi =new ByteArrayInputStream(bytes); oi =new ObjectInputStream(bi); obj = oi.readObject(); } catch (Exception e) { e.printStackTrace(); }finally { try { if(bi!=null){ bi.close(); } if(oi!=null){ oi.close(); } } catch (IOException e) { e.printStackTrace(); } } return obj; } }
消息实体类
需要继承Serializable接口和Encoder<MsgEntity>接口,并且实现构造函数MsgEntity(VerifiableProperties verifiableProperties),否则会报错无法运行起来
package com.yq.dto; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import kafka.serializer.Encoder; import kafka.utils.VerifiableProperties; /** * @Description kafka传递图片url消息实体类*/ public class MsgEntity implements Serializable, Encoder<MsgEntity>{ private static final long serialVersionUID = 4948961384423258719L; /**图片id*/ private int id; /**图片url*/ private String url; /** * 构造函数 * @param id 图片id * @param url 图片url */ public MsgEntity(int id, String url){ this.id = id; this.url = url; } /** * 构造函数,kafka支持 * @param verifiableProperties */ public MsgEntity(VerifiableProperties verifiableProperties){} /** * 实现kafka实体类转换字节数组接口 */ @Override public byte[] toBytes(ImgUrlMessage entity) {return BeanUtil.ObjectToBytes(entity); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
Producer
设置Producer的"serializer.class"指定为MsgEntity.class.getName()
package com.kafka; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.javaapi.producer.Producer; import kafka.producer.KeyedMessage; import kafka.producer.ProducerConfig; import kafka.serializer.StringEncoder; public class ProducerDemo extends Thread{ //指定具体的topic private String topic; //构造函数 public ProducerDemo(String topic){ this.topic = topic; } @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" }) public void run(){ //创建一个producer对象 Producer producer = createProducer(); int i=0; while(true){ //使用producer发送数据 producer.send(new KeyedMessage<Integer, Object>(this.topic, new MsgEntity(i, "www.baidu.com?id="+i))); System.out.println("Producer发送数据:" + i); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } @SuppressWarnings({ "deprecation", "rawtypes" }) private Producer createProducer(){ Properties prop = new Properties(); //声明zk prop.put("zookeeper.connect", "node1.sunny.cn:2181,node2.sunny.cn:2181,node3.sunny.cn:2181"); // 指定message的序列化方法,用户可以通过实现kafka.serializer.Encoder接口自定义该类 // 默认情况下message的key和value都用相同的序列化,但是可以使用"key.serializer.class"指定key的序列化 prop.put("serializer.class", MsgEntity.class.getName()); // broker的地址 prop.put("metadata.broker.list", "node1.sunny.cn:9092,node2.sunny.cn:9092,node3.sunny.cn:9092"); // 这个参数用于通知broker接收到message后是否向producer发送确认信号 // 0 - 表示producer不用等待任何确认信号,会一直发送消息,否则producer进入等待状态 // -1 - 表示leader状态的replica需要等待所有in-sync状态的replica都接收到消息后才会向producer发送确认信号,再次之前producer一直处于等待状态 prop.put("request.required.acks", "1"); prop.put("producer.type", "async"); prop.put("batch.num.messages", "5"); return new Producer(new ProducerConfig(prop)); } public static void main(String[] args) { new ProducerDemo("demo").start(); } }
Consumer
package com.kafka; import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import kafka.consumer.Consumer; import kafka.consumer.ConsumerConfig; import kafka.consumer.ConsumerIterator; import kafka.consumer.KafkaStream; import kafka.javaapi.consumer.ConsumerConnector; public class ConsumerDemoOffsetA extends Thread { // 指定具体的topic private String topic; // 构造函数 public ConsumerDemoOffsetA(String topic) { this.topic = topic; } @SuppressWarnings("deprecation") public void run(){ try{ //构建consumer对象 ConsumerConnector consumer =createConsumer(); //构建一个map对象,代表topic-------String:topic名称,Integer:从这个topic中获取多少条记录 Map<String, Integer> topicCountMap = new HashMap<String, Integer>(); //每次获取1条记录 topicCountMap.put(this.topic, 1); //构造一个messageStreams:输入流 --String:topic名称,List获取的数据 Map<String, List<KafkaStream<byte[], byte[]>>> messageStreams = consumer.createMessageStreams(topicCountMap); //获取每次接收到的具体数据 KafkaStream<byte[], byte[]> stream = messageStreams.get(this.topic).get(0); ConsumerIterator<byte[], byte[]> iterator = stream.iterator(); while(iterator.hasNext()){ byte[] data = iterator.next().message(); ByteArrayInputStream ba = new ByteArrayInputStream(data); ObjectInputStream os = new ObjectInputStream(ba); MsgEntity entity = (MsgEntity) BeanUtil.BytesToObject(iterator.next().message()); consumer.commitOffsets(); System.out.println("ConsumerA接收到的数据:" + entity.getUrl()); } }catch(Exception e){ System.out.println(e.getMessage()); } } //创建具体的Consumer @SuppressWarnings("deprecation") private ConsumerConnector createConsumer(){ Properties prop = new Properties(); //声明zk prop.put("zookeeper.connect", "node1.sunny.cn:2181,node2.sunny.cn:2181,node3.sunny.cn:2181"); //指定这个consumer的消费组,每个组只能获取一次消息 prop.put("group.id", "group1"); //smallest和largest(默认) //此配置参数表示当此groupId下的消费者,在ZK中没有offset值时(比如新的groupId,或者是zk数据被清空), //consumer应该从哪个offset开始消费. //largest表示接受接收最大的offset(即最新消息), //smallest表示最小offset,即从topic的开始位置消费所有消息. prop.put("auto.offset.reset", "smallest"); return Consumer.createJavaConsumerConnector(new ConsumerConfig(prop)); } public static void main(String[] args) { new ConsumerDemoOffsetA("demo").start(); } }
【传输对象】kafka传递实体类消息的更多相关文章
- android activity传递实体类对象
通过实现Parcelable接口序列化对象的步骤: 1.实现Parcelable接口.2.并且实现Parcelable接口的public void writeToParcel(Parcel dest, ...
- MVC -- 后台RedirectToAction传递实体类与字符串
1.MVC -- 后台RedirectToAction传递实体类 RedirectToAction(控制器,控制器方法,实体类) 2.MVC -- 后台RedirectToAction传递字符串 Re ...
- SSM与jsp传递实体类
jsp传controller Controller: @RequestMapping({"/user"}) public void registerUser(User uu) th ...
- hibernate sql查询后对象转换成实体类
在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用 session.createSQLQuery(sql).setResultTransform ...
- C#调用webservice 时如何传递实体对象
在webservice端公开一个实体类,然后实例化,赋值,然后再给到webservice,可以实现,但是,即使调用端和service端的实体类完全一致,你也要重新实例化service端的,重新赋值,将 ...
- JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中
处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
/// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...
- c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)
该教材主要是运用到泛型.反射和实体类扩展属性 步骤一.建立扩展属性类 实体类扩展属性要继承Attribute基类完成 [AttributeUsage(AttributeTargets.Property ...
- C#中怎样连接数据库并将查询结果转为实体类以及如何加入事务
场景 新建一个程序,需要对数据的表进行查询并将查询结果转换为实体类,然后将多个实体类 再插入到另一个数据库的表中,执行插入的过程中要使用事务. 注: 博客主页: https://blog.csdn.n ...
随机推荐
- java实现树状图
1.定义测试数据类 VirtualDataGenerator: import java.util.ArrayList;import java.util.HashMap;import java.util ...
- rplidar跑cartographer
一.Cartographer编译 cartographer依赖的大型第三方库很少,编译时基本没有依赖项问题,基本按照官方文档的步骤来,略作修改.使用的环境是Ubuntu16.04+ROS Kineti ...
- 走进APICloud的世界 (1)
APICloud是什么东东?它是一个云端一体平台.啥意思?它利用HTML5跨平台技术同时满足android和ios的APP开发.相比APP传统开发而言,节约了不少成本,而且性能还可以和原生APP性能比 ...
- sap gui 使用方法, sap logon
1:打断点:在程序保存并激活之后,可以打内部或外部断点. 如图示. 2: display 展示程序,不能修改. 3: 查看创建的类的结构,使用more>display object list ...
- context、config
Tomcat启动时已经创建了context,并使用它读取了web.xml中的参数,后台可以从context里获取参数 后台获取参数代码: ServletContext context = getSer ...
- Google面试题[一]
谷歌是不少IT人都想去的企业,那么在进入公司前,少不了面试笔试的测试.那么这里我们就总结了如下谷歌笔试题,并提供了一些参考答案.希望对您有用. 谷歌笔试题:判断一个自然数是否是某个数的平方.当然不能使 ...
- 主成分分析(PCA)算法,K-L变换 角度
主成分分析(PCA)是多元统计分析中用来分析数据的一种方法,它是用一种较少数 量的特征对样本进行描述以达到降低特征空间维数的方法,它的本质实际上是K-L变换.PCA方法最著名的应用应该是在人脸识别中特 ...
- 使用block的好处
1 使用block 可以轻松地绑定各处代码块,使用delete 结构是分散的,不利于变量之间传值,不像block可以随意地获取变量值. 2.使用block可以方便执行异步代码,作为异步处理回调. In ...
- python 一个.py文件如何调用另一个.py文件中的类和函数
原文地址https://blog.csdn.net/winycg/article/details/78512300 在同一个文件夹下 调用函数:
- 第三章基本的SQl查询语言
---恢复内容开始--- ---恢复内容结束---