【CouponHub项目开发】EasyExcel解析Excel并使用线程池异步执行和延时队列兜底

文章目录

为什么使用Excel

因为在特定电商场景下,可能会出现比如有的平台会根据用户的喜好从而生成一些用户画像,企业再从画像平台去获取特定喜好的用户,会得到一个Excel表格。

为什么使用线程池进行异步执行

因为如果表格的内容很多,百万级别的数据。那么如果是单线程运行情况下,会导致用户等待大量时间使用线程池异步执行则可以直接返回用户操作成功的响应,而真正的操作是交给后台线程异步执行的

为什么使用延时队列进行兜底

因为如果任务刚提交到线程池当中就宕机了,那么线程池当中的任务就不会执行了,为了解决这种情况,采用延时队列进行兜底。

首先定义EasyExcel中的行数监听器

创建优惠券分发任务,并将其存入数据库当中。

然后通过线程池去异步执行更新数据库当中优惠券分发任务的sendnum字段。

然后创建一个阻塞队列,然后基于这个阻塞队列创建一个延时队列

delayedQueue.offer(delayJsonObject, 20, TimeUnit.SECONDS);作用是:设置延时时间,到时间后将延时队列里的信息传到阻塞队列中,这也是为什么能从阻塞队列中获取delayJsonObject的原因

接着我们定义一个延时队列的消费者。他在项目运行时创建一个线程,去获取Redis当中的阻塞队列。然后不断循环去获取阻塞队列中的delayJSON,然后再根据delayJSON中的id去查询数据库,判断数据库中这个优惠券分发任务的分发数量是否为0.如果为0说明线程池没有去执行 refreshCouponTaskSendNum方法,然后让该线程去执行。

线程池的核心参数

1.核心线程数

2.最大线程数

3.工作队列

4.keepAliveTime

5.keepAliveTime的单位unit

6.ThreadFactory

7.handler拒绝策略

拒绝策略有哪些

1.CallerRunsPolicy使用线程池的调用者所在的线程去执行被拒绝的任务

2.AbortPolicy直接抛出异常

3.DiscardPolicy直接拒绝,不做任何处理

4.DiscardOldestPolicy抛弃最老的,然后执行该任务

相关推荐
认真的酒窝9 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
白帽小丑9 小时前
# 一次 MySQL DELETE 误操作的数据恢复尝试实录
数据库·mysql
wbs_scy10 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录91710 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
Quincy_Freak11 小时前
信创内网数据规范实践:银河麒麟下SQLite本地数据安全管理方案
数据库·sqlite·arm·数据库管理·大数据分析·银河麒麟·aarch64
Full Stack Developme12 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
2601_9626838913 小时前
治理遗留系统中的“生肉 SQL”:一次用多模型协作优化慢查询的实战复盘
数据库·人工智能·sql
酱学编程14 小时前
【从零到一实现一个 AI Agent 框架 · 第四篇】04. 任务规划:拆解复杂目标 -
服务器·网络·数据库·人工智能
程序员老油条14 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
shushangyun_15 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习