iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot中怎么使用异步线程池实现生产环境批量数据推送
  • 558
分享到

SpringBoot中怎么使用异步线程池实现生产环境批量数据推送

2023-06-29 01:06:14 558人浏览 安东尼
摘要

今天小编给大家分享一下SpringBoot中怎么使用异步线程池实现生产环境批量数据推送的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解

今天小编给大家分享一下SpringBoot中怎么使用异步线程池实现生产环境批量数据推送的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前言

springBoot使用异步线程池:

编写线程池配置类,自定义一个线程池;

定义一个异步服务;

使用@Async注解指向定义的线程池;

这里以我工作中使用过的一个案例来做描述,我所在公司是医疗行业,敏感数据需要上报到某监管平台,所以有一个定时任务在流量较小时(一般是凌晨后)执行上报行为。但特殊时期会存在一定要在工作时间大批量上报数据的情况,且要求短时间内就要完成,此时就考虑写一个专门的异步上报接口手动执行,利用线程池上报,极大提高了速度。

编写线程池配置类

import lombok.extern.slf4j.Slf4j;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; @Configuration@EnableAsync@Slf4jpublic class ExecutorConfig {        @Bean("dataCollectionExecutor")    public Executor dataCollectionExecutor() {         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();         // 核心线程数量:当前机器的核心数        executor.setCorePoolSize(                Runtime.getRuntime().availableProcessors());         // 最大线程数        executor.setMaxPoolSize(                Runtime.getRuntime().availableProcessors() * 2);         // 队列大小        executor.setQueueCapacity(Integer.MAX_VALUE);         // 线程池中的线程名前缀        executor.setThreadNamePrefix("sjsb-");         // 拒绝策略:直接拒绝        executor.setRejectedExecutionHandler(                new ThreadPoolExecutor.AbortPolicy());         // 执行初始化        executor.initialize();         return executor;    }}

 PS:

1)、需要注意,这里一定要自己定义ThreadPoolTaskExecutor线程池,否则springboot的异步注解会执行默认线程池,存在线程阻塞导致CPU飙高及内存溢出的风险。这一点可以参考阿里开发手册,线程池定义这块明确提到了这一点;

2)、在@Bean注解中定义线程池名称,后面异步注解会用到。

编写异步服务

@Servicepublic class AsyncService {     private final Logger log = LoggerFactory.getLogger(AsyncService.class);         @Async("sendMsgExecutor")    public void sendMsg(String access_token, Consult item, Map<String, String> configMap) {        // 此处编写发送短信业务        // 1、buildConsultData();        // 2、sendMsg();    }         @Async    public void sendSubscribeMsg(String access_token, Consult item, Map<String, String> configMap) {        // 此处编写发送微信订阅消息业务        // 1、buildConsultData();        // 2、sendSubscribeMsg();    }         @Async("dataCollectionExecutor")    public void buildAndPostData(String access_token, Consult item, Map<String, String> configMap) {        // 此处编写上报业务,如拼接数据,然后执行上报。        // 1、buildConsultData();        // 2、postData();    }}

PS:
1)、以上是代码片段,个人经验认为专门定义一个异步service存放各个异步方法最佳,这样可以避免编码时一些误操作比如异步方法不是void或者是private修饰,导致@Async注解失效的情况,同时可以安排每个注解指向不同的自定义线程池更加灵活;
2)、@Async注解中的名称就是上面定义的自定义线程池名称,这样业务执行时就会从指定线程池中获取异步线程。

异步批量上报数据

@Autowiredprivate AsyncService asyncService; public void manualUploadConsultRecordsAsync(String channel, Date startTime, Date endTime) {     // 查询指定时间内的问诊记录   List<Consult> consultList = consultService       .findPaidListByChannelAndTime(channel, startTime, endTime, configMap.get("serviceId"));    if (!CollectionUtils.isEmpty(consultList)) {        log.debug("[SendWZDataService][manualUploadConsultRecordsAsync]>>>> 手动上报问诊记录, 一共[{}]条", consultList.size());        consultList.forEach((item) -> {           try {               // 异步调用,使用线程池。               asyncService.buildAndPostData(access_token, item, configMap);           } catch (Exception ex) {               log.error("[SendWZDataService][manualUploadConsultRecordsAsync]>>>> 手动上报问诊记录发生异常: ", ex);           }       });   }}

以上就是“SpringBoot中怎么使用异步线程池实现生产环境批量数据推送”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: SpringBoot中怎么使用异步线程池实现生产环境批量数据推送

本文链接: https://www.lsjlt.com/news/321908.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot使用异步线程池实现生产环境批量数据推送
    目录前言编写线程池配置类编写异步服务异步批量上报数据总结前言 SpringBoot使用异步线程池: 1、编写线程池配置类,自定义一个线程池; 2、定义一个异步服务; 3、使用@Asy...
    99+
    2024-04-02
  • SpringBoot中怎么使用异步线程池实现生产环境批量数据推送
    今天小编给大家分享一下SpringBoot中怎么使用异步线程池实现生产环境批量数据推送的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • Java中怎么利用多线程锁实现数据同步共享
    Java中怎么利用多线程锁实现数据同步共享,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。大多数应用程序要求线程互相通信来同步它们的动作。在Java程序中最简单实现同步的方法就是...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作