1、配置pom.xml
<?
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<
modelVersion
>
4.0.0
</
modelVersion
>
<
groupId
>
cn.itfeiyue.kafka
</
groupId
>
<
artifactId
>
springboot-kafka
</
artifactId
>
<
version
>
0.0.1-SNAPSHOT
</
version
>
<
packaging
>
jar
</
packaging
>
<
name
>
springboot-kafka
</
name
>
<
description
>
Demo project for Spring Boot
</
description
>
<
parent
>
<
groupId
>
org.springframework.boot
</
groupId
>
<
artifactId
>
spring-boot-starter-parent
</
artifactId
>
<
version
>
2.0.2.RELEASE
</
version
>
<
relativePath
/>
<!-- lookup parent from repository -->
</
parent
>
<
properties
>
<
project.build.sourceEncoding
>
UTF-8
</
project.build.sourceEncoding
>
<
project.reporting.outputEncoding
>
UTF-8
</
project.reporting.outputEncoding
>
<
java.version
>
1.8
</
java.version
>
</
properties
>
<
dependencies
>
<
dependency
>
<
groupId
>
org.springframework.boot
</
groupId
>
<
artifactId
>
spring-boot-starter-web
</
artifactId
>
</
dependency
>
<
dependency
>
<
groupId
>
org.springframework.boot
</
groupId
>
<
artifactId
>
spring-boot-starter-test
</
artifactId
>
<
scope
>
test
</
scope
>
</
dependency
>
<
dependency
>
<
groupId
>
org.projectlombok
</
groupId
>
<
artifactId
>
lombok
</
artifactId
>
<
optional
>
true
</
optional
>
</
dependency
>
<
dependency
>
<
groupId
>
org.springframework.kafka
</
groupId
>
<
artifactId
>
spring-kafka
</
artifactId
>
<
version
>
2.1.1.RELEASE
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
com.google.code.gson
</
groupId
>
<
artifactId
>
gson
</
artifactId
>
<
version
>
2.8.2
</
version
>
</
dependency
>
</
dependencies
>
<
build
>
<
plugins
>
<
plugin
>
<
groupId
>
org.springframework.boot
</
groupId
>
<
artifactId
>
spring-boot-maven-plugin
</
artifactId
>
</
plugin
>
</
plugins
>
</
build
>
</
project
>
|
2、编写
消息实体类 Message.java
package
cn.itfeiyue.kafka.springbootkafka.pojo;
import
lombok.
AllArgsConstructor
;
import
lombok.
Data
;
import
lombok.
NoArgsConstructor
;
import
java.util.Date;
/**
*
@Description:
消息实体类
*
@Author:
ZHANGPENGFEI
*
@CreateDate:
2018/5/21 15:20
*
@Version:
1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class
Message {
private
Long
id
;
//id
private
String
msg
;
//
消息
private
Date
sendTime
;
//
时间戳
}
|
3、
消息发送类 KafkaSender.java
package
cn.itfeiyue.kafka.springbootkafka.sender;
import
cn.itfeiyue.kafka.springbootkafka.pojo.Message;
import
com.google.gson.Gson;
import
com.google.gson.GsonBuilder;
import
lombok.extern.slf4j.
Slf4j
;
import
org.springframework.beans.factory.annotation.
Autowired
;
import
org.springframework.kafka.core.KafkaTemplate;
import
org.springframework.stereotype.
Component
;
import
java.util.Date;
import
java.util.UUID;
/**
*
@Description:
消息发送类
*
@Author:
ZHANGPENGFEI
*
@CreateDate:
2018/5/21 15:25
*
@Version:
1.0
*/
@Component
@Slf4j
public class
KafkaSender {
@Autowired
private
KafkaTemplate
kafkaTemplate
;
private
Gson
gson
=
new
GsonBuilder().create();
//
发送消息的方法
public void
send(){
Message message =
new
Message();
message.setId(System.
currentTimeMillis
());
message.setMsg(UUID.
randomUUID
().toString());
message.setSendTime(
new
Date());
log
.info(
"+++++++++++++++++++++ message = {}"
,
gson
.toJson(message));
kafkaTemplate
.send(
"feiyue"
,
gson
.toJson(message));
}
}
|
这里关键的代码为
kafkaTemplate.send()
方法,
feiyue
是 Kafka 里的 topic ,这个 topic 在 Java 程序中是不需要提前在 Kafka 中设置的,因为它会在发送的时候自动创建你设置的 topic
4、
消息接收类 KafkaReceiver.java
package
cn.itfeiyue.kafka.springbootkafka.receiver;
import
lombok.extern.slf4j.
Slf4j
;
import
org.apache.kafka.clients.consumer.ConsumerRecord;
import
org.apache.kafka.common.internals.Topic;
import
org.springframework.kafka.annotation.
KafkaListener
;
import
org.springframework.stereotype.
Component
;
import
java.util.Optional;
import
java.util.function.Consumer;
/**
*
@Description:
消息接受者
*
@Author:
ZHANGPENGFEI
*
@CreateDate:
2018/5/21 15:38
*
@Version:
1.0
*/
@Component
@Slf4j
public class
KafkaReceiver {
@KafkaListener
(topics={
"feiyue"
})
public void
listen(ConsumerRecord<?,?> record){
Optional<?> kafkaMessage = Optional.
ofNullable
(record.value());
if
(kafkaMessage.isPresent()){
Object message = kafkaMessage.get();
log
.info(
"----------------- record ="
+ record);
log
.info(
"------------------ message ="
+ message);
}
}
}
|
5、编写测试类
package
cn.itfeiyue.kafka.springbootkafka;
import
cn.itfeiyue.kafka.springbootkafka.sender.KafkaSender;
import
org.junit.
Test
;
import
org.junit.runner.
RunWith
;
import
org.springframework.beans.factory.annotation.
Autowired
;
import
org.springframework.boot.SpringApplication;
import
org.springframework.boot.test.context.
SpringBootTest
;
import
org.springframework.context.ConfigurableApplicationContext;
import
org.springframework.test.context.junit4.SpringRunner;
@RunWith
(SpringRunner.
class
)
@SpringBootTest
public class
SpringbootKafkaApplicationTests {
@Autowired
KafkaSender
kafkaSender
;
@Test
public void
contextLoads() {
for
(
int
i=
0
;i<
3
;i++){
//
调用消息发送类中的发送方法
kafkaSender
.send();
try
{
Thread.
sleep
(
3000
);
}
catch
(Exception e){
e.printStackTrace();
}
}
}
}
|
6、相关配置为:
#============== kafka ===================
#
指定
kafka
代理地址,可以多个
spring.kafka.bootstrap-servers
=
192.168.52.128:9092
#=============== provider =======================
spring.kafka.producer.retries
=
0
#
每次批量发送消息的数量
spring.kafka.producer.batch-size
=
16384
spring.kafka.producer.buffer-memory
=
33554432
#
指定消息
key
和消息体的编解码方式
spring.kafka.producer.key-serializer
=
org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer
=
org.apache.kafka.common.serialization.StringSerializer
#=============== consumer =======================
#
指定默认消费者
group id
spring.kafka.consumer.group-id
=
test-consumer-group
|
7、效果如下: