首页 > 其他分享 >创建订单使用多线程处理

创建订单使用多线程处理

时间:2024-08-29 19:03:20浏览次数:14  
标签:return corePoolSize 创建 request 订单 taskExecutor Integer 多线程 public

创建订单使用多线程异步处理,快速响应创单请求

订单创建结果放入Redis里面就结束,获取订单结果走新接口从Redis里面取



/**
 * 订单创建
 */
@Component
@ConfigurationProperties(prefix = "spring.create-order.thread-pool")
public class CreateOrder implements Serializable, InitializingBean {
    @Autowired
    private RedisQueue redisQueue;
    /**
     * 线程池
     */
    private ThreadPoolTaskExecutor taskExecutor;
    /**
     * 队列容量
     */
    private Integer queueCapacity = 100;
    /**
     * 最大线程数
     */
    private Integer maxPoolSize = 100;

    /**
     * 核心线程数
     */
    private Integer corePoolSize = 5;


    public Integer getQueueCapacity() {
        return queueCapacity;
    }

    public void setQueueCapacity(Integer queueCapacity) {
        this.queueCapacity = queueCapacity;
    }

    public Integer getMaxPoolSize() {
        return maxPoolSize;
    }

    public void setMaxPoolSize(Integer maxPoolSize) {
        this.maxPoolSize = maxPoolSize;
    }

    public Integer getCorePoolSize() {
        return corePoolSize;
    }

    public void setCorePoolSize(Integer corePoolSize) {
        this.corePoolSize = corePoolSize;
    }

    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private MerchantGoodsMappingRepository merchantGoodsMappingRepository;


    @Override
    public void afterPropertiesSet() throws Exception {
        taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(corePoolSize); //核心线程数
        taskExecutor.setMaxPoolSize(maxPoolSize); //最大线程数
        taskExecutor.setThreadNamePrefix("createOrder"); //线程名称
        taskExecutor.setQueueCapacity(queueCapacity);  //队列长度
        taskExecutor.initialize();
        logger.error("初始化线程池corePoolSize=" + corePoolSize + ":maxPoolSize" + maxPoolSize + ":queueCapacity" + queueCapacity);
        taskExecutor.setRejectedExecutionHandler((r, executor) -> {

        });
    }

    /**
     * 添加任务
     *
     * @return
     */
    public Result addTask(PreOrderBusinessOrderRequest request,
                          Function<CreateOrderReq, Result> doCreateOrder) {
        //不要重复排队
        //生成请求时间戳
        long currentNonoTime = System.nanoTime();
        Result result = Result.error(TxErrorCode.PENDING.getMsg());
        try {
            taskExecutor.execute(() -> {
                // 调用下单接口
                MerchantGoodsMapping mapping = merchantGoodsMappingRepository.getByGoodsType(request.getMerchantGoodsType());
                Result<Object> createOrderResult = null;
                String idStr = "" + currentNonoTime + SPLIT + request.getUserId();
                try {
                    createOrderResult = doCreateOrder.apply(new CreateOrderReq(request, mapping));
                } catch (Exception e) {
                    logger.error("订单创建异常:doCreateOrder", e);
                }
                redisQueue.putCreateOrderResult(createOrderResult, request.getGoodsNo(), idStr);
            });
        } catch (RejectedExecutionException e) {
            logger.error("入队失败--队列已满:RejectedExecutionException", e);
            // 超过容量,直接拒绝
            Result error = Result.error(TxErrorCode.REJECT.getMsg());
            error.setCode(TxErrorCode.REJECT.getCode());
            return error;
        }
        result.setCode(TxErrorCode.PENDING.getCode());
        QueuePositionInfo queuePositionInfo = new QueuePositionInfo(0, currentNonoTime);
        result.setResponse(queuePositionInfo);
        return result;
    }

    /**
     * 订单创建请求
     */
    public static class CreateOrderReq {
        PreOrderBusinessOrderRequest request;
        MerchantGoodsMapping mapping;

        public PreOrderBusinessOrderRequest getRequest() {
            return request;
        }

        public MerchantGoodsMapping getMapping() {
            return mapping;
        }

        public CreateOrderReq(PreOrderBusinessOrderRequest request, MerchantGoodsMapping mapping) {
            this.request = request;
            this.mapping = mapping;
        }
    }
}


标签:return,corePoolSize,创建,request,订单,taskExecutor,Integer,多线程,public
From: https://www.cnblogs.com/gtnotgod/p/18387424

相关文章

  • 用python创建文件夹并授予权限(windows和linux通用)
    因为是对路径进行操作,所以使用os模块importos创建文件夹,使用os.mkdir#directory_path='要创建路径的完整路径'new_directory='D:\\test'#以windows为例,在D盘创建一个test的文件夹os.mkdir(new_directory)给文件夹授权,使用os.chmod#这里给刚创建的文件夹777的......
  • 解决创建VUE项目的时候执行npm install一直是loading状态
    创建VUE项目的时候执行命令npmcreatevue@latestnpminstall然后一直是处于loading状态配置npm代理,切换至国内镜像源先查看当前的镜像源:npmconfiggetregistry直接访问NPM官方仓库(registry.npmjs.org)可能速度较慢甚至不稳定。这时,切换至国内高速npm镜像源。​​​......
  • 探讨 AI 驱动的 PlantUML:高效创建专业的 UML活动图
    承接前文关于如何运用AI工具生成时序图的内容【1】,今天我们继续探讨AI驱动的PlantUML:高效创建专业的UML活动图。【1】:https://juejin.cn/post/7407637717206728755【2】:案例参照开源项目ruoyi-cloud:https://gitee.com/y_project/RuoYi-Cloud【3】:PlantUML活动图语法......
  • powershell 创建winform窗体 T2 : 自动配置相机网卡参数
    <#脚本功能说明:选择要配置的相机网卡,点击配置按键,自动配置参数#2024.08.29#>#获取管理员权限if(-NOT([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator......
  • Vs Code 创建 .Net 项目
     VsCode打开终端窗口 在“终端”中输入以下命令创建项目:dotnetnewconsole--frameworknet8.0--use-program-main 终端默认是不可输入的在 launch.json中将 console 设置从 internalConsole 更改为 integratedTerminal:终端就可以输入了  在“终端”中......
  • Oracle同一台服务器创建多个数据库
    有时候我们需要再同一台机器上创建多个数据库服务(不是单纯的数据库实例),每一个数据库可以有单独的服务运行,只是在一个机器环境而已。可以在不同的端口上监听,也可以在相同端口监听创建多个数据库步骤安装完Oracle数据库后,会自动安装很多工具,这里我们使用DatabaseConfiguration......
  • 如何创建下拉式菜单
    文章目录1.概念介绍2.使用方法2.1DropdownMenu2.1DropdownMenuEntry3.示例代码4.内容总结我们在上一章回中介绍了"如何禁止页面跟随手机自动旋转"相关的内容,本章回中将介绍DropdownMenu组件.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在本章回中......
  • Java多线程
    目录1.进程和线程2.并行与并发3.多线程的实现4.线程的生命周期5.wait和sleep方法的区别6.start和run方法的区别1.进程和线程进程(Process):可以看作程序的一次执行过程,是系统运行程序的基本单位特点:独立性:进程是系统进行资源分配和调度的一个独立单元,各个进程之间互不......
  • 【CUDA编程笔记】如何使用CUDA统一内存来优化多进程多线程程序的性能?
    如何使用CUDA统一内存来优化多进程多线程程序的性能?要使用CUDA统一内存优化多进程多线程程序的性能,可以采取以下步骤。理解统一内存统一内存是CUDA编程模型的一个组件,它定义了一个所有处理器都可访问的单一连贯内存映像,允许数据在CPU和GPU之间透明迁移,无需显式复制。使......
  • 系统编程-多线程1
    多线程1目录多线程1引入认识线程1、线程的概念2、线程的优缺点3、进程和线程的区别和联系4、什么时候选进程,什么时候选线程?线程相关函数1、创建线程2、线程的退出函数3、阻塞等待线程退出并回收资源4、获取自身线程号的函数5、主动取消一个线程6、注册线程退出......