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. 地铁查询app 结对作业三

    经过今天一下午的奋斗 安卓app 只剩下最难的部分了 最短路径问题 我们考虑用迪杰斯特拉算法 不过 没有做出来 还要继续去学习一下这个代码 并寻求网上代码的帮助

  2. 函数式表达式基本类型及固定类型 demo

    1.常见类型及使用 import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.ut ...

  3. Illegal character ((CTRL-CHAR, code 31))问题排查 gzip接口返回 RestTemplate GET POST请求

    Illegal character ((CTRL-CHAR, code 31))问题排查 gzip接口返回 #接口返回gzip方式 private static final String ENCODI ...

  4. pytest_重写pytest_sessionfinish方法的执行顺序_结合报告生成到发送邮件

    背景: Python + pytest+pytest-testreport生成测试报告,到了生成报告之后,想要发送邮件,之前的方案是配合Jenkins,配置报告的路径进行发送 如果是平时的跑的项目,没 ...

  5. C++中UNIX时间戳与日期互转

    C++中UNIX时间戳与日期互转 使用time.h头文件 localtime 可以把时间戳转为 tm 结构体, tm结构体中可以格式化输出时间 mktime可以把tm结构体转为时间戳 tm 结构体中: ...

  6. OpenLiveWriter的代码高亮插件

    可参考如下方法: https://www.cnblogs.com/mq0036/p/12101912.html 0. 最新插件下载地址:Memento.OLW_V1.0.0.5.7z 1. 找到Ope ...

  7. 在Linux驱动中使用notifier通知链

    在Linux驱动中使用notifier通知链 背景 在驱动分析中经常看到fb_notifier_callback,现在趁有空学习一下. 介绍 linux中的观察者模式是最显然的就是"通知链& ...

  8. 高通android QMI机制

    高通android QMI机制 原文(有删改):https://blog.csdn.net/u012439416/category_7004974 概论 Qualcomm MSM Interface, ...

  9. 高通平台UEFI有关介绍

    高通平台UEFI有关介绍 背景 我需要在高通平台上学习点亮LCD,目前通过同事在别的平台的配置代码,我已经将kernel部分的屏幕点亮了:剩余的工作量就在BP侧,也就是系统刚开机的那一段时间.在开发过 ...

  10. 洛谷P1176

    #include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...