使用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. nexus 离线更新索引

    1.到http://repo.maven.apache.org/maven2/.index/页面下载下面这两个文件: nexus-maven-repository-index.gz nexus-mav ...

  2. curl命令(测试连接命令)

    curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS.f ...

  3. HDU 1023 Train Problem II 大数打表Catalan数

    一个出栈有多少种顺序的问题.一般都知道是Catalan数了. 问题是这个Catalan数非常大,故此须要使用高精度计算. 并且打表会速度快非常多.打表公式要熟记: Catalan数公式 Cn=C(2n ...

  4. HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...

  5. reload基础

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #reload基础 #与import和from的不同之处: #reload是python的内置函数,而不是语句 ...

  6. python之模块csv之 读取CSV文件(reader和DictReader2个方法)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #读取CSV文件(reader和DictReader2个方法) import csv #csv文件,是一种常用 ...

  7. ModelAndView 配置与使用

    一,ModelAndView 介绍: 1)ModelAndView 用于后台与前端页面交互: 2)可以用于重定向与转发到指定页面, 3)可以保存数据然后渲染到页面 二,使用: 1)在Controlle ...

  8. Android 4 编程入门经典

    这是一本入门级的经典教才从Android编程入门到发布Android应用程序,每一个章节都是讲得很透,让人轻松的接受. 第1章 Android编程入门 1.1 Android简介 1.1.1 Andr ...

  9. RMAN - 发现I/O瓶颈

    大多数操作系统支持异步I/O. 备份到磁盘,异步I/O是一个优势,因为一个服务器进程同时可以执行多个I/O操作:同步I/O必须等上一个I/O操作完成才可以执行下一个I/O操作. 初始化参数disk_a ...

  10. [ASP.NET]HttpCookieCollection to CookieCollection的最简单方法

    http://www.cnblogs.com/dudu/archive/2012/12/06/httpcookiecollection-to-cookiecollection.html