使用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. top level element is not completed

    今天在使用IDEA配置springmvc文件时,出现类似在Android studio 中样式文件报top level element is not completed错,郁闷极了,找了好久 才找到解 ...

  2. [Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8932310 项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个 ...

  3. eclipse c++ 经常使用快捷键

    atl+/ //自己主动补全 ctrl+/ //凝视,或者去凝视 ctrl+shift+F //代码整理 ctrl+shift+G //跳转到调用的地方,或者,右键+Reference+Project ...

  4. 解决Android 4.0以上版本中OptionsMenu菜单不显示ICON图标的问题

    在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 Me ...

  5. 微信小程序裁剪图片成圆形

    代码地址如下:http://www.demodashi.com/demo/14453.html 前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在gith ...

  6. JSP,servlet和数据库之间传值出现乱码的问题

     近期困扰我非常久的一个问题最终攻克了,为他我头疼了好几天,问题是JSP通过servlet向数据库传值,查询显示在页面的时候出现了乱码,原先我数据库中有两行带有中文的数据,查询的时候倒是没有出现乱 ...

  7. js访问url和cookie

    function QueryString() { var data = []; this.Read = function() { var aPairs, aTmp; var queryString = ...

  8. 作业调度框架_Quartz

    什么是Quartz Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触发 ...

  9. memset(&a, 0, sizeof(struct customer))函数

    memset(&a, 0, sizeof(struct customer))函数定义在memory.h中,用于给指定的内存区域赋值,在该语句中,&a指定待赋值的内存首地址,0是要赋的值 ...

  10. NRF24L01使用外部中断读取数据的问题

    NRF24L01读取数据不能使用中断的方式,原因如下: 首先NRF24L01中断触发时,IRQ引脚会一直保持低电平直到状态寄存器中的中断标志被重新清零. stm32的外部中断触发方式只有上升沿或者下降 ...