redistemplate注入为null_SpringBoot项目:RedisTemplate实现轻量级消息队列

作者:wangzaiplus

原文链接:

http://www.jianshu.com/p/0c684076367e

背景

公司项目有个需求, 前端上传excel文件, 后端读取数据、处理数据、返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没人愿意傻等, 由于项目暂未使用ActiveMQ等消息队列中间件, 而redis的lpush和rpop很适合作为一种轻量级的消息队列实现, 所以用它完成此次功能开发

一、本文涉及知识点

  • excel文件读写--阿里easyexcel sdk

  • 文件上传、下载--腾讯云对象存储

  • 远程服务调用--restTemplate

  • 生产者、消费者--redisTemplate leftPush和rightPop操作

  • 异步处理数据--Executors线程池

  • 读取网络文件流--HttpClient

  • 自定义注解实现用户身份认证--JWT token认证, 拦截器拦截标注有@LoginRequired注解的请求入口

当然, Java实现咯

涉及的知识点比较多, 每一个知识点都可以作为专题进行学习分析, 本文将完整实现呈现出来, 后期拆分与小伙伴分享学习

二、项目目录结构

165287ceaf79eb35f09141d64bdf8ada.png

说明: 数据库DAO层放到另一个模块了, 不是本文重点

三、主要maven依赖

1.easyexcel

<easyexcel-latestVersion>1.1.2-beta4easyexcel-latestVersion>

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>${easyexcel-latestVersion}version>
        dependency>

2.JWT

        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwtartifactId>
            <version>0.7.0version>
        dependency>

3.redis

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-redisartifactId>
            <version>1.3.5.RELEASEversion>
        dependency>

4.腾讯cos

        <dependency>
            <groupId>com.qcloudgroupId>
            <artifactId>cos_apiartifactId>
            <version>5.4.5version>
        dependency>

四、流程

  • 用户上传文件

  • 将文件存储到腾讯cos

  • 将上传后的文件id及上传记录保存到数据库

  • redis生产一条导入消息, 即保存文件id到redis

  • 请求结束, 返回"处理中"状态

  • redis消费消息

  • 读取cos文件, 异步处理数据

  • 将错误数据以excel形式上传至cos, 以供用户下载, 并更新处理状态为"处理完成"

  • 客户端轮询查询处理状态, 并可以下载错误文件

  • 结束

五、实现效果

1.上传文件

08b1edbc890c9936df95dabcb17eb5b1.png

2.数据库导入记录

cfe44fdc5208818211fdf24078568fee.png

3.导入的数据

7123cab050c6ce512e9bf5fa65781559.png

4.下载错误文件

0ed2eac3af8a8788851e6fbc99b588ff.png

5.错误数据提示

c3afcaf6a9e7813acd759e0b6061dd40.png

6.查询导入记录

9e442a1869b87ad4028f97b93f2392f0.png

六、代码实现

1、导入excel控制层

    @LoginRequired
    @RequestMapping(value = "doImport", method = RequestMethod.POST)
    public JsonResponse doImport(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        PLUser user = getUser(request);
        return orderImportService.doImport(file, user.getId());
    }

2、service层

    @Override
    public JsonResponse doImport(MultipartFile file, Integer userId) {
        if (null == file || file.isEmpty()) {
            throw new ServiceException("文件不能为空");
        }

        String filename = file.getOriginalFilename();
        if (!checkFileSuffix(filename)) {
            throw new ServiceException("当前仅支持xlsx格式的excel");
        }

        // 存储文件
        String fileId = saveToOss(file);
        if (
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值