kafka原理和实践(二)spring-kafka简单实践

系列目录

kafka原理和实践(一)原理:10分钟入门

kafka原理和实践(二)spring-kafka简单实践

kafka原理和实践(三)spring-kafka生产者源码

kafka原理和实践(四)spring-kafka消费者源码

kafka原理和实践(五)spring-kafka配置详解

kafka原理和实践(六)总结升华

 

 

=========正文分割线====================

作为一个MQ做基本的功能自然就是消息的生产和消费,本章以XML配置的方式实现消息的生产和消费。

一、生产者

1.1.配置

spring-kafka 提供了org.springframework.kafka.core.KafkaTemplate

xml配置如下,producerProperties中的具体配置暂时不用在意,后面有一章专门讲xml配置

 1 
 2  3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans  
 5          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
 6          http://www.springframework.org/schema/context  
 7          http://www.springframework.org/schema/context/spring-context.xsd">
 8     
 9     
10     producerProperties" class="java.util.HashMap">
11         
12             
13                 
14                 
15                 
16                 
17                 
18                             
20                               
22                 23                     value="org.apache.kafka.common.serialization.StringSerializer" />
24                 25                     value="org.apache.kafka.common.serialization.StringSerializer" />
26             
27         
28     
29 
30     
31     producerFactory"
32         class="org.springframework.kafka.core.DefaultKafkaProducerFactory">
33         
34             
35         
36     
37 
38     
39     kafkaTemplate" class="org.springframework.kafka.core.KafkaTemplate">
40         
41         
42         
43     
46   

如上图,xml主要配置了KafkaTemplate的构造参数producerFactory和autoFlush,对应了一个KafkaTemplate源码中的2参构造函数。

producerProperties:设置生产者公产需要的配置
producerFactory:定义了生产者工厂构造方法
kafkaTemplate:定义了使用producerFactory和是否自动刷新,2个参数来构造kafka生产者模板类。

1.2  发送kafka消息

1.根据topic、partition、key发送数据data。

2.接收ListenableFuture添加成功、失败回调函数。

 1 ListenableFuture> listenableFuture = kafkaTemplate.send("topic", "partition","key","data");
 2 //发送成功回调
 3 SuccessCallback> successCallback = new SuccessCallback>() {
 4     @Override
 5     public void onSuccess(SendResult result) {
 6        //成功业务逻辑
 7     }
 8 }
 9 //发送失败回调
10 FailureCallback failureCallback = new FailureCallback() {
11     @Override
12     public void onFailure(Throwable ex) {
13         //失败业务逻辑
14     }
15 }
16 listenableFuture.addCallback(successCallback, failureCallback);

二、消费者

2.1配置

consumerProperties中的具体配置暂时不用在意,后面有一章专门讲xml配置
 1 
 2     consumerProperties" class="java.util.HashMap">
 3         
 4             
 5                 
 6                 
 7                 
 8                 
 9                 10                     value="org.apache.kafka.common.serialization.StringDeserializer" />
11                 12                     value="org.apache.kafka.common.serialization.StringDeserializer" />
13             
14         
15     
16 
17     
18     consumerFactory"
19         class="org.springframework.kafka.core.DefaultKafkaConsumerFactory" >
20         
21             
22         
23     
24 
25     
26     kafkaConsumerService" class="xxx.service.impl.KafkaConsumerSerivceImpl" />
27 
28     
29     containerProperties" class="org.springframework.kafka.listener.config.ContainerProperties">
30         
31         
32             
33                 ${kafka.consumer.topic.credit.for.lease}
34                 ${loan.application.feedback.topic}
35                 ${templar.agreement.feedback.topic}
36                 ${templar.aggrement.active.feedback.topic}
37                 ${templar.aggrement.agreementRepaid.topic}
38                 ${templar.aggrement.agreementWithhold.topic}
39                 ${templar.aggrement.agreementRepayRemind.topic}
40             
41         
42         messageListener" ref="kafkaConsumerService" />
43     
44     
45     messageListenerContainer" class="org.springframework.kafka.listener.ConcurrentMessageListenerContainer" init-method="doStart" >
46         
47         
48         
49     
1.consumerProperties-》consumerFactory  载入配置构造消费者工厂
2.messageListener-》containerProperties 载入容器配置(topics)
3.consumerFactory+containerProperties-》messageListenerContainer 容器配置(topics)+消息监听器,构造一个并发消息监听容器,并执行初始化方法doStart

2.2消费kafka消息

方案1:直接实现MessageListener接口,复写onMessage方法,实现自定义消费业务逻辑。

 1 public class KafkaConsumerSerivceImpl implements MessageListener {
 2     @Override
 3     public void onMessage(ConsumerRecord data) {
 4         //根据不同主题,消费
 5         if("主题1".equals(data.topic())){
 6             //逻辑1
 7         }else if("主题2".equals(data.topic())){
 8             //逻辑2
 9         }
10     }
11 }

方案2:使用@KafkaListener注解,并设置topic,支持SPEL表达式。这样方便拆分多个不同topic处理不同业务逻辑。(特别是有自己的事务的时候,尤其方便)

1 import org.springframework.kafka.annotation.KafkaListener;
2 
3 public class KafkaConsumerSerivceImpl {
4     @KafkaListener(topics = "${templar.aggrement.agreementWithhold.topic}")
5     void templarAgreementNoticewithhold(ConsumerRecord data){
6        //消费业务逻辑
7     }
8 }

三、总结

本章我们实现了一个简单的kafka生产、消费消息的实践。到这里我们已经会基本使用kafka了。是不是很简单...

下一章,我们从源码角度来深入分析spring-kafka。

 

你可能感兴趣的:(kafka原理和实践(二)spring-kafka简单实践)