安装zookeeper:  https://www.cnblogs.com/guoyansi19900907/p/9954864.html

并启动zookeeper

安装kafka https://www.cnblogs.com/guoyansi19900907/p/9961143.html

并启动kafka.

1.创建maven  java项目

2.添加依赖

 <dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.11.0.0</version>
</dependency>

3.创建生产者:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; public class ProducerDemo {
public static void main(String[] args) {
Properties kafkaProps=new Properties();
/**
* acks指定了必须要有多少个分区副本收到消息,生产者才会认为消息写入成功。
* acks=0,生产者在写入消息之前不会等待任何来自服务器的响应;就算发送失败了,生产者也不知道。
* acks=1,只要集群首领收到消息,生产者就会收到一个来自服务器的成功消息
* acks=all,所有参与复制的节点都收到消息,生产者才会收到一个来自服务器的成功响应。
*/
kafkaProps.put("acks", "all");
/**
* 发送失败后重发的次数,最终还不成功表示发送彻底的失败
*/
kafkaProps.put("retries", 0);
/**
* 默认情况下,消息发送时不会被压缩。
* snappy:压缩算法由Google发明,它占用较少的CPU,却能提供较好的性能和相当可观的压缩比
* gzip:占用较多的CPU,但是提供更高的压缩比,带宽比较有限,可以考虑这个压缩算法。
* 使用压缩可以降低网络传输开销和存储开销,而这往往时向kafka发送消息的瓶颈
*/
kafkaProps.put("compression.type", "snappy");
/**
* 一个批次可以使用的内存大小;当批次被填满,批次里的所有消息会被发送;不过生产者并不一定等批次被填满才发送;
* 所以批次大小设置得很大,也不会造成延迟,只是会占用更多得内存而已。但是设置得太小,
* 因为生产者需要更频繁的发送消息,会增加额外的开销。
*/
kafkaProps.put("batch.size", 100);
/**
* 指定了生产者在发送批次之前等待更多消息加入批次的时间。
* KafkaProducer会在批次填满或liner.ms达到上限时把批次发送出去。
* 这样做虽然会出现一些延时,但是会提高吞吐量。
*/
kafkaProps.put("linger.ms", 1);
/**
* 生产者内存缓冲区的大小,生产者用它缓冲要发送到服务器的消息。
* 如果应用程序发送消息的速度超过发送到服务器的速度,会导致生产者空间不足,
* 这个时候send()方法要么被阻塞,要么抛出异常。
*/
kafkaProps.put("buffer.memory", 33554432);
/**
* 生产者在收到服务器响应之前可以发送多少个消息。
* 值越高就会占用越多的内存,不过也会提升吞吐量。
* 设为1可以保证消息是按照发送顺序填写入服务器的,即使发生了重试。
*/
kafkaProps.put("max.in.flight.requests.per.connection", 1);
//kafkaProps.put("bootstrap.servers","192.168.123.128:9092,192.168.123.129:9092,192.168.123.130:9092");
//主机信息(broker)
kafkaProps.put("bootstrap.servers","192.168.123.128:9092");
//键为字符串类型
kafkaProps.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
//值为字符串类型
kafkaProps.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer"); Producer<String,String> producer=new KafkaProducer<String, String>(kafkaProps);
String msg = "abc";
producer.send(new ProducerRecord<String, String>("guo", msg));
System.out.println("Sent:" + msg);
producer.close();
}
}

4.创建消费者

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; import java.util.Arrays;
import java.util.Properties; public class ConsumerDemo { public static void main(String[] args) throws Exception{
Properties properties=new Properties();
//主机信息
properties.put("bootstrap.servers","192.168.123.128:9092");
//群组id
properties.put("group.id", "group-1");
/**
*消费者是否自动提交偏移量,默认是true
* 为了经量避免重复数据和数据丢失,可以把它设为true,
* 由自己控制核实提交偏移量。
* 如果设置为true,可以通过auto.commit.interval.ms属性来设置提交频率
*/
properties.put("enable.auto.commit", "true");
/**
* 自动提交偏移量的提交频率
*/
properties.put("auto.commit.interval.ms", "1000");
/**
* 默认值latest.
* latest:在偏移量无效的情况下,消费者将从最新的记录开始读取数据
* erliest:偏移量无效的情况下,消费者将从起始位置读取分区的记录。
*/
properties.put("auto.offset.reset", "earliest");
/**
* 消费者在指定的时间内没有发送心跳给群组协调器,就被认为已经死亡,
* 协调器就会触发再均衡,把它的分区分配给其他消费者。
*/
properties.put("session.timeout.ms", "30000");
properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties);
/**
* 订阅主题,这个地方只传了一个主题:gys.
* 这个地方也可以有正则表达式。
*/
kafkaConsumer.subscribe(Arrays.asList("guo"));
//无限循环轮询
while (true) {
/**
* 消费者必须持续对Kafka进行轮询,否则会被认为已经死亡,他的分区会被移交给群组里的其他消费者。
* poll返回一个记录列表,每个记录包含了记录所属主题的信息,
* 记录所在分区的信息,记录在分区里的偏移量,以及键值对。
* poll需要一个指定的超时参数,指定了方法在多久后可以返回。
* 发送心跳的频率,告诉群组协调器自己还活着。
*/
ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
//Thread.sleep(1000);
System.out.printf("offset = %d, value = %s", record.offset(), record.value());
System.out.println();
}
}
}
}

5.先运行消费者,然后会出现一个监听的控制台,运行生产者。

java版本的Kafka消息写入与读取的更多相关文章

  1. java的bio和nio写入及读取txt文件

    一.bio的写入及读取 1.采用bio之BufferedWriter 写入文件 public static void main(String[] args) throws IOException { ...

  2. Java IO file文件的写入和读取及下载

    一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定一个true值作为F ...

  3. 一文看懂Kafka消息格式的演变

    摘要 对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在不断的升级改进,从0.8.x版本开始到现在的1.1.x版本,Kaf ...

  4. 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变

    转载来自朱小厮博客的 一文看懂Kafka消息格式的演变     ✎摘要 对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在 ...

  5. Flume 读取RabbitMq消息队列消息,并将消息写入kafka

    首先是关于flume的基础介绍 组件名称 功能介绍 Agent代理 使用JVM 运行Flume.每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks. Client ...

  6. 如何写入和读取从 Microsoft 消息队列在 Visual C#

    注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成.微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章.然而由机器翻译的文章并不总是完美的.它 ...

  7. java一行一行写入或读取数据

    原文:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/phsftp/evdokey目录下有个evdokey_2 ...

  8. Java Web SSH框架总是无法写入无法读取Cookie

    不关乎技术,关乎一个小Tips: 默认情况下,IE和Chrome内核的浏览器会认为http://localhost为无效的域名,所以不会保存它的cookie,使用http://127.0.0.1访问程 ...

  9. Java笔记--java一行一行写入或读取数据

    转自 Ruthless java一行一行写入或读取数据 链接:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/ ...

随机推荐

  1. tyvj 1387 迷你火车头

    dp百题进度条[1/100] 一列火车有一个火车头拖着一长串的车厢,每个车厢有若干个乘客. 一旦火车头出了故障,所有的车厢就只能停在铁轨上了,因此铁路局给每列火车配备了三个迷你火车头,每个迷你火车头可 ...

  2. 分布式事物 - 基于RPC调用 - TCC模式

    前提 前端业务(主服务)可以以同步或异步调用TCC框架,或者TCC框架本身就是同步异步兼备的. 假定TCC框架拥有断电后的自动恢复能力.同时,在下游业务出现无限失败的情况下,也会进行无限的重试,以达到 ...

  3. 服务器(VPS)被墙怎么办?

    比如开发接口用的临时服务器被墙,就可以使用以下方法之一. 方法一(推荐) 为你的服务器分配一个浮动IP 等于给你的 droplet 增加一个新的 ip,我们以后访问这个新的ip就ok了. 直到下一次被 ...

  4. 综合5项百度大脑AI技术,快速构建智能交通方案

    一.整体方案:思路:整合百度AI功能,通过百度AI解决.优化在公交运行过程中遇到的运营.管理.安全等方面的问题.具体如下: 安全方面:通过驾驶员检测+语音合成,对驾驶员状态进行实时检测,跟踪,告警.  ...

  5. Java面试题_第一阶段(static、final、面向对象、多线程、集合、String、同步、接口、GC、JVM)

    1.1 简述static和final的用法? static:修饰属性,方法,代码块 (1)静态属性:也可叫类变量  类名.属性名  来访问 (共有的类变量与对象无关,只和类有关) 注意:类中的实例变量 ...

  6. Ubuntu18.04搭建测试环境

    前言 说一下我的情况,之前由于我的云服务器数据库的root账号密码123456太简单,而在之前的博客中也泄露出了我的云服务器的IP地址,导致有人远程连接我的数据库,删除了项目数据库里的数据只剩下WAR ...

  7. Markdown的常用方法总结

    1.标题 # 大标题 ## 副标题 ### 小标题 标准 2.强调 *斜体类型* **黑体字** 3.折叠 折叠长句 <details><summary>Boostnote是对 ...

  8. asp.net core中使用cookie身份验证

    配置 在 Startup.ConfigureServices 方法中,创建具有 AddAuthentication 和 AddCookie 方法的身份验证中间件服务: services.AddAuth ...

  9. python中time.strftime不支持中文,报错UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: encoding error

    使用time.strftime将 "2020-10-10 10:10:10" 转化为  2020年10月10日10时10分10 报错: import time timestr=&q ...

  10. C++ STL容器

    不定长数组:vector vector是一个模板类,作用为创建一个不定长的数组 声明方式:vector<int>a或者vector<double>b这种类型的方式. 基本操作: ...