springbootAsyncConfig配置的处理

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: springbootAsyncConfig配置的处理

 目录

1. 首先定义一个数据的上下文的class文件

2.定义一个springboot线程池的全局方法:

3.关于一些常量的定义,直接在config里面配置即可


1. 首先定义一个数据的上下文的class文件

import java.util.Map;


public class DataCaptureContext {

   private static final ThreadLocal<Map<String, Object>> threadLocalDataCapture = new ThreadLocal();

   public static final String CURRENT_TIME = "current_time";


   public DataCaptureContext() {

   }


   public static Map getMapData() {

       Map mapData = null;

       Object obj = threadLocalDataCapture.get();

       if (obj != null) {

           mapData = (Map)obj;

       }


       return mapData;

   }


   public static void setMapData(Map<String, Object> mapData) {

       if (mapData != null) {

           threadLocalDataCapture.set(mapData);

       }


   }


   public static void removeMapData() {

       threadLocalDataCapture.remove();

   }

}

2.定义一个springboot线程池的全局方法:

2


import java.util.Map;

import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;

import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.slf4j.MDC;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.task.TaskDecorator;

import org.springframework.core.task.TaskExecutor;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;


@Configuration

public class SpringBootAsyncConfig {

   private static final Logger LOGGER = LoggerFactory.getLogger(SpringBootMvcConfig.class);

   @Value("${spring.async.thread.pool.core-pool-size}")

   private int corePoolSize = 10;

   @Value("${spring.async.thread.pool.max-pool-size}")

   private int maxPoolSize = 1000;

   @Value("${spring.async.thread.pool.queue-capacity}")

   private int queueCapacity = 1000;

   @Value("${spring.async.thread.pool.keep-alive-seconds}")

   private int keepAliveSeconds = 600;


   public SpringBootAsyncConfig() {

   }


   @Bean({"asyncThreadPool"})

   public TaskExecutor taskExecutor() {

       ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

       executor.setCorePoolSize(this.corePoolSize);

       executor.setMaxPoolSize(this.maxPoolSize);

       executor.setQueueCapacity(this.queueCapacity);

       executor.setKeepAliveSeconds(this.keepAliveSeconds);

       executor.setThreadNamePrefix("AsyncThreadPool-");

       executor.setRejectedExecutionHandler(new AbortPolicy());

       executor.setTaskDecorator(new TaskDecorator() {

           public Runnable decorate(Runnable runnable) {

               Map<String, Object> captureMapData = DataCaptureContext.getMapData();

               Map<String, String> mdcMap = MDC.getCopyOfContextMap();

               return () -> {

                   try {

                       if (mdcMap != null) {

                           MDC.setContextMap(mdcMap);

                       }


                       if (captureMapData != null) {

                           DataCaptureContext.setMapData(captureMapData);

                       }


                       runnable.run();

                   } finally {

                       MDC.clear();

                       DataCaptureContext.removeMapData();

                   }


               };

           }

       });

       executor.initialize();

       return executor;

   }


   @Bean({"springSessionRedisTaskExecutor"})

   public ThreadPoolTaskExecutor springSessionRedisTaskExecutor() {

       ThreadPoolTaskExecutor springSessionRedisTaskExecutor = new ThreadPoolTaskExecutor();

       springSessionRedisTaskExecutor.setCorePoolSize(10);

       springSessionRedisTaskExecutor.setMaxPoolSize(10);

       springSessionRedisTaskExecutor.setKeepAliveSeconds(600);

       springSessionRedisTaskExecutor.setQueueCapacity(1000);

       springSessionRedisTaskExecutor.setThreadNamePrefix("Spring session redis executor thread: ");

       springSessionRedisTaskExecutor.setRejectedExecutionHandler(new DiscardPolicy());

       springSessionRedisTaskExecutor.initialize();

       return springSessionRedisTaskExecutor;

   }


   @Bean({"bankInstructionTaskExecutor"})

   public ThreadPoolTaskExecutor bankInstructionTaskExecutor() {

       ThreadPoolTaskExecutor bankInstructionTaskExecutor = new ThreadPoolTaskExecutor();

       bankInstructionTaskExecutor.setCorePoolSize(20);

       bankInstructionTaskExecutor.setMaxPoolSize(20);

       bankInstructionTaskExecutor.setKeepAliveSeconds(1800);

       bankInstructionTaskExecutor.setQueueCapacity(20);

       bankInstructionTaskExecutor.setThreadNamePrefix("bank instruction task  executor thread: ");

       bankInstructionTaskExecutor.setRejectedExecutionHandler(new DiscardPolicy());

       bankInstructionTaskExecutor.setTaskDecorator(new TaskDecorator() {

           public Runnable decorate(Runnable runnable) {

               Map<String, Object> captureMapData = DataCaptureContext.getMapData();

               Map<String, String> mdcMap = MDC.getCopyOfContextMap();

               return () -> {

                   try {

                       if (mdcMap != null) {

                           MDC.setContextMap(mdcMap);

                       }


                       if (captureMapData != null) {

                           DataCaptureContext.setMapData(captureMapData);

                       }


                       runnable.run();

                   } finally {

                       MDC.clear();

                       DataCaptureContext.removeMapData();

                   }


               };

           }

       });

       bankInstructionTaskExecutor.initialize();

       return bankInstructionTaskExecutor;

   }


   @Bean({"instructionStatusUpdateTaskExecutor"})

   public ThreadPoolTaskExecutor instructionStatusUpdateTaskExecutor() {

       ThreadPoolTaskExecutor bankInstructionTaskExecutor = new ThreadPoolTaskExecutor();

       bankInstructionTaskExecutor.setCorePoolSize(20);

       bankInstructionTaskExecutor.setMaxPoolSize(20);

       bankInstructionTaskExecutor.setKeepAliveSeconds(1800);

       bankInstructionTaskExecutor.setQueueCapacity(20);

       bankInstructionTaskExecutor.setThreadNamePrefix("instruction status update executor thread: ");

       bankInstructionTaskExecutor.setRejectedExecutionHandler(new DiscardPolicy());

       bankInstructionTaskExecutor.setTaskDecorator(new TaskDecorator() {

           public Runnable decorate(Runnable runnable) {

               Map<String, Object> captureMapData = DataCaptureContext.getMapData();

               Map<String, String> mdcMap = MDC.getCopyOfContextMap();

               return () -> {

                   try {

                       if (mdcMap != null) {

                           MDC.setContextMap(mdcMap);

                       }


                       if (captureMapData != null) {

                           DataCaptureContext.setMapData(captureMapData);

                       }


                       runnable.run();

                   } finally {

                       MDC.clear();

                       DataCaptureContext.removeMapData();

                   }


               };

           }

       });

       bankInstructionTaskExecutor.initialize();

       return bankInstructionTaskExecutor;

   }

3.关于一些常量的定义,直接在config里面配置即可

image.gif编辑

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
11天前
|
缓存 Java 数据库连接
常见配置
常见配置
18 1
|
3月前
wslconfig 配置
wslconfig 配置
62 0
|
6月前
|
存储 算法 Linux
VDO卷的配置
在CentOS 7环境下,VDO通过重删和压缩技术节省磁盘空间,使1T磁盘可存储1.5T数据,降低成本。创建VDO步骤包括:添加64GB新硬盘,安装vdo和kmod-kvdo软件,使用`vdo create`命令创建VDO卷,如`vdo create --name=myvdo --device=/dev/sdb --vdoLogicalSize=200G`。之后,可通过`vdo list`、`vdo status`和`vdostats`检查状态和空间使用。最后,格式化VDO卷,创建挂载点并挂载,完成设置。
64 0
|
6月前
|
Ubuntu 安全 算法
UbuntuSSH配置
UbuntuSSH配置
86 0
springdatasource:全部配置
springdatasource:全部配置
74 0
|
安全 Shell 网络安全
安全配置
一、 密码配置1、 全局明文密码:控制路由器从用户模式登录到特权模式的密码,显示为明文。Router (confi g)#enable password yujieRouter (config)#Router>enablePassword:明文密码加密:输入明文密码后,通过该命令将密码加密。Router (config)#service password-encryptionRouter(config)#2、 全局密文密码:控制路由器从用户模式登录到特权模式的密码,显示为密文。Router(config)#enable secret cntc-edu.comRoute(通过设置可使用用户在本地
安全配置
|
缓存 安全 网络架构
|
运维
一个配置引发的血案
一个配置引发的血案一个配置引发的血案,记一次线上事故的复盘。 一天晚上的业务高峰期,出现了超时(数据加载不出来的情况)。 联想到前一天有发版的工作,第一功能上并没有太大的调整,此次发版内容更多的是新增的功能,用户使用量也较少,基本可以排除因功能导致的问题;第二是否中间件出现问题,因数据的交互,有80%是和redis交互,从慢日志查询中未发现有异常情况;第三隐约有人说过用于负载的服务,昨天发版关闭掉了一台。
1303 0
|
Ubuntu Java Linux