springboot-线程池简单使用
最近做项目,关于订单创建时候因为需要调用远程http服务获取数据,然后校验并写入数据库和修改数据库,
导致接口效率低,所以想到实现异步操作的方式解决。
在调用远程接口成功的时候即认为接口处理成功,返回给前段正确,并开启线程进行数据的写入和修改
1)添加配置类
package com.fieldsales.pos.config; import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor; /**
* @author :CX
* @Date :Create in 2019/3/29 10:42
* @Effect :线程池配置类
*/
@Configuration
@EnableAsync
@ConfigurationProperties(prefix = "async")
@Data
public class ExecutorConfig { private int corePoolSize;
private int maxPoolSize;
private int queueCapacity;
private String namePrefix; @Bean(name = "asyncServiceExecutor")
public Executor asyncServiceExecutor() {
System.err.println("初始化线程池-----");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(corePoolSize);
//配置最大线程数
executor.setMaxPoolSize(maxPoolSize);
//配置队列大小
executor.setQueueCapacity(queueCapacity);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix(namePrefix); // rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
} }
2)在配置文件中添加相应配置
#线程池配置
async:
# 配置核心线程数
corePoolSize:
# 配置最大线程数
maxPoolSize:
# 配置队列大小
queueCapacity:
# 配置线程池中的线程的名称前缀
namePrefix: async-createOrderService-
3) 注入使用
//注入线程池
@Autowired
private Executor asyncServiceExecutor; //上方代码接口调用成功 略
// 开启线程写入数据库数据
asyncServiceExecutor.execute(new Runnable() {
@Override
public void run() { //标记数据是否正常写入 , 如果数据写入数据库异常,则每10S写出一次异常日志
boolean isAddOrder = false;
// 数据写入的时间
String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()); try{
//开启事物写入数据
} catch (Throwable throwable) {
// 接口成功但是写入数据失败,则间隔抛出异常
while (true) {
logger.error("严重错误------------------------------------------------------------");
logger.error("订单【" + resultdata.get("orderno").toString() + "】销售成功,但写入现场售票数据库失败!");
logger.error("详情表: :" + JSON.toJSONString(orderInfos));
logger.error("订单表:" + JSON.toJSONString(tkttransFormModel));
logger.error("异常信息:" + throwable.getMessage());
logger.error("错误时间:" + format);
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
return HSResponse.ok(responsMap);
springboot-线程池简单使用的更多相关文章
- springboot 线程池
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 本 ...
- springboot线程池的使用和扩展(转)
springboot线程池的使用和扩展 我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行, ...
- springboot线程池的使用和扩展
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 本 ...
- springboot线程池@Async的使用和扩展
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 本 ...
- [开源项目]可观测、易使用的SpringBoot线程池
在开发spring boot应用服务的时候,难免会使用到异步任务及线程池.spring boot的线程池是可以自定义的,所以我们经常会在项目里面看到类似于下面这样的代码 @Bean public Ex ...
- SpringBoot 线程池配置 实现AsyncConfigurer接口方法
目的是: 通过实现AsyncConfigurer自定义线程池,包含异常处理 实现AsyncConfigurer接口对异常线程池更加细粒度的控制 *a) 创建线程自己的线程池 b) 对void ...
- SpringBoot线程池的创建、@Async配置步骤及注意事项
最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信.考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了. 但是 ...
- springboot线程池任务调度类 -- ThreadPoolTaskScheduler介绍
springboot中有一个bean,ThreadPoolTaskScheduler,可以很方便的对重复执行的任务进行调度管理:相比于通过java自带的周期性任务线程池ScheduleThreadPo ...
- Springboot 线程池配置
最近的项目里要手动维护线程池,然后看到一起开发的小伙伴直接用Java了,我坚信Springboot不可能没这功能,于是查了些资料,果然有,这里给一下. 首先我们都知道@Async标签能让方法异步执行, ...
- Callable、Future、线程池简单使用
Callable.Future与线程池 在创建新线程的三种方式中,继承Thread和实现Runnable接口两种方式都都没有返回值,因此当我们想要获取子线程计算结果时只能设置共享数据,同时还需要考虑同 ...
随机推荐
- GreenPlum学习笔记:date_part与extract提取日期时间、时间差
GP可以使用date_part / extract从日期时间类型中抽取部分内容. 方法一:extract 格式:extract(field from source) extract函数从日期.时间数 ...
- 如何读取Hadoop中压缩的文件
最近在处理离线数据导入HBase的问题,涉及从Hdfs中读取gz压缩文件,把思路记录下来,以作备用.具体代码如下: package org.dba.util; import java.io.Buffe ...
- js 获取时间戳的方法
(new Date()).valueOf()1541569364658(new Date()).getTime()1541569372623Number(new Date())154156938662 ...
- linux下更换pip源
pip不更换源的话,速度可能非常慢.这里将pip源更换为阿里云源. 1.修改文件~/.pip/pip.conf(没有该文件则创建一个) $ sudo vim ~/.pip/pip.conf 2.写入以 ...
- C语言感悟
还没接触C语言前,以为代码是一些单词组成的公式,和背单词一样的麻烦.枯燥无味,所以英语基础的很烂的我,对C语言没什么信心. 通过这一段时间的学习,现在对C语言的认识,和最开始时很大不一样.C语言中的代 ...
- Linux 服务器上Redis安装和配置
1.下载安装redis 在Linux服务器上,命令行执行以下命令(cd ./usr local/src 一般源码放在这里(推荐源码安装)) wget http://download.redis.io/ ...
- react-native第一次开发记录
1.安装指定版本 react-native init demo --verbose --version 0.41.0 2.更新依赖包 npm install -g npm-check-updates ...
- freertos的钩子函数
在main中添加: /** * @brief FreeRTOS 内存分配失败钩子函数 */ void vApplicationMallocFailedHook(void) { taskDISABLE_ ...
- 【记录】url 中出现特殊字符该怎么办
url中出现特殊字符+ URL 中+号表示空格 %2B 空格 URL中的空格可以用+号或者编码 %20/ 分隔目录和子目录 %2F ? 分隔实际的URL和参数 %3F % 指定特殊字符 %25 # 表 ...
- Bzoj4548 小奇的糖果(链表+树状数组)
题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...