使用spring+springMVC+mybatis+kafka做了两个web项目,一个是生产者,一个是消费者。

通过JMeter测试工具模拟100个用户并发访问生产者项目,发送json数据给生产者的接口,生产者将json数据发送到kafka集群,

消费者监听到kafka集群中的消息就开始消费,并将json解析成对象存到MySQL数据库。

下面是使用JMeter测试工具模拟100个并发的线程设置截图:

请求所发送的数据:

下面是100个用户10000个请求的聚合报告:

下面是生产者截图生产完10000条消息的时间截图:

下面是消费者项目消费入库的结束时间截图:

可见,10000条消息从生产完成到入库(消费完10000条消息的时间只是比生产完成的时间落后了几十秒,但是消费端真正入库完成所需要的时间很长)完成时间相差了10几分钟。

下面是MySQL数据库截图,数据全部入库成功:

下面是消息对应的POJO:

 package com.xuebusi.pojo;

 public class TbPerson {
private Long id; private String name; private Integer age; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name == null ? null : name.trim();
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "TbPerson [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

下面是生产端的逻辑:

 package com.xuebusi.controller;

 import com.alibaba.fastjson.JSON;
import com.xuebusi.pojo.TbPerson;
import com.xuebusi.service.KafkaService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; @Controller
@RequestMapping("/producer")
public class KafkaController { private static final Logger logger = LoggerFactory.getLogger(KafkaController.class); @Resource
private KafkaService kafkaService; /**
* 发消息到ssmk这个topic
* @param person
* @return
*/
@RequestMapping(value = "/person", method = RequestMethod.POST)
@ResponseBody
public String createPerson(@RequestBody TbPerson person) {
if (person == null){
return "fail, data can not be null.";
}
String json = JSON.toJSONString(person);
boolean result = kafkaService.sendInfo("ssmk", json);
logger.info("生产者发送消息[" + result + "]:" + json);
return "success";
}
}

下面是消费端的逻辑:

 package com.xuebusi.consumer;

 import com.alibaba.fastjson.JSON;
import com.xuebusi.pojo.TbPerson;
import com.xuebusi.service.PersonService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List;
import java.util.Map; @Service
public class KafkaConsumerService {
private static final Logger logger = LoggerFactory.getLogger(KafkaConsumerService.class); @Autowired
private PersonService personService; public void processMessage(Map<String, Map<Integer, String>> msgs) {
/*for (Map.Entry<String, Map<Integer, String>> entry : msgs.entrySet()) {
String topic = entry.getKey();
Map<Integer, String> value = entry.getValue();
for (Map.Entry<Integer, String> entrySet : value.entrySet()) {
Integer partiton = entrySet.getKey();
String msg = entrySet.getValue();
logger.info("消费的主题:" + topic + ",消费的分区:" + partiton + ",消费的消息:" + msg);
logger.info("=======使用JSON解析对象=========");
TbPerson person = JSON.parseObject(msg, TbPerson.class);
logger.info("=======对象开始入库=========");
personService.insert(person);
logger.info("=======对象入库成功=========");
}
}*/ for (Map.Entry<String, Map<Integer, String>> entry : msgs.entrySet()) {
String topic = entry.getKey();
Map<Integer, String> value = entry.getValue();
for (Map.Entry<Integer, String> entrySet : value.entrySet()) {
Integer partiton = entrySet.getKey();
String msg = entrySet.getValue();
logger.info("消费的主题:" + topic + ",消费的分区:" + partiton + ",消费的消息:" + msg);
msg = "[" + msg + "]";//注意这里要在前后都加上中括号,否则下面在解析json成对象的时候会报json格式不对的异常(spring会对多条json数据用逗号分隔)
logger.info("=======使用JSON解析对象=========");
List<TbPerson> personList = JSON.parseArray(msg, TbPerson.class);
//TbPerson person = JSON.parseObject(msg, TbPerson.class);
if (personList != null && personList.size() > 0) {
logger.info("消息中包含[" + personList.size() + "]个对象");
for (TbPerson person : personList) {
logger.info("=======对象开始入库=========");
personService.insert(person);
logger.info("=======对象入库成功=========");
}
} }
}
}
}

如果觉得本文对您有帮助,不妨扫描下方微信二维码打赏点,您的鼓励是我前进最大的动力:

spring整合kafka项目生产和消费测试结果记录(一)的更多相关文章

  1. c语言使用librdkafka库实现kafka的生产和消费实例(转)

    关于librdkafka库的介绍,可以参考kafka的c/c++高性能客户端librdkafka简介,本文使用librdkafka库来进行kafka的简单的生产.消费 一.producer librd ...

  2. c# .net 使用Confluent.Kafka针对kafka进行生产和消费

    首先说明一点,像Confluent.Kafka这种开源的组件,三天两头的更新.在搜索引擎搜索到的结果往往用不了,浪费时间.建议以后遇到类似的情况直接看官网给的Demo. 因为搜索引擎搜到的文章,作者基 ...

  3. spring 整合kafka监听消费

    前言 最近项目里有个需求,要消费kafka里的数据.之前也手动写过代码去消费kafka数据.但是转念一想.既然spring提供了消费kafka的方法.就没必要再去重复造轮子.于是尝试使用spring的 ...

  4. spring整合kafka(配置文件方式 消费者)

    Kafka官方文档有   https://docs.spring.io/spring-kafka/reference/htmlsingle/ 这里是配置文件实现的方式 先引入依赖 <depend ...

  5. spring整合hibernate之买书小测试

    spring来整合hibernate就是用spring来管理hibernate的sessionFactory和让hibernate来使用spring的声明式事务. 一:加入相应的jar包. 二:写hi ...

  6. spring整合kafka(配置文件方式 生产者)

    Kafka官方文档有   https://docs.spring.io/spring-kafka/reference/htmlsingle/ 这里是配置文件实现的方式 先引入依赖 <depend ...

  7. spring整合web项目

    Web项目如何初始化SpringIOC容器 :思路:当服务启动时(tomcat),通过监听器将SpringIOC容器初始化一次(该监听器 spring-web.jar已经提供),web项目启动时 ,会 ...

  8. 关闭spring整合kafka时,消费者一直打印kafka日志

    在log4j.properties中添加如下代码 log4j.logger.org.apache.kafka.common.metrics.Metrics=OFF log4j.logger.org.a ...

  9. Spring整合Web项目原理-理解不了,忽略

随机推荐

  1. HDU 4847 陕西邀请赛A(水)

    HDU 4847 Wow! Such Doge! pid=4847" style="">题目链接 题意:给定文本,求有几个doge,不区分大写和小写 思路:水题.直 ...

  2. 〖Linux〗Ubuntu13.10,配置tftp服务器

    前言,配置了好久没有发现老是出问题tftp: server error: (2) Access violation,一般侦测之后... 1. 安装软件包:apt-getsudo apt-get ins ...

  3. Eclipse常用且不易记快捷键

    大小写转换:CTRL+SHIFT+X,Y 复制行:CTRL+ALT+↑,↓(部分无法使用) 查看继承关系:CTRL+T 直接查看系统源码:CTRL+SHIFT+T 查看所有快捷键:CTRL+SHIFT ...

  4. 【laravel54】关于用户权限认证RBAC和无限极分类

    1.权限认证方面: https://packagist.org/packages/spatie/laravel-permission 用户认证 HTTP本身是无状态,通常在系统交互的过程中,使用账号或 ...

  5. url-pattern配置

    <url-pattern>/a</url-pattern> <url-pattern>/ff.do</url-pattern> <url-patt ...

  6. HUDOJ-----1394Minimum Inversion Number

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  7. HDUOJ-----2824The Euler function

    The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. 常见Web前端开发笔试题

    1.什么是web标准? WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为 (Behavior). 对应的标准也分 ...

  9. 修改注册表值解决ie被恶意窜改的问题

    修改注册表值解决ie被恶意窜改的问题 IE消失 运行—Regedit 主键HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDes ...

  10. JQueryMobile开发必须的知道的知识(转)

    移动Web页面的基本组成元素: 页面头部,页面内容,页面底部 <!DOCTYPE html> <html> <head> <title>My Page& ...