SpringBoot整合Kafka
Kafka是当前较为流行的消息中间件,具有提供消息的持久化、高吞吐量 、支持通过Kafka服务器和消费机集群来分区消息、支持Hadoop并行数据加载等特点,被广泛用在企业级开发中。SpringBoot为当前Spring推出的敏捷开发框架,简化了Spring的样式化配置,使开发人员从模式化的配置文件中解放出来,专注于业务逻辑的开发。因此本文将当前流行的SpringBoot与消息中间件Kafka进行整合。
主要工程目录结构如下:
一、配置pom文件引入依赖
Kafka依赖:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
阿里fastjson依赖:主要用来将发送的消息转换成json字符转,然后消费者在将其转换为javaBean对象
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.13</version>
</dependency>
配置文件:
spring:
kafka:
bootstrap-servers: localhost:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: test
enable-auto-commit: true
auto-commit-interval: 1000
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
实体类
import java.io.Serializable;
/**
* @Author: repator
* @Date: 2019/8/16 11:14
* @Description: 实体类
**/
@Data
public class UserTest implements Serializable {
private String Name;
private String Email;
private String address;
private int msgcode;
}
package com.lzh.domain;
import lombok.Data;
import java.io.Serializable;
/**
* @Author: repator
* @Date: 2019/8/16 14:36
* @Description:
**/
@Data
public class ResultData implements Serializable {
private UserTest data;
}
消息生产者
package com.lzh.service;
import com.alibaba.fastjson.JSONObject;
import com.lzh.domain.UserTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
/**
* @Author: lizhihui
* @Date: 2019/8/15 11:51
* @Description:
**/
@Component
public class MessageSender {
@Autowired
private KafkaTemplate kafkaTemplate;//kafka发送消息对象实例化
public void sendMessage(){
UserTest userTest=new UserTest();//创建一个对象
userTest.setAddress("安徽合肥");
userTest.setEmail("address@163.com");
userTest.setMsgcode(200);
userTest.setName("Tom");
JSONObject myjson=new JSONObject();//创建一个JSON
myjson.put("data",userTest);//将对象装成json对象
kafkaTemplate.send("nima",myjson.toJSONString());//发送json字符串,topic为nima
}
}
消息消费者
package com.lzh.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.lzh.domain.ResultData;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import java.util.Optional;
/**
* @Author: repator
* @Date: 2019/8/15 11:53
* @Description:
**/
@Component
public class MessageReceive {
@KafkaListener(topics = {"nima"})//topics的值必须为生产者指定的那个,可以订阅多个
public void receiveMessage(ConsumerRecord<?, ?> consumerRecord){
Optional<?> kafkaMessage = Optional.ofNullable(consumerRecord.value());
if(kafkaMessage.isPresent()){
//得到Optional实例中的值
Object message = kafkaMessage.get();
ResultData ut= JSON.parseObject(message.toString(),new TypeReference<ResultData>(){});//使用FasrJSON将json字符串转换成javabean对象
System.out.println("这是kafka消息");
System.out.println(ut.getData().getAddress());//控制台打印对象信息
System.out.println(ut.getData().getEmail());
System.out.println(ut.getData().getMsgcode());
System.out.println(ut.getData().getName());
}
}
}
测试controller
package com.lzh.Controller;
import com.lzh.service.MessageSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: lizhihui
* @Date: 2019/8/15 14:55
* @Description:
**/
@RestController
public class testcntroller {
@Autowired
private MessageSender messageSender;
@RequestMapping("test")
public String testkafa(){
messageSender.sendMessage();//调用消息生产者发送消息
return "success";
}
}
打开浏览器在地址栏输入:localhost:8080/test
看下控制台:生产者成功向kafka生产了消息,消费者已经成功得到消息。