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. java怎样把两个list里边相同的数据取出

    1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class I { 5 6 public static void m ...

  2. mongodb安装及启动配置文件,允许远程访问连接

    windows安装https://www.runoob.com/mongodb/mongodb-window-install.html https://www.runoob.com/mongodb/m ...

  3. spring使用jdk17运行出现编码问题

    遇到一个比较奇怪的问题. 这个问题别人也遇到过. https://blog.csdn.net/gao_chuan_g/article/details/115117712 一.情况简介 使用jdk17+ ...

  4. Abp vNext 模块化系统简单介绍

    怎么使用模块1. 建立模块直接的依赖关系,可以通过DependsOnAttribute特性来确定依赖关系2. 先配置模块,实现为模块填充数据和功能设置.3. 使用模块提供的功能接口 怎么定义模块1. ...

  5. C语言:不定长结构体的实现方式

    需求 有时候,我们会遇到一些情况:数据前部分相同,但是后部分长度不固定:数据格式相似,只是尾缀的长度不同,例如某些数据包,需要不定长度. 为了能够同时使用上不同长度的数据.可以用以下的方式实现. 方案 ...

  6. 『vulnhub系列』Deathnote-1

    『vulnhub系列』Deathnote-1 下载地址: https://www.vulnhub.com/entry/deathnote-1,739/ 信息搜集: 使用nmap扫描存活主机,发现主机开 ...

  7. IEC61850方案分享,基于全志、瑞芯微国产平台实现!

    什么是IEC61850协议? IEC61850是一种用于在电力自动化系统中进行数据交换和控制的通信协议.它定义了一种标准化的通信和数据模型,以支持设备和系统之间的数据交换和互操作性. IEC61850 ...

  8. 全志A40i+Logos FPGA开发板(4核ARM Cortex-A7)硬件说明书(上)

    前 言 本文档主要介绍TLA40iF-EVM工业评估板硬件接口资源以及设计注意事项等内容. 核心板的ARM端和FPGA端的IO电平标准一般为3.3V,上拉电源一般不超过3.3V,当外接信号电平与IO电 ...

  9. K210开发板学习笔记-点亮LED灯

    1. 介绍 和 51 单片机非常像,实验的2个LED灯都是一头接了 +3.3v 电源,控制 LED灯亮的话需要 K210芯片 对应的管脚提供一个低电平. 管脚: 低电平-LED亮 高电平-LED灭 G ...

  10. Java反射机制原理详解

    什么是反射? Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息 ...