Skip to content

Commit 5394cfd

Browse files
committed
✨ spring-boot-demo-mq-kafka 完成
1 parent 2b9054c commit 5394cfd

File tree

8 files changed

+199
-1
lines changed

8 files changed

+199
-1
lines changed

spring-boot-demo-mq-kafka/pom.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@
3838
<artifactId>spring-boot-starter-test</artifactId>
3939
<scope>test</scope>
4040
</dependency>
41+
42+
<dependency>
43+
<groupId>org.projectlombok</groupId>
44+
<artifactId>lombok</artifactId>
45+
<optional>true</optional>
46+
</dependency>
47+
48+
<dependency>
49+
<groupId>cn.hutool</groupId>
50+
<artifactId>hutool-all</artifactId>
51+
</dependency>
52+
53+
<dependency>
54+
<groupId>com.google.guava</groupId>
55+
<artifactId>guava</artifactId>
56+
</dependency>
4157
</dependencies>
4258

4359
<build>

spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/SpringBootDemoMqKafkaApplication.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55

6+
/**
7+
* <p>
8+
* 启动器
9+
* </p>
10+
*
11+
* @package: com.xkcoding.mq.kafka
12+
* @description: 启动器
13+
* @author: yangkai.shen
14+
* @date: Created in 2019-01-07 14:43
15+
* @copyright: Copyright (c) 2019
16+
* @version: V1.0
17+
* @modified: yangkai.shen
18+
*/
619
@SpringBootApplication
720
public class SpringBootDemoMqKafkaApplication {
821

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.xkcoding.mq.kafka.config;
2+
3+
import com.xkcoding.mq.kafka.constants.KafkaConsts;
4+
import lombok.AllArgsConstructor;
5+
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
6+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.kafka.annotation.EnableKafka;
10+
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
11+
import org.springframework.kafka.core.*;
12+
import org.springframework.kafka.listener.ContainerProperties;
13+
14+
/**
15+
* <p>
16+
* kafka配置类
17+
* </p>
18+
*
19+
* @package: com.xkcoding.mq.kafka.config
20+
* @description: kafka配置类
21+
* @author: yangkai.shen
22+
* @date: Created in 2019-01-07 14:49
23+
* @copyright: Copyright (c) 2019
24+
* @version: V1.0
25+
* @modified: yangkai.shen
26+
*/
27+
@Configuration
28+
@EnableConfigurationProperties({KafkaProperties.class})
29+
@EnableKafka
30+
@AllArgsConstructor
31+
public class KafkaConfig {
32+
private final KafkaProperties kafkaProperties;
33+
34+
@Bean
35+
public KafkaTemplate<String, String> kafkaTemplate() {
36+
return new KafkaTemplate<>(producerFactory());
37+
}
38+
39+
@Bean
40+
public ProducerFactory<String, String> producerFactory() {
41+
return new DefaultKafkaProducerFactory<>(kafkaProperties.buildProducerProperties());
42+
}
43+
44+
@Bean
45+
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
46+
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
47+
factory.setConsumerFactory(consumerFactory());
48+
factory.setConcurrency(KafkaConsts.DEFAULT_PARTITION_NUM);
49+
factory.setBatchListener(true);
50+
factory.getContainerProperties().setPollTimeout(3000);
51+
return factory;
52+
}
53+
54+
@Bean
55+
public ConsumerFactory<String, String> consumerFactory() {
56+
return new DefaultKafkaConsumerFactory<>(kafkaProperties.buildConsumerProperties());
57+
}
58+
59+
@Bean("ackContainerFactory")
60+
public ConcurrentKafkaListenerContainerFactory<String, String> ackContainerFactory() {
61+
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
62+
factory.setConsumerFactory(consumerFactory());
63+
factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);
64+
factory.setConcurrency(KafkaConsts.DEFAULT_PARTITION_NUM);
65+
return factory;
66+
}
67+
68+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.xkcoding.mq.kafka.constants;
2+
3+
/**
4+
* <p>
5+
* kafka 常量池
6+
* </p>
7+
*
8+
* @package: com.xkcoding.mq.kafka.constants
9+
* @description: kafka 常量池
10+
* @author: yangkai.shen
11+
* @date: Created in 2019-01-07 14:52
12+
* @copyright: Copyright (c) 2019
13+
* @version: V1.0
14+
* @modified: yangkai.shen
15+
*/
16+
public interface KafkaConsts {
17+
/**
18+
* 默认分区大小
19+
*/
20+
Integer DEFAULT_PARTITION_NUM = 3;
21+
22+
/**
23+
* Topic 名称
24+
*/
25+
String TOPIC_TEST = "test";
26+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.xkcoding.mq.kafka.handler;
2+
3+
import com.xkcoding.mq.kafka.constants.KafkaConsts;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.apache.kafka.clients.consumer.ConsumerRecord;
6+
import org.springframework.kafka.annotation.KafkaListener;
7+
import org.springframework.kafka.support.Acknowledgment;
8+
import org.springframework.stereotype.Component;
9+
10+
/**
11+
* <p>
12+
* 消息处理器
13+
* </p>
14+
*
15+
* @package: com.xkcoding.mq.kafka.handler
16+
* @description: 消息处理器
17+
* @author: yangkai.shen
18+
* @date: Created in 2019-01-07 14:58
19+
* @copyright: Copyright (c) 2019
20+
* @version: V1.0
21+
* @modified: yangkai.shen
22+
*/
23+
@Component
24+
@Slf4j
25+
public class MessageHandler {
26+
27+
@KafkaListener(topics = KafkaConsts.TOPIC_TEST, containerFactory = "ackContainerFactory")
28+
public void handleMessage(ConsumerRecord record, Acknowledgment acknowledgment) {
29+
try {
30+
String message = (String) record.value();
31+
log.info("收到消息: {}", message);
32+
} catch (Exception e) {
33+
log.error(e.getMessage(), e);
34+
} finally {
35+
// 手动提交 offset
36+
acknowledgment.acknowledge();
37+
}
38+
}
39+
}

spring-boot-demo-mq-kafka/src/main/resources/application.properties

Whitespace-only changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
server:
2+
port: 8080
3+
servlet:
4+
context-path: /demo
5+
spring:
6+
kafka:
7+
bootstrap-servers: localhost:9092
8+
producer:
9+
retries: 0
10+
batch-size: 16384
11+
buffer-memory: 33554432
12+
key-serializer: org.apache.kafka.common.serialization.StringSerializer
13+
value-serializer: org.apache.kafka.common.serialization.StringSerializer
14+
consumer:
15+
group-id: spring-boot-demo
16+
# 手动提交
17+
enable-auto-commit: false
18+
auto-offset-reset: latest
19+
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
20+
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
21+
properties:
22+
session.timeout.ms: 60000
23+
listener:
24+
log-container-config: false
25+
concurrency: 5
26+
# 手动提交
27+
ack-mode: manual_immediate

spring-boot-demo-mq-kafka/src/test/java/com/xkcoding/mq/kafka/SpringBootDemoMqKafkaApplicationTests.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package com.xkcoding.mq.kafka;
22

3+
import com.xkcoding.mq.kafka.constants.KafkaConsts;
34
import org.junit.Test;
45
import org.junit.runner.RunWith;
6+
import org.springframework.beans.factory.annotation.Autowired;
57
import org.springframework.boot.test.context.SpringBootTest;
8+
import org.springframework.kafka.core.KafkaTemplate;
69
import org.springframework.test.context.junit4.SpringRunner;
710

811
@RunWith(SpringRunner.class)
912
@SpringBootTest
1013
public class SpringBootDemoMqKafkaApplicationTests {
14+
@Autowired
15+
private KafkaTemplate<String, String> kafkaTemplate;
1116

17+
/**
18+
* 测试发送消息
19+
*/
1220
@Test
13-
public void contextLoads() {
21+
public void testSend() {
22+
kafkaTemplate.send(KafkaConsts.TOPIC_TEST, "hello,kafka...");
1423
}
1524

1625
}

0 commit comments

Comments
 (0)