POM文件配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.donwait</groupId>
<artifactId>my-kafka-demon</artifactId>
<version>0.0.1-SNAPSHOT</version> <!-- spring boot项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <!-- 项目属性:子模块不能引用父项目的properties变量 -->
<properties>
<!-- 系统全局版本号信息: 所有服务会继承 -->
<dys.global.version>1.0.0.1</dys.global.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<!-- <spring-cloud.version>Finchley.BUILD-SNAPSHOT</spring-cloud.version>-->
<lombok.version>1.16.20</lombok.version>
</properties> <!-- 项目依赖:特殊强制依赖,其他继承父亲 -->
<dependencies>
<!--spring boot测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 监控系统健康情况的工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Lombok:消除模板代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- logback日志包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- kafka客户端 -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <!-- 编译插件 -->
<build>
<plugins>
<!--spring boot maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

注意:

(1)引入kafka客户端

<!-- kafka客户端 -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>

2)添加springboot-maven插件

<!-- 编译插件 -->
<build>
<plugins>
<!--spring boot maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

创建kafka配置

package com.donwait.config;
import java.util.HashMap;
import java.util.Map;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
@Configuration
@EnableKafka
public class KafkaConfig {
@Value("${kafka.broker-list}")
private String brokers;
@Value("${kafka.producer.retries}")
private Integer producer_retries;
@Value("${kafka.producer.batch-size}")
private Integer producer_batch_size;
@Value("${kafka.producer.linger-ms}")
private Integer producer_linger_ms;
@Value("${kafka.producer.buffer-memory}")
private Integer producer_buffer_memory;
@Value("${kafka.producer.key-serializer}")
private String producer_key_serializer;
@Value("${kafka.producer.value-serializer}")
private String producer_value_serializer; @Value("${kafka.consumer.topic}")
private String consumer_topic;
@Value("${kafka.consumer.gourp-id}")
private String consumer_gourp_id;
@Value("${kafka.consumer.enable-auto-commit}")
private boolean consumer_enable_auto_commit;
@Value("${kafka.consumer.auto-commit-ms}")
private String consumer_auto_commit_ms;
@Value("${kafka.consumer.session-timeout-ms}")
private String consumer_session_timeout_ms;
@Value("${kafka.consumer.key-deserializer}")
private String consumer_key_deserializer;
@Value("${kafka.consumer.value-deserializer}")
private String consumer_value_deserializer; @Bean
ConcurrentKafkaListenerContainerFactory<Integer, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Integer, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
} @Bean
public ConsumerFactory<Integer, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
} /**
* 消费者参数配置
* @return
*/
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
props.put(ConsumerConfig.GROUP_ID_CONFIG, consumer_gourp_id);
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, consumer_enable_auto_commit);
props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, consumer_auto_commit_ms);
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, consumer_session_timeout_ms);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, consumer_key_deserializer);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, consumer_value_deserializer);
return props;
} @Bean
public ProducerFactory<String, String> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
} /**
* 生产者参数配置
* @return
*/
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
props.put(ProducerConfig.RETRIES_CONFIG, producer_retries);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, producer_batch_size);
props.put(ProducerConfig.LINGER_MS_CONFIG, producer_linger_ms);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, producer_buffer_memory);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, producer_key_serializer);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, producer_value_serializer);
return props;
} @Bean
public KafkaTemplate<String, String> kafkaTemplate() {
System.out.println("init");
return new KafkaTemplate<String, String>(producerFactory());
}
}

系统配置信息

系统的application.yml配置内容如下:

#服务配置
server:
port: 7002
spring:
application:
name: kafka
#日志信息配置
logging:
level:
org.springframework.cloud.gateway: TRACE
org.springframework.http.server.reactive: DEBUG
org.springframework.web.reactive: DEBUG
reactor.ipc.netty: DEBUG
#Spring Boot Actuator:监控系统配置
endpoints:
shutdown:
enabled: true
path: /shutdown
sensitive: true
management:
security:
enabled: false
kafka:
broker-list: 192.168.12.150:9092,192.168.12.151:9092,192.168.12.152:9092
producer:
#发送失败后的重试次数,默认0
retries: 1
#以字节为单位控制默认的批量大小
batch-size: 0
#延迟时间
linger-ms: 1
#缓冲等待发送到服务器的记录的总内存字节数
buffer-memory: 33554432
#实现Serializer接口的序列化类键
key-serializer: org.apache.kafka.common.serialization.StringSerializer
#实现Serializer接口的序列化类值
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
#消费的主题
topic: test-topic
#消费者组id
gourp-id: test-group
#是否自动提交偏移量
enable-auto-commit: true
#提交偏移量的间隔-毫秒
auto-commit-ms: 1000
#客户端消费的会话超时时间-毫秒
session-timeout-ms: 10000
#实现DeSerializer接口的反序列化类键
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
#实现DeSerializer接口的反序列化类值
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

启动入口

如果不需要测试生产者入口为:

package com.donwait;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import lombok.extern.slf4j.Slf4j;
/**
* 实现命令行接口,从命令行读取参数发送
* @author Administrator
*
*/
@SpringBootApplication
@Slf4j
public class KafkaApp {
/**
* kafka消费
* @param cr
* @throws Exception
*/
@KafkaListener(topics = "test-topic")
public void listen(ConsumerRecord<String, String> cr) throws Exception {
log.info("我是消费者:{}:{}", cr.key(), cr.value());
//latch.countDown();
} public static void main(String[] args) {
SpringApplication.run(KafkaApp.class, args).close();
}
}

如果需要测试生产者,则实现命令中发送数据即可:

package com.donwait;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import lombok.extern.slf4j.Slf4j;
/**
* 实现命令行接口,从命令行读取参数发送
* @author Administrator
*
*/
@SpringBootApplication
@Slf4j
public class KafkaApp implements CommandLineRunner {
// kafka模板
@Autowired
private KafkaTemplate<String, String> template;
// 计数器-等待3个消息接收完成
private final CountDownLatch latch = new CountDownLatch(3);
@Override
public void run(String... args) throws Exception {
System.out.println("发送信息...");
this.template.send("test-topic", "foo1");
this.template.send("test-topic", "foo2");
this.template.send("test-topic", "foo3"); // 等待60秒接收完成退出
latch.await(60, TimeUnit.SECONDS);
log.info("接收完成");
} /**
* kafka消费
* @param cr
* @throws Exception
*/
@KafkaListener(topics = "test-topic")
public void listen(ConsumerRecord<String, String> cr) throws Exception {
log.info("我是消费者:{}:{}", cr.key(), cr.value());
//latch.countDown();
} public static void main(String[] args) {
SpringApplication.run(KafkaApp.class, args).close();
}
}

SpringCloud使用Kafka消费者的更多相关文章

  1. kafka消费者客户端(0.9.0.1API)

    转自:http://orchome.com/203 kafka客户端从kafka集群消费消息(记录).它会透明地处理kafka集群中服务器的故障.它获取集群内数据的分区,也和服务器进行交互,允许消费者 ...

  2. Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

  3. Python 基于pykafka简单实现KAFKA消费者

    基于pykafka简单实现KAFKA消费者   By: 授客 QQ:1033553122         1.测试环境 python 3.4 zookeeper-3.4.13.tar.gz 下载地址1 ...

  4. Kafka集群安装部署、Kafka生产者、Kafka消费者

    Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...

  5. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

  6. kafka 消费者 timeout 6000

    kafka 消费者 timeout 6000 1:查看zookeeper 的状态,kafka默认是自带zookeeper配置,我建议安装单独的zookeeper  服务,并且配置文件也很简单..直接改 ...

  7. Kafka消费者APi

    Kafka客户端从集群中消费消息,并透明地处理kafka集群中出现故障服务器,透明地调节适应集群中变化的数据分区.也和服务器交互,平衡均衡消费者. public class KafkaConsumer ...

  8. kafka 消费者offset记录位置和方式

    我们大家都知道,kafka消费者在会保存其消费的进度,也就是offset,存储的位置根据选用的kafka api不同而不同. 首先来说说消费者如果是根据javaapi来消费,也就是[kafka.jav ...

  9. springcloud 集成kafka问题记录,发消息报错:ERROR o.s.kafka.support.LoggingProducerListener - Exception thrown when sending a message with key='null' and payload='{-1,

    在springcloud集成kafka,发送消息时报错: 2018-08-15 16:01:34.159 [http-nio-8081-exec-1] INFO  org.apache.kafka.c ...

  10. JAVA封装消息中间件调用二(kafka消费者篇)

    上一遍我简单介绍了kafka的生成者使用,调用方式比较简单,今天我给大家分享下封装kafka消费者,作为中间件,我们做的就是最大程度的解耦,使业务方接入我们依赖程度降到最低. 第一步,我们先配置一个消 ...

随机推荐

  1. [转帖]C2C - False Sharing Detection in Linux Perf

    https://joemario.github.io/blog/2016/09/01/c2c-blog/ Do you run your application in a NUMA environme ...

  2. lldb3.9.0 安装攻略

    Study From https://github.com/dotnet/diagnostics/blob/master/documentation/lldb/centos7/build-instal ...

  3. 【Spring】Bean装配类注解

    默认注入类型 多个同类型Bean 注入失败 依赖 使用目标(@Target) @AutoWired 通过type 默认首先安装属性名称进行注入 结合@Qualifier注解(value属性)设置注入的 ...

  4. 深入探索OCR技术:前沿算法与工业级部署方案揭秘

    深入探索OCR技术:前沿算法与工业级部署方案揭秘 注:以上图片来自网络 1. OCR技术背景 1.1 OCR技术的应用场景 OCR是什么 OCR(Optical Character Recogniti ...

  5. 强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

    强化学习从基础到进阶-案例与实践[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.1 强化学习概述 强化学习(reinforcement learning ...

  6. 深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介、DeepLabV3深入解读创新点、训练策略、主要贡献

    深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介.DeepLabV3深入解读创新点.训练策略.主要贡献 0.DeepLabV3深入解读 1.DeepLab系列简介 1.1.Dee ...

  7. Vite4+Typescript+Vue3+Pinia 从零搭建(1) - 项目初始化

    项目代码同步至码云 weiz-vue3-template 前提准备 1. node版本 Node.js版本 >= 12,如果有老项目需要旧版本的,推荐用 nvm 管理node版本. PS C:\ ...

  8. Cygwin,在windows中使用linux命令

    习惯了 linux 命令的快捷操作,使用 winodws 的 shell 感觉效率非常低下,于是开始搜寻工具支持. 刚开始搜到的是 GnuWin32,但是它已经停止更新维护了,于是找到了 Cygwin ...

  9. (C语言)每日代码||2023.12.25||strcpy()函数两个参数中的'\0'

    #include <stdio.h> #include <string.h> #define MAX 500 void test() { char arr1[] = { '1' ...

  10. Proteus仿真出现“Internal Exception: access violation in module ‘LOADERS.DLL‘ [00020627].”错误

    Proteus仿真问题 在使用 Proteus 8.4 进行仿真时, 出现错误提示 Internal Exception: access violation in module 'LOADERS.DL ...