JUC高并发编程(二)之多线程下载支付宝对账文件
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高并发编程(二)之多线程下载支付宝对账文件的更多相关文章
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 多线程高并发编程 笔记(一)
本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...
- 多线程高并发编程(3) -- ReentrantLock源码分析AQS
背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- java线程高并发编程
java线程具体解释及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了.看看百度百科对他的评价,一点也不为过: 假设IT的历史 ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- java高并发编程(一)
读马士兵java高并发编程,引用他的代码,做个记录. 一.分析下面程序输出: /** * 分析一下这个程序的输出 * @author mashibing */ package yxxy.c_005; ...
- 关于Java高并发编程你需要知道的“升段攻略”
关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
随机推荐
- 讯飞有一个可以根据描述文本自动生成PPT的AI接口,有趣
文档:https://www.xfyun.cn/doc/spark/PPTGeneration.html 价格方面提供了免费1000点的额度,生成一次是10点,正好100次,如果要购买的话最低要购买1 ...
- 三月二十五日 安卓打卡app开发
今天完成了每月打卡次数统计功能 public static String count(String account) throws SQLException { Connection connecti ...
- OSI七层网络模型和TCP/IP四层模型
OSI七层网络模型 OSI: 开放系统互连参考模型是ISO制定的一个用于计算机或通信系统间互联的标准体系 OSI七层模型功能: 物理层: 七层模型的最底层,主要是物理介质传输媒介(网线或者无线),在不 ...
- C# pythonnet(2)_傅里叶变换(FFT)
Python代码如下 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据 data = pd.r ...
- 为什么不推荐使用Linq?
相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者! 这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq. 我爱Linq,Linq优雅万岁!!!( ...
- Apache Kylin(一)Kylin介绍
1. 传统大数据分析的问题 在基于Hadoop 生态的传统大数据分析中,主要使用的技术是MPP(Massively Parallel Processing)大规模并行处理和列式存储.MPP使用线性增加 ...
- C#/.NET这些实用的技巧和知识点你都知道吗?
前言 今天大姚给大家分享一些C#/.NET中的实用的技巧和知识点,它们可以帮助我们提升代码质量和编程效率,希望可以帮助到有需要的同学. .NET使用CsvHelper快速读取和写入CSV文件 本文主要 ...
- python_8 拆包、内置函数和高阶函数
一.查缺补漏 1. \t 子表符,用于对其二.拆包 1. 拆包:顾名思义就是将可迭代的对象如元组,列表,字符串,集合,字典,拆分出相对应的元素 2. 形式:拆包一般分两种方式,一种是以变量的方式来接收 ...
- 【ClickHouse】2:clickhouse基本语法
背景介绍: 有三台CentOS7服务器安装了ClickHouse HostName IP 安装程序 程序端口 centf8118.sharding1.db 192.168.81.18 clickhou ...
- ABP框架开发实例教程-生成数据库
因为用SQLSERVER数据库比较多,这里就以SQLSERVER2014为例,下面说一下生成步骤: 1.用VS2019打开生成的ABP框架源码的解决方案,先修改web.mvc.web.host两个项目 ...