1.背景

在实际开发中,经常会遇到支付需求,当然就会有支付对账的需求....

2.项目结构

3.代码

3.1.线程池配置对象

@Configuration
@EnableAsync
public class ExecutorConfig {
/**
* @return
*/
@Bean
public Executor asyncServiceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(30);
//配置最大线程数
executor.setMaxPoolSize(40);
//配置队列大小
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}

3.2.controller层代码

@RestController
public class BillController {
@Autowired
private IBillService billService;
/**
* 下载对账单
*
* @return
*/
@RequestMapping("/api/downBill")
public Object downBill() {
Object result = billService.billDown();
return "ok::" + result;
}
}

3.3.业务层代码-下载

/**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 10/30 11:27
* @description <p>
* 以下载支付宝对账单为案例进行演示
* 接口文档:https://opendocs.alipay.com/open/02ivbw
* 关于支付支付课程可以查看:https://www.cnblogs.com/newAndHui/p/14258491.html
* </p>
*/
@Service
@Slf4j
public class BillServiceImpl implements IBillService {
@Autowired
private IOrderService orderService; @Override
public Object billDown() {
// 以下载支付宝对账单为案例进行演示
// 这里模拟一个对账文件
ExcelReader reader = ExcelUtil.getReader(FileUtil.file("F:\\test\\t1.xlsx"));
// 分页取值,每页10条
boolean flag = true;
int pageIndex = 1;
int pageSize = 10;
int sum = 0;
while (flag) {
int startIndex = pageSize * (pageIndex - 1) + 1;
int endIndex = startIndex + pageSize - 1;
List<Map<String, Object>> list = reader.read(0, startIndex, endIndex);
int size = list.size();
if (size > 0) {
sum += size;
// 异步保存数据
orderService.saveBillOrder(list);
}
if (list.size() < pageSize) {
flag = false;
} else {
pageIndex++;
}
}
return "共:" + sum + "交易记录";
}
}

3.4.业务层代码-保存

@Service
@Slf4j
public class IOrderServiceImpl implements IOrderService {
@Override
@Async("asyncServiceExecutor")
public void saveBillOrder(List<Map<String, Object>> list) {
int size = list.size();
log.info("保存数据:" + size);
int i = 1;
for (Map<String, Object> bIllOrder : list) {
log.info("保存第:" + i + "/" + size + ",bIllOrder=" + bIllOrder);
// 模拟保存耗时(0到5秒)
ThreadUtil.sleepRandom();
i++;
log.info("数据保存完成");
}
}
}

3.5.对账文件模板

4.测试

    @Test
void downBill() {
String url = "http://localhost:8001/api/downBill";
HttpRequest request = HttpUtil.createGet(url);
String response = request.execute().body();
System.out.println(response);
}

测试结果:

5.完美!

JUC高并发编程(二)之多线程下载支付宝对账文件的更多相关文章

  1. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  2. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. Java 多线程高并发编程 笔记(一)

    本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...

  4. 多线程高并发编程(3) -- ReentrantLock源码分析AQS

    背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...

  5. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  6. java线程高并发编程

    java线程具体解释及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了.看看百度百科对他的评价,一点也不为过: 假设IT的历史 ...

  7. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  8. java高并发编程(一)

    读马士兵java高并发编程,引用他的代码,做个记录. 一.分析下面程序输出: /** * 分析一下这个程序的输出 * @author mashibing */ package yxxy.c_005; ...

  9. 关于Java高并发编程你需要知道的“升段攻略”

    关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...

  10. Java高并发编程基础三大利器之CountDownLatch

    引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...

随机推荐

  1. Centos7部署FytSoa项目至Docker——第二步:安装Mysql、Redis

    FytSoa项目地址:https://gitee.com/feiyit/FytSoaCms 部署完成地址:http://82.156.127.60:8001/ 先到腾讯云申请一年的云服务器,我买的是一 ...

  2. StringUtils.join()方法使用

    * StringUtils.join()方法使用 打印输出: * 使用 StringBuilder 进行拼接:张三,李四,王五 * 使用 StringUtils.join 进行拼接:张三,李四,王五 ...

  3. 上交大开源镜像站下架 Docker Hub 镜像

    ​ 在现代软件开发中,Docker镜像已经成为不可或缺的工具.然而,最近频频出现的Docker镜像下架事件让许多开发者措手不及.突然失去依赖的镜像,不仅打乱了项目进程,还引发了许多不便.那么,面对Do ...

  4. java 编程思想--个人总结

    从应用开始思考----思考解题思路--将思路分解成一步一步的步骤-----根据每一步的步骤思考如何用代码实现-- -- 不要心急,可以一块一块来完成-- 最后再思考如何用代码实现每两块之间的连接--- ...

  5. WIN 11 共享设置

    我的电脑 -> 管理 -> 用户 -> 解除 GUEST 禁用 gpedit.msc -> 计算机管理 -> 本地 -> 从网络上访问本机 -> 允许GUES ...

  6. 韦东山freeRTOS系列教程之【第九章】任务通知(Task Notifications)

    目录 系列教程总目录 概述 9.1 任务通知的特性 9.1.1 优势及限制 9.1.2 通知状态和通知值 9.2 任务通知的使用 9.2.1 两类函数 9.2.2 xTaskNotifyGive/ul ...

  7. WEB前端项目开发流程

    项目需求分析 这个环节是由项目经理完成,项目经理首先和客户进行交流,了解客户的需求,然后分析项目的可行性,如果项目可以被实现,项目经理写出项目需求文档交给设计师完成后续的开发. 页面设计 这个环节主要 ...

  8. SpringBoot自定义全局异常返回页面

    返回自定义异常界面,需要引入thymeleaf依赖(非必须,如果是简单的html界面则不用) <dependency> <groupId>org.springframework ...

  9. Spring MVC 中 HttpMessageConverter 转换器

    1. Spring MVC 中 HttpMessageConverter 转换器 @ 目录 1. Spring MVC 中 HttpMessageConverter 转换器 2. 补充:什么是 HTT ...

  10. Tiny RDM 刚上线就收获一众好评的Redis桌面开源客户端!值得拥有!

    相信对Redis有频繁操作需求的用户,大部分会选择一个顺手的图形化界面工具来代替手动命令行操作以提高效率.Tiny RDM作为一款现代化轻量级的跨平台Redis桌面客户端,为用户提供了便捷高效的Red ...