【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(三)

本文详细介绍了如何使用SpringBoot、EasyPoi和Redis消息队列实现Excel文件的批量异步导入数据库。通过Lombok和EasyPoi处理Excel数据,设置文件上传限制,利用Redis缓存和消息队列处理数据验证和消费,同时实现了前端的轮询机制和消息确认(ack)模拟。文章还涵盖了数据同步结果的处理和导出功能的实现。
摘要由CSDN通过智能技术生成

【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一)
【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(二)
【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(三)
【效果演示】:JavaWeb毕业设计项目-足球队管理系统(四)引入Excel_To_DB项目+源码
【码云地址】:https://gitee.com/ydc_coding

ExcelModel.java:

package com.ydc.excel_to_db.domain;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.constraints.Max;
import javax.validation.constraints.Pattern;
import java.util.Date;

/**
 * @Description: 为了方便扩展,这里的字段命名规则为col[列]+1[列数]
 * 例如:col1代表的就是第一列的数据,通过@Excel(name=?)注解进行区分
 * @Author: 杨东川【http://blog.csdn.net/yangdongchuan1995】
 * @Date: Created in  2018-2-6
 */
@Data
public class ExcelModel {
   
    // 官方文档 http://easypoi.mydoc.io/
    @Excel(name = "序号")
    @NotBlank(message = "该字段不能为空")
    @Max(value = 1000)
    private String col1;
    @Excel(name = "姓名")
    @Pattern(regexp = "[\\u4E00-\\u9FA5]{2,5}", message = "姓名中文2-5位")
    private String col2;
    @Excel(name = "性别")
    private String col3;
    @Excel(name = "出生年月", format = "yyyy.MM.dd")
    private Date col4;
    @Excel(name = "民族")
    private String col5;
    @Excel(name = "籍贯")
    private String col6;
    @Excel(name = "文化程度")
    private String col7;
    @Excel(name = "参工时间", format = "yyyy.MM")
    private Date col8;
    @Excel(name = "政治面貌")
    private String col9;
    @Excel(name = "职务")
    private String col10;
    @Excel(name = "现处室时间", format = "yyyy.MM")
    private Date col11;
    @Excel(name = "任现职位时间", format = "yyyy.MM")
    private Date col12;
    @Excel(name = "任现职级时间", format = "yyyy.MM")
    private Date col13;
    @Excel(name = "职称")
    private String col14;
    @Excel(name = "执业资格")
    private String col15;
    @Excel(name = "进局时间", format = "yyyy.MM")
    private Date col16;
    @Excel(name = "实务导师")
    private String col17;
    @Excel(name = "备注")
    private String col18;

    public String getCol2() {
        return col2;
    }
}

说明:
- 这里使用了lombok的@Data注解与easypoi的@Excel注解,还有一些其他格式校验的注解。
- 这里我把字段名设置命名规则设置为col[列]+1[列数],例如:col1代表的就是第一列的数据,通过@Excel(name=?)注解进行区分。

为什么不直接写成例如姓名-username,性别-sex这类对应的中文含义的英文字母呢?

  • 这是因为考虑到导入的数据是可变的,有可能这次需要将“全市审计人员花名册”导入数据库,下次就变换成将“审计机关全覆盖情况”导入数据库。
  • 与其每次变动都更改字段名不如直接把字段名按一定规则设置好,后期只需要通过改变@Excel注解中的值就可以了,此外对应的Mapper中的sql语句也只需要更改操作对应数据库表的字段名即可。

Lombok与EasyPoi环境依赖:

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- easypoi -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.0.3</version>
        </dependency>

下面开始贴从上传Excel至返回第一层操作结果的代码及业务逻辑说明(Excel数据格式校验结果)
importExcel.html中上传方法js:

    layui.use('upload', function () {
   
        var $ = layui.jquery
            , upload = layui.upload;
        //拖拽上传
        upload.render({
            elem: '#test10'
            , url: '/doImport/'
            , method: 'post' //默认就是post
            , accept: 'file'
            , size: 20 * 1024
            , before: function (obj) {
    //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
                layer.load(); //上传loading
            }
            , done: function (res, index, upload) {
   
                layer.closeAll('loading'); //关闭loading
                //假设code=0代表上传成功
                if (res.code == 0) {
                    // 0 : 上传文件格式通过
                    if (res.data.code == 0) {
                        //询问框
                        layer.confirm(res.data.msg, {
                            icon: 6,
                            title: '恭喜您,数据上传成功!',
                            btn: ['需要', '不需要'] //按钮
                        }, function () {
   
                            checkUndoSize();
                        }, function () {
   
                            layer.confirm('真的不需要查看数据同步结果吗?
Redis消息队列是指利用Redis实现的一种基于发布/订阅模式的消息传递机制。它可以实现异步处理任务,提高系统性能并且可以扩展到分布式系统中。下面进行详细讲解。 ## 一、Redis消息队列的原理 Redis消息队列实现原理是利用Redis的发布/订阅机制,通过将消息发送者称为“发布者”,将消息接收者称为“订阅者”,实现消息的传递和处理。 在Redis消息队列中,发布者将消息发布到一个频道中,订阅者从该频道中获取消息,完成相应的处理。具体流程如下: 1. 发布者将消息发布到指定频道中。 2. 订阅者向Redis服务器订阅指定频道的消息。 3. Redis服务器将频道中的消息推送给所有订阅该频道的订阅者。 4. 订阅者接收到消息后,执行相应的操作。 ## 二、Redis消息队列的应用 1. 异步任务处理 当需要执行耗时的任务时,可以使用Redis消息队列实现异步处理,将任务放入队列中,由消费者进行处理,从而避免阻塞主线程,提高系统性能。 2. 实时消息推送 当需要向多个客户端实时推送消息时,可以使用Redis消息队列实现,将消息发布到指定频道中,订阅该频道的客户端即可接收到消息。 3. 日志处理 当需要将日志记录到文件或者数据库中时,可以使用Redis消息队列实现,将日志信息放入队列中,由消费者进行处理,从而提高系统性能。 ## Redis消息队列的代码实现 Python代码实现Redis消息队列: ```python import redis class RedisQueue(object): def __init__(self, queue_name, redis_host='localhost', redis_port=6379): """ 初始化Redis连接 """ self.redis_conn = redis.StrictRedis(host=redis_host, port=redis_port, db=0) self.queue_name = queue_name def put(self, data): """ 将数据放入队列 """ self.redis_conn.rpush(self.queue_name, data) def get(self, block=True, timeout=None): """ 从队列中获取数据 """ if block: data = self.redis_conn.blpop(self.queue_name, timeout=timeout) else: data = self.redis_conn.lpop(self.queue_name) if data: return data.decode('utf-8') else: return None ``` 其中,put方法将数据放入队列,get方法从队列中获取数据。 使用示例: ```python queue = RedisQueue('test_queue') queue.put('hello world') data = queue.get() print(data) ``` 以上就是Redis消息队列的详细讲解和代码实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值