创建项目测试Kafka
创建项目knows-kafka
我们创建knows-kafka项目
用于测试kafka基本功能
编写发送和接收消息的测试
创建过程不需要勾选任何内容
父子相认
<module>knows-kafka</module>
子项目pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.tedu</groupId>
<artifactId>knows</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.tedu</groupId>
<artifactId>knows-kafka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>knows-kafka</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Google JSON API -->
<!-- 将java对象和json格式字符串相互转换 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!-- Kafka API -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
</dependencies>
</project>
application.properties配置如下
# 配置kafka位置
spring.kafka.bootstrap-servers=localhost:9092
# spring-kafka要求我们必须为当前项目的话题定义一个分组名称
# 以便于即使有不同的项目使用了相同的话题名称,也能区分开
# 这个配置是强制的,不配置会报错
spring.kafka.consumer.group-id=knows
# 日志门槛
logging.level.cn.tedu.knows.kafka=debug
SpringBoot启动类
@SpringBootApplication
// 启动项目添加kafka的支持
@EnableKafka
// 启动SpringBoot自带的定时任务功能,用于周期性的调用发布信息的方法
// 和kafka没有直接关系,只是本次测试需要使用到它
@EnableScheduling
public class KnowsKafkaApplication {
public static void main(String[] args) {
SpringApplication.run(KnowsKafkaApplication.class, args);
}
}
创建消息类
和数据库与ES一样
要向Kafka发消息,也要创建一个能够封装数据的类
我们在项目中创建一个vo包
包中创建Message类用于封装消息数据
@Data
@Accessors(chain = true)
public class Message implements Serializable {
private Integer id;
private String content;
private Long time;
}
编写消息发送
下面来发送消息
我们这里测试发送消息的方式是利用SpringBoot的定时任务
每隔10秒向kafka发送一条消息,这个消息就是Message对象的json格式字符串,我们创建一个demo包,保重编写一个Producer代码如下
@Component
@Slf4j
public class Producer {
// 当前类的目标是每隔10秒钟向kafka发送消息
// KafkaTemplate是Spring-kafka框架提供的操作kafka的对象
// 泛型<[话题名称的类型],[传递消息的类型]>
@Resource
private KafkaTemplate<String,String> kafkaTemplate;
int i=1;
// 利用SpringBoot的定时任务,每隔10秒运行一次下面的方法
// 这个方法会向kafka发送一条消息
@Scheduled(fixedRate = 10000)
public void sendMessage(){
// 实例化一个Message对象
Message message=new Message()
.setId(i++)
.setContent("向kafka发送消息了")
.setTime(System.currentTimeMillis());
// 实例化Gson对象将message转换为json格式字符串
Gson gson=new Gson();
String json=gson.toJson(message);
log.debug("即将发送信息:{}",json);
// 执行消息发送
kafkaTemplate.send("myTopic",json);
log.debug("消息已发送!");
}
}
编写消息的接收
继续在demo包中创建一个类Consumer
类中编写接收消息的方法
代码如下
@Component
@Slf4j
public class Consumer {
// Spring-kafka框架中提供了一个kafka监听器
// 当指定话题有消息出现时,这个监听器就会自动调用对应的方法
// 而且会将消息接收,并传递给该方法的参数
@KafkaListener(topics = "myTopic")
public void receive(ConsumerRecord