Java中提供高级的API,相对于低级API(更小的粒度控制消费)使用起来非常方便。

一、修改kafka   server.porperties的ip是你kafka服务的ip

  1. listeners=PLAINTEXT://192.168.111.130:9092

二、生产者的例子

  1. import org.apache.kafka.clients.producer.*;
  2.  
  3. import java.util.Properties;
  4.  
  5. public class KafkaProducerDemo {
  6. private final Producer<String, String> kafkaProdcer;
  7. public final static String TOPIC = "JAVA_TOPIC";
  8.  
  9. private KafkaProducerDemo() {
  10. kafkaProdcer = createKafkaProducer();
  11. }
  12.  
  13. private Producer<String, String> createKafkaProducer() {
  14. Properties props = new Properties();
  15. props.put("bootstrap.servers", "192.168.111.130:9092");
  16. props.put("acks", "all");
  17. props.put("retries", 0);
  18. props.put("batch.size", 16384);
  19. props.put("linger.ms", 1);
  20. props.put("buffer.memory", 33554432);
  21. props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  22. props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  23. Producer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
  24. return kafkaProducer;
  25. }
  26.  
  27. void produce() {
  28. for (int i = 0; i < 10; i++) {
  29. try {
  30. Thread.sleep(1000);
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. final String key = "key" + i;
  35. String data = "hello kafka message:" + key;
  36. kafkaProdcer.send(new ProducerRecord<String, String>(TOPIC, key, data), new Callback() {
  37. public void onCompletion(RecordMetadata recordMetadata, Exception e) {
  38. System.out.println("发送key" + key + "成功");
  39. }
  40. });
  41. }
  42. }
  43.  
  44. public static void main(String[] args) {
  45. KafkaProducerDemo kafkaProducerDemo = new KafkaProducerDemo();
  46. kafkaProducerDemo.produce();
  47. }
  48.  
  49. }

用properties构造一个Producer的实例,然后调用send方法,传入数据,还有一个回调函数。

可以看到数据已经进来了。

注意:kafka producer支持同步发送、异步发送、异步发送+回调函数方式。

1、同步方式会按顺序发送,打印出来的结果是按发送的顺序:

  1. for (int i = 0; i < 1000; i++) {
  2. RecordMetadata test = producer.send(new ProducerRecord<String, String>("test", Integer.toString(i), "hello world-" + i)).get();
  3. System.out.println(test);
  4. }

2、回调函数里面可以对成功或者失败,分支判断,进行业务上的进一步处理。甚至可以把失败的消息存储下来。

  1. for (int i = 0; i < 10; i++) {
  2. producer.send(new ProducerRecord<String, String>("test", i + "", "xxx-" + i), new Callback() {
  3. public void onCompletion(RecordMetadata recordMetadata, Exception e) {
  4. if (e != null) {
  5. e.printStackTrace();
  6. } else {
  7. System.out.println("发送成功");
  8. }
  9. }
  10. });
  11. }

注:回调函数里面onCompletion方法其实是阻塞的! 如果进行延时,会逐个执行,不会同时并发跑,但是发送数据任然是异步的。

三、消费者例子

  1. import org.apache.kafka.clients.consumer.ConsumerRecord;
  2. import org.apache.kafka.clients.consumer.ConsumerRecords;
  3. import org.apache.kafka.clients.consumer.KafkaConsumer;
  4.  
  5. import java.util.Arrays;
  6. import java.util.Properties;
  7.  
  8. public class KafkaConsumerDemo {
  9. private final KafkaConsumer<String, String> consumer;
  10. private KafkaConsumerDemo(){
  11. Properties props = new Properties();
  12. props.put("bootstrap.servers", "192.168.111.130:9092");
  13. props.put("group.id", "test");
  14. props.put("enable.auto.commit", "false");
  15. props.put("auto.commit.interval.ms", "1000");
  16. props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
  17. props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
  18. consumer = new KafkaConsumer<String, String>(props);
  19. }
  20. void consume(){
  21. consumer.subscribe(Arrays.asList(KafkaProducerDemo.TOPIC));
  22. while (true) {
  23. ConsumerRecords<String, String> records = consumer.poll(100);
  24. for (ConsumerRecord<String, String> record : records){
  25. System.out.println("I'm coming");
  26. System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
  27. }
  28. }
  29. }
  30. public static void main(String[] args) {
  31. KafkaConsumerDemo kafkaConsumerDemo = new KafkaConsumerDemo();
  32. kafkaConsumerDemo.consume();
  33. }
  34. }

正常启动是看不到东西的, 两个同时启动才有。消费者只看接下来有哪些生产者发来新的消息。

  1. props.put("enable.auto.commit", "true");

这个的意思是,消费后自动改变偏移量。如果不添加这个,就会在服务器存的offset开始消费,并且不会改变offset的值。

如果为false, 可以看到不管消费几次,服务端存储的始终是offset的值都不会改变,需要手动提交offset。

如果想让consumer从头开始消费,可以设置:

  1. props.put("auto.offset.reset", "earliest");

这个只对新建的组有效,如果一个组已经消费过,offset的值已经存在服务端了,这样设置不起作用的,只会从服务端存储的offset开始消费。不设置默认是latest,就是从最新的开始消费。

java kafka 生产者消费者demo的更多相关文章

  1. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  2. Python 使用python-kafka类库开发kafka生产者&消费者&客户端

    使用python-kafka类库开发kafka生产者&消费者&客户端   By: 授客 QQ:1033553122       1.测试环境 python 3.4 zookeeper- ...

  3. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  4. java实现生产者消费者问题

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  5. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  6. [转载] Java实现生产者消费者问题

    转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...

  7. java实现生产者消费者模式

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...

  8. java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4

    package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...

  9. Java 实现生产者 – 消费者模型

    转自:http://www.importnew.com/27063.html 考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题.有如下几个考点: 对Java并发模型的理解 对Java ...

随机推荐

  1. idea svn 不见的问题

    问题一: IntelliJ IDEA打开带SVN信息的项目不显示SVN信息,项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关,叫Enabled Version Cont ...

  2. cad巧用插件自定义填充图形

    很多同志如果遇到奇葩的填充图案,怎么办,找不到合适的,自己辛苦画了一遍,想把它作为自己的自定义的图案,怎么办呢. 今天老王给你您介绍个好用的插件. 首先在命令行输入命令  ap 弹出加载对话框 打开窗 ...

  3. linux基础知识 【转】

    linux目录架构 / 根目录 /bin 常用的命令 binary file 的目錄 /boot 存放系统启动时必须读取的档案,包括核心 (kernel) 在内 /boot/grub/menu.lst ...

  4. 聊聊动态语言那些事(Python)

    动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...

  5. [数据]matplotlib总结

    这里权当一个matplotlib的用法小结,主要用于记录,以防忘记. 需要安装一下Anaconda,这里推荐清华大学的镜像:https://mirrors.tuna.tsinghua.edu.cn/h ...

  6. GitHub私有代码库将免费开放

    1月8号消息,微软收购 GitHub 后,官方宣布了一项重大更新:免费开放私有代码库, 即 GitHub 用户现在可以免费创建无限量的私有存储库.同时还有另一项更新——GitHub Enterpris ...

  7. 6. Oracle闪回特性

    Oracle 闪回 (flashback)是9i版本提供的新特性.这一特性:其他数据库(PostgreSQL,Mysql)是羡慕不已.对数据恢复提供非常便捷的方式.闪回技术通常用于快速简单恢复数据库中 ...

  8. win7 cmd终端连接android手机运行adb shell脚本命令

    win7 cmd终端连接android手机运行adb shell脚本命令 (2013-03-22 20:13:57) 转载▼ 标签: android it shell 连接 linux 分类: 嵌入式 ...

  9. iOS - 开发中加载本地word/pdf文档说明

    最近项目中要加载一个本地的word/pdf等文件比如<用户隐私政策><用户注册说明>,有两种方法加载 > 用QLPreviewController控制器实现 步骤 : & ...

  10. 6.18_web服务器内容

    #coding:utf-8 ''' 2018-6-18 14:47:23 创建一个静态服务器访问指定页面 http://127.0.0.1:8000/ ''' import socket from m ...